回滚、还原、重置和变基

  • 关键词:Git For Teams – 读书笔记

Part2 在工作流中使用命令

寻找并修复bug

使用现有代码来定位问题,和使用代码历史记录来定位问题。

  • 使用stash保存当前工作的进度,以签出另一个分支
  • 使用blame寻找文件的历史版本
  • 使用bisect寻找最近一个正确的提交

1 使用stash进行紧急的bug修复

可以通过stash(保存进度)命令完成,这个命令允许你临时搁置你进行了一半、以后某个时候想要继续的工作。

stash不能被共享,它只存在于你的本地仓库中。

git stash save()

这个命令只会保存Git已知的文件的进度。如果你有尚未提交过的新文件,这些文件将不会被加入stash,而其他更改会进入一个stash,使你无法在清理完所有未跟踪的更改前切换到一个不同的分支。为了加入未跟踪文件,请添加–include-untracked参数:

git stash save –include-untracked

或者你想丢弃这些文件,而不是将它们放到你的stash中:

git stash save

git clean -d

git stash list(列出一列你保存的stash) 返回的结果:stash@{0}: WIP on master:…

git show stash@{0}

Git允许储存多步stash:

git stash save –include-untracked “…”

再次检查stash列表,将会看到之前的stash和新的stash,新的stash将会出现在列表顶端。

通过apply应用:

git stash list

git stash apply stash@{0}

想要移除某个stash,可以使用drop命令来删除它:

git stash drop stash@{0}

2 比较历史记录的研究

git log HEAD^(最近一次提交之外的所有工作)

git log HEAD~3(最近三次提交之外的所有工作)

git log since_last_merge_to..what’s_been_added_here –oneline

git log working..broken(查看包含在正确分支中而不是错误分支中的提交)

git difftool working..broken(查看包含在错误分支中而非正确分支中的代码)

也可以比较远程分支:

git fetch(获取最新版本)

git log working..remote_nickname/broken

git log -S foo(带-S参数的log来查找提交说明,或提交的更改中被应用或移除的特定文本字符串)

3 使用blame调查文件历史版本

查看谁之前修改过一份文件将会十分有用,blame命令允许你逐行查看一份文件,显示每行的最近更改时间、作者和包含更改的提交。

git blame README.md

提交的散列ID-作者名-日期-行号-这个文件中特定行的内容

^开头,说明从第一次提交后没有再被修改过。

使用log、diff和show的原因 命令
显示某个特定提交的元数据 log commit
显示某个特定提交中更改的代码 show commit
显示某个特定提交后更改的代码 diff commit

git show

git log –patch

patch参数向你展示每个提交之间的更改,diff命令向你展示引用提交和工作目录中的文件之间差异的。

4 使用bisect重演历史

有时有问题的代码并没有在错误消息中留下足够的线索来使用log、show和diff,这个时候就需要bisect了。

bisect对以往的提交执行二分查找,来帮助你找到代码从一个已知正确的状态到一个已知错误的状态之间的提交。

git bisect start(标记正确和错误的提交以进行二分查找)

git bisect good

git bisect bad

reset命令可以在bisect过程的任何节点上用于中止查找并回到分支上最近一个提交:

git bisect reset

git bisect visualize(展示bisect过程的最新状态)

5 小结

stash允许你搁置你当前的工作,这样你就可以签出另一个分支了。

blame允许你查找一份文件的逐行历史记录。

bisect允许你有条理地查找历史记录,来寻找出错的地方。