通常在调查问题时,我将介绍调试语句(与解决方案隔离,在他们自己的提交中),然后一旦我有解决方案,我将删除所有这些调试语句。然而,有时候,在查看差异或责备时,不清楚在调试中引入了哪些更改以及哪些更改是作为解决方案的一部分。在这种情况下,我想确定,对于任何特定的提交或提交集,哪些行(如果有的话)在该提交中被更改而以后不再更改。这样我可以确保所有调试更改都已正确还原。
通常,我只是简单地通过git恢复提交,但特别是当花费很长时间在解决方案上,在修复和调试之间交替时,可能会有代码更改提交删除调试中引入的行,使git revert
变得非常重要。
我希望在存储库中的任何文件中看到任何行,这些行将使用git blame
中的一组特定提交进行标记。也就是说,任何由给定提交触及但未改变的行。目前,我的工作流程如下:
git log
#record short hashes of the commits i'm interested in
对于每个哈希:
git show --name-only $hash
#record files affected
对于每个文件:
git blame -- "$file" | grep $hash
我认为git diff HEAD [Commit before first debug change]
应该这样做。
您可以在文本编辑器中查看结果并搜索调试更改。如果您发现任何尚未删除的内容。
我用xargs
和grep
构建了一个相当复杂的命令,并将git
命令串在一起,但这看起来有点矫枉过正,我希望有一种方法可以做到这一点,主要是委托给git。
这接受缩写哈希列表作为其参数:
RE="`echo "$*" | sed 's: :\\|:g'`"
git show --pretty=format: --name-only "$@"
| sed '/^$/d'
| sort
| uniq
| xargs -l git blame --
| grep "$RE"
但是,如果有任何受影响的行,它将不会告诉您它们来自哪个文件。 如果给定完整哈希,它也找不到受影响的行:需要提供缩写。