首页 > 代码库 > git 学习笔记

git 学习笔记

全部参考于廖雪峰的 git 教程.

 

下决心掌握 git 来自一个现实的需求, 项目中用到的核心 api 只能在内网环境使用, 在笔记本开发, 在内网机器上部署, 然鹅现在还无法 tdd, 所以是边运行边改, 改完之后, 内网和笔记本的版本已经有了巨大差别,  几十个文件都复制粘贴么?

不会 tdd 的 python 程序员, 只能叫写脚本的, 算不上工程师. 目前暂时使用 git 扛一阵, 解决代码同步的问题.

 

1. git 是什么? 

git, 分布式版本控制系统, 结构上可以分为两部分, 工作区和版本库, 工作区就是当前文件夹, 版本库就是 .git 中的内容

版本库又可以分为暂存区 stage 和分支, git 默认创建 master 分支, 当然也可以手动创建其他分支.

git 追踪的是文件的修改, 分为三种情况: 创建文件, 删除文件, 修改文件内容.

创建一个新文件, git add file 是将文件添加到版本库, 并将文件当前的内容添加到暂存区.

修改一个文件, git add file 是将修改的内容添加到暂存区.

删除一个文件, 需要 git rm file 从版本库中删除文件.

暂存区的修改, 通过 git commit 提交到分支. git commit -m "some comment" 可以在 commit 同时增加一个 comment

每一次 commit 都有一个唯一的 commit_id

HEAD 指针指向当前分支, 可以是 master, 可以是 dev, 当前分支指向当前版本, 简单讲, HEAD 指向当前版本

HEAD^ 指向前一个版本, HEAD^^ 指向前两个版本, HEAD~100 指向前100个版本

技术分享

 

 2. git 版本回退, 暂存区操作, 撤销工作区文件修改, 删除文件

git log 可以查看 commit 历史, git log --pretty=oneline 可以查看 log 的缩略版本

128c201c260dc853bb76c6a7c2a9f749e56b0b18 git tracks changes of files
b96e29ff7dfc8b71e3bda9fe085d1155abdd7dd6 git tracks changes
acd53b603218dca7b1b03f313d70a2e3616a515b understand how stage works
65e4280bea128ae4911690320d5eaf243be0c40c append GPL
3629ce74dfabd74eca3b04dbd62c67a3578031f8 add distributed
32bd0adb6222c1603401208f688141fb3ea2b87f wrote a readme file

git reset --hard HEAD^ 退回上一个版本

git reset --hard commit_id (前5-6位) 退回到 commit_id 所在的版本

在版本切换时, git log 的输出也会跟随变化, 简单说, 如果退回到上一个版本, 那么当前版本的 commit_id 就不会在 git log 中显示

这时候需要 git reflog, 可以查看版本切换的记录, 也就可以再次回到开始切换的版本

 

git add file  可以将 file 的修改添加到暂存区 stage, 但是, 如果我想删除添加到暂存区的修改, 用什么命令?

git reset HEAD file  把暂存区的修改退回到工作区

但是, 文件已经修改过了, 如果想把工作区的文件恢复到此次修改开始之前的状态, 简单讲就是最近一个 git add 或 git commit 之后的状态

git checkout -- file  该命令会用版本库中的记录替换当前文件

 

3. git 分支管理

前面说到, 可以有 master 分支, 可以有 dev 分支, 如果多人协作, 每个人也可以有自己的分支.

原则上, master 分支只用于发布版本, 开发在 dev 分支上做, 如果做新功能, 可以在 dev 上另开分支, 开发完成后合并到 dev 分支.

最后才合并到 master 分支, 用于发布.

 

git branch dev  创建 dev 分支

git checkout dev  切换到 dev 分支

或 git checkout -b dev 创建并切换到 dev 分支

git branch 可以查看分支情况

 

现在 dev 分支上功能开发完毕, 想要合并到 master 分支

git checkout master  切换到 master 分支

git merge dev  合并 dev 分支

git 尽量使用 Fast forward 模式合并分支, 对于存在冲突的文件, git 用 <<<<<<<<< 和 >>>>>>>>>> 标记冲突

git branch -d dev  用于删除 dev 分支

 

有一个问题, 分支一旦删除, 分支的信息也就丢失, no-ff 选项可以强制不使用 Fast forward 模式, 并且在每次 merge 之后进行一次 commit

git merge --no-ff -m "some comment" dev  合并 dev 的同时进行一次 commit

 

如果 master 版本中出现了 bug, 需要进行紧急修复, 目前在 dev 分支开发, 已经 git add 但是还无法 git commit

想保存当前暂存区的内容, 等 bug 修复之后再恢复

git stash  保存工作现场

git stash list  查看保存的工作现场列表

git stash pop  弹出最后存储的工作现场

 

未 merge 的分支, 可以使用 git branch -D feature-vulcan 删除

 

4. 标签管理

上面讲到 master 用于发布版本, 但是 commit_id 不能用来发布, 版本应该是 v1.0

git tag v1.0  打一个新标签v1.0

git tag  查看所有标签

git tag v0.9 commit_id  对特定的 commit_id 打标签

标签本身按字母排序, 不按时间排序

git show v0.9  查看标签信息

git tag -a v0.8 -m "version 0.8 released" commit_id  创建带有说明的标签

git tag -d v0.8  删除标签

 

5. 远程仓库

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改

git push -u origin dev 用于推送 dev 分支的所有内容

 

默认情况下, git clone 只有 master 分支

git checkout -b dev origin/dev  创建远程 origin 的 dev 分支到本地

之后再执行 git commit 就会把修改同步到远程 dev 分支

如果遇到 commit 失败的情况, git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联

git pull 用于从远程抓取分支, 如果有冲突就先解决冲突.

 

git 学习笔记