我已经大量使用Git了7年了。几天前我发现了一种令我惊讶的行为。我发现git log,git blame和git bisect展示了这种奇怪的行为。A friend让我知道解决问题的--full-history标志到git log。我想知道,对于我自己的教育,是否有一个与git blame和git bisect相当的解决方案。
可以自由地看到这个回购:repo.7z的问题。
这是它的日志:
$ git log --graph
* commit b7a8d7aa001d06eb7491ab5fb447a8dd3aa421a8
| Author: Ram Rachum <ram@rachum.com>
| Date: Tue Apr 19 17:45:01 2016 +0300
|
| adding more to some-file
|
* commit 0aa833916e908ea93902a6c4c227f9a884a1bcef
|\ Merge: 2413945 3068c7d
| | Author: Ram Rachum <ram@rachum.com>
| | Date: Tue Apr 19 17:44:31 2016 +0300
| |
| | Merge branch 'master' into development
| |
| * commit 3068c7d2548f1798b6840f73b13a649937339f28
| | Author: Ram Rachum <ram@rachum.com>
| | Date: Tue Apr 19 16:02:27 2016 +0300
| |
| | Adding sugar to coffee
| |
* | commit 24139451ab954b1f0a9ef616775a3dba0ac81669
|/ Author: Ram Rachum <ram@rachum.com>
| Date: Tue Apr 19 16:01:28 2016 +0300
|
| Creating some-file
|
* commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661
Author: Ram Rachum <ram@rachum.com>
Date: Tue Apr 19 16:00:47 2016 +0300
Create coffee在第一次提交时,添加了文件coffee。在提交3068c7d中,我向coffee文件添加了一行“糖”。但是后来我将这个分支合并到development分支中,在合并过程中,犯了一个错误,删除了“砂糖”行,使coffee为空。然后,又添加了另一个提交b7a8d7a,进行了不相关的更改,以便进行良好的度量。
现在我看着我的咖啡,发现里面没有糖。我清楚地记得在咖啡里加了糖。我运行git log coffee,并获得以下输出:
$ git log coffee
commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661
Author: Ram Rachum <ram@rachum.com>
Date: Tue Apr 19 16:00:47 2016 +0300
Create coffee就这样。git log既没有显示添加糖的原始提交,也没有显示删除糖的合并。缺少的两个非常相关的提交。
这个问题让我沮丧了大约一个小时,因为它发生在一个大型企业回购中,在那里,手动查找提交要困难得多。
我还尝试使用git bisect和git blame来确定这两个提交,但这两个工具都忽略了这两个提交。git bisect在完成所有git bisect bad和git bisect good操作后,向我指出了错误的提交。
然后,正如我在一开始所说的,一个朋友把我指向了--full-history旗帜:
$ git log --full-history --graph coffee
* commit 0aa833916e908ea93902a6c4c227f9a884a1bcef
|\ Merge: cf02fbb 3068c7d
| | Author: Ram Rachum <ram@rachum.com>
| | Date: Tue Apr 19 17:44:31 2016 +0300
| |
| | Merge branch 'master' into development
| |
| * commit 3068c7d2548f1798b6840f73b13a649937339f28
|/ Author: Ram Rachum <ram@rachum.com>
| Date: Tue Apr 19 16:02:27 2016 +0300
|
| Adding sugar to coffee
|
* commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661
Author: Ram Rachum <ram@rachum.com>
Date: Tue Apr 19 16:00:47 2016 +0300
Create coffee 这让我感到高兴,因为它显示了两个相关的提交,一个添加糖和合并删除它。所以我的问题解决了。但我真的希望我能知道如何让git bisect 和 git blame 也能表现出来。有谁知道呢?
发布于 2016-04-20 12:17:14
有意思的。由于没有这一行,所以git blame一开始非常没有帮助。正如git blame的文档所指出的:
报告没有告诉您任何已被删除或替换的行;您需要使用一个工具,如git或下一段中简要提到的"pickaxe“接口。
在这种情况下,我们可以运行git log -SSugar来查找它进入的位置:
$ git log --pretty=oneline -SSugar
3068c7d2548f1798b6840f73b13a649937339f28 Adding sugar to coffee但git blame不会立即帮助我们找到它的去向。(正如您刚才发现的,如果我们想在提到文件时找到这一行,我们可能需要--full-history,因为添加路径来限制提交git log会考虑,还会通过修剪每个提交的树来简化历史,只包含提到的文件,然后使用TREESAME代码。)
从已知的好的rev开始,我们现在可以尝试--reverse 编辑:我注意到了3068c7d2548f1798b6840f73b13a649937339f28 == master并在这里实际使用了master,可能应该直接使用SHA-1。
$ git blame --reverse master..HEAD coffee
^3068c7d (Ram Rachum 2016-04-19 16:02:27 +0300 1) Sugar这似乎意味着3068c7d是该行存在的最后一个rev,因此必须在这条特定路径上的部分或所有子程序中删除它,这是正确的:
$ git log --oneline --graph --decorate --all
* b7a8d7a (HEAD -> development) adding more to some-file
* 0aa8339 Merge branch 'master' into development
|\
| * 3068c7d (master) Adding sugar to coffee
* | 2413945 Creating some-file
|/
* cf02fbb Create coffee这里只有一个提交是3068c7d的子提交,即0aa8339,因此:
$ git show -m 0aa8339
commit 0aa833916e908ea93902a6c4c227f9a884a1bcef (from 3068c7d2548f1798b6840f73b1
Merge: 2413945 3068c7d
Author: Ram Rachum <ram@rachum.com>
Date: Tue Apr 19 17:44:31 2016 +0300
Merge branch 'master' into development
diff --git a/coffee b/coffee
index 4d0f160..e69de29 100644
--- a/coffee
+++ b/coffee
@@ -1 +0,0 @@
-Sugar
diff --git a/some-file b/some-file
new file mode 100644
index 0000000..e69de29(我们需要-m来获取git来比较合并与双亲的关系)。这确实可以找到,有点迂回的方式。
(同时,似乎没有解决这一问题的办法。好吧,除了“避免邪恶的合并”.)
https://stackoverflow.com/questions/36740231
复制相似问题