Git详解之六:Git工具
?图 6-1. 范围选择的提交历史实例
?
你想要查看你的试验分支上哪些没有被提交到主分支,那么你就可以使用?master..experiment
?来让 Git 显示这些提交的日志——这句话的意思是“所有可从experiment分支中获得而不能从master分支中获得的提交”。为了使例子简单明了,我使用了图标中提交对象的字母来代替真实日志的输出,所以会显示:
?现在你想切换分支,但是你还不想提交你正在进行中的工作;所以你储藏这些变更。为了往堆栈推送一个新的储藏,只要运行?
git stash
:?你可以看到 Git 重新修改了你所储藏的那些当时尚未提交的文件。在这个案例里,你尝试应用储藏的工作目录是干净的,并且属于同一分支;但是一个干净的工作目录和应用到相同 的分支上并不是应用储藏的必要条件。你可以在其中一个分支上保留一份储藏,随后切换到另外一个分支,再重新应用这些变更。在工作目录里包含已修改和未提交 的文件时,你也可以应用储藏——Git 会给出归并冲突如果有任何变更无法干净地被应用。
?
对文件的变更被重新应用,但是被暂存的文件没有重新被暂存。想那样的话,你必须在运行?
git stash apply
?命令时带上一个?--index
?的选项来告诉命令重新应用被暂存的变更。如果你是这么做的,你应该已经回到你原来的位置:?apply 选项只尝试应用储藏的工作——储藏的内容仍然在栈上。要移除它,你可以运行?
git stash drop
,加上你希望移除的储藏的名字:?这是一个很棒的捷径来恢复储藏的工作然后在新的分支上继续当时的工作。
?
6.4? 重写历史
?
很多时候,在 Git 上工作的时候,你也许会由于某种原因想要修订你的提交历史。Git 的一个卓越之处就是它允许你在最后可能的时刻再作决定。你可以在你即将提交暂存区时决定什么文件归入哪一次提交,你可以使用 stash 命令来决定你暂时搁置的工作,你可以重写已经发生的提交以使它们看起来是另外一种样子。这个包括改变提交的次序、改变说明或者修改提交中包含的文件,将提 交归并、拆分或者完全删除——这一切在你尚未开始将你的工作和别人共享前都是可以的。
?
在这一节中,你会学到如何完成这些很有用的任务以使你的提交历史在你将其共享给别人之前变成你想要的样子。
?
改变最近一次提交
?
改变最近一次提交也许是最常见的重写历史的行为。对于你的最近一次提交,你经常想做两件基本事情:改变提交说明,或者改变你刚刚通过增加,改变,删除而记录的快照。
?
如果你只想修改最近一次提交说明,这非常简单:
?请注意这里的倒序。交互式的rebase给了你一个即将运行的脚本。它会从你在命令行上指明的提交开始(
HEAD~3
)然后自上至下重播每次提交里引入的变更。它将最早的列在顶上而不是最近的,因为这是第一个需要重播的。?
你需要修改这个脚本来让它停留在你想修改的变更上。要做到这一点,你只要将你想修改的每一次提交前面的pick改为edit。例如,只想修改第三次提交说明的话,你就像下面这样修改文件:
?这个会遍历并重写所有提交使之拥有你的新地址。因为提交里包含了它们的父提交的SHA-1值,这个命令会修改你的历史中的所有提交,而不仅仅是包含了匹配的电子邮件地址的那些。
?
6.5? 使用 Git 调试
?
Git 同样提供了一些工具来帮助你调试项目中遇到的问题。由于 Git 被设计为可应用于几乎任何类型的项目,这些工具是通用型,但是在遇到问题时可以经常帮助你查找缺陷所在。
?
文件标注
?
如果你在追踪代码中的缺陷想知道这是什么时候为什么被引进来的,文件标注会是你的最佳工具。它会显示文件中对每一行进行修改的最近一次提交。因此,如果你发现自己代码中的一个方法存在缺陷,你可以用
git blame
来标注文件,查看那个方法的每一行分别是由谁在哪一天修改的。下面这个例子使用了-L
选项来限制输出范围在第12至22行:?首先你注意到有一个
.gitmodules
文件。这是一个配置文件,保存了项目 URL 和你拉取到的本地子目录?你归并来的仅仅上是一个指向你的子模块的指针;但是它并不更新你子模块目录里的代码,所以看起来你的工作目录处于一个临时状态:
?你将不得不将它移走或者删除,这样的话当你切换回去的时候必须重新克隆它——你可能会丢失你未推送的本地的变更或分支。
?
最后一个需要引起注意的是关于从子目录切换到子模块的。如果你已经跟踪了你项目中的一些文件但是想把它们移到子模块去,你必须非常小心,否则Git会生你的气。假设你的项目中有一个子目录里放了 rack 的文件,然后你想将它转换为子模块。如果你删除子目录然后运行
submodule add
,Git会向你大吼:$ git diff-tree -p rack_remote/master?6.8? 总结
?
你已经看到了很多高级的工具,允许你更加精确地操控你的提交和暂存区。当你碰到问题时,你应该可以很容易找出是哪个分支什么时候由谁引入了它们。如 果你想在项目中使用子项目,你也已经学会了一些方法来满足这些需求。到此,你应该能够完成日常里你需要用命令行在 Git 下做的大部分事情,并且感到比较顺手。
转自:http://blog.jobbole.com/26112/