====================================以下内容拷贝自第四期一生一芯的讲义
#查看存档信息
使用
git log
查看目前为止所有的存档.
使用
git status
可以得知, 与当前存档相比, 哪些文件发生了变化.
#存档
你可以像以前一样编写代码. 等到你的开发取得了一些阶段性成果, 你应该马上进行"存档".
首先你需要使用 git status
查看是否有新的文件或已修改的文件未被跟踪, 若有, 则使用 git add
将文件加入跟踪列表, 例如
git add file.c
会将 file.c
加入跟踪列表. 如果需要一次添加所有未被跟踪的文件, 你可以使用
git add -A
但这样可能会跟踪了一些不必要的文件, 例如编译产生的 .o
文件, 和最后产生的可执行文件. 事实上, 我们只需要跟踪代码源文件即可. 为了让 git
在添加跟踪文件之前作筛选, 你可以编辑 .gitignore
文件(你可以使用 ls -a
命令看到它), 在里面给出需要被 git
忽略的文件和文件类型.
把新文件加入跟踪列表后, 使用 git status
再次确认. 确认无误后就可以存档了, 使用
git commit
提交工程当前的状态. 执行这条命令后, 将会弹出文本编辑器, 你需要在第一行中添加本次存档的注释, 例如"fix bug for xxx". 你应该尽可能添加详细的注释, 将来你需要根据这些注释来区别不同的存档. 编写好注释之后, 保存并退出文本编辑器, 存档成功. 你可以使用 git log
查看存档记录, 你应该能看到刚才编辑的注释.
#读档
如果你遇到了上文提到的让你悲痛欲绝的情况, 现在你可以使用光玉来救你一命了. 首先使用 git log
来查看已有的存档, 并决定你需要回到哪个过去. 每一份存档都有一个hash code, 例如 b87c512d10348fd8f1e32ddea8ec95f87215aaa5
, 你需要通过hash code来告诉 git
你希望读哪一个档. 使用以下命令进行读档:
git reset --hard b87c
其中 b87c
是上文hash code的前缀: 你不需要输入整个hash code. 这时你再看看你的代码, 你已经成功地回到了过去!
但事实上, 在使用 git reset
的hard模式之前, 你需要再三确认选择的存档是不是你的真正目标. 如果你读入了一个较早的存档, 那么比这个存档新的所有记录都将被删除! 这意为着你不能随便回到"将来"了. (因此,不要随便用reset --hard)
#第三视点
当然还是有办法来避免上文提到的副作用的, 这就是 git
的分支功能. 使用命令
git branch
查看所有分支. 其中 master
是主分支, 使用 git init
初始化之后会自动建立主分支.
读档的时候使用以下命令
git checkout b87c (哇!还能这样用?太神奇了!)
而不是 git reset
. 这时你将处于一个虚构的分支中, 你可以
- 查看
b87c
存档的内容 (能看内容) - 使用以下命令切换到其它分支
git checkout 分支名
- 对代码的内容进行修改, 但你不能使用
git commit
进行存档, 你需要使用
git checkout -B 分支名
把修改结果保存到一个新的分支中, 如果分支已存在, 其内容将会被覆盖
不同的分支之间不会相互干扰, 这也给项目的分布式开发带来了便利. 有了分支功能, 你就可以像第三视点那样在一个世界的不同时间(一个分支的多个存档), 或者是多个平行世界(多个分支)之间来回穿梭了.
#更多功能
以上介绍的是 git
的一些基本功能, git
还提供很多强大的功能, 例如使用 git diff
比较同一个文件在不同版本中的区别, 使用 git bisect
进行二分搜索来寻找一个bug在哪次提交中被引入(TODO:以后可以好好了解下这玩意儿)...
其它功能的使用请参考 git help
, man git
, 或者在网上搜索相关资料.
=====================================感谢一生一芯认真设计的讲义!