Git:相当于` - git bisect`和`git blame`的`--full-history`

Ram*_*hum 8 git version-control git-bisect git-log git-blame

我已经使用Git大约7年了.几天前,我发现了一个让我感到惊讶的行为.我找到了git log,git blamegit bisect展示了这种奇怪的行为.朋友让我知道那个--full-history标志git log解决了我的问题.我想知道,对于我自己的教育,是否有相应的修复git blamegit bisect.

请使用此repo随意查看问题:https://dl.dropboxusercontent.com/u/1927707/problematic_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
Run Code Online (Sandbox Code Playgroud)

在第一次提交时,coffee添加了文件.在提交中3068c7d,我在coffee文件中添加了一行"sugar" .但后来我把这个分支合并到了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
Run Code Online (Sandbox Code Playgroud)

而已.git log既没有显示添加糖的原始提交,也没有显示删除它的合并.缺少两个非常相关的提交.

我被这个问题困扰了大约一个小时,因为它发生在一个巨大的企业仓库中,提交手动很难找到.

我也尝试使用git bisectgit blame确定两个提交,但这两个工具都忽略了两个提交.git bisect向我指出错误后提交,我做完所有的git bisect badgit 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                                    
Run Code Online (Sandbox Code Playgroud)

这让我高兴,因为它显示了两个相关的提交,一个添加糖和合并删除它.所以我的问题解决了.但我真的希望我能知道如何制作git bisectgit blame表现.有谁碰巧知道吗?

tor*_*rek 1

有趣的。由于线路不在那里,git blame开始时毫无帮助。作为注释的文档git blame

该报告不会告诉您有关已删除或替换的线路的任何信息;您需要使用 git diff 等工具或下一段中简要提到的“pickaxe”界面。

在这种情况下,我们可能会跑去git log -SSugar查找它进入的位置:

$ git log --pretty=oneline -SSugar
3068c7d2548f1798b6840f73b13a649937339f28 Adding sugar to coffee
Run Code Online (Sandbox Code Playgroud)

git blame不会立即帮助我们找到它出去的地方。(正如您刚刚发现的那样,如果我们想在提及文件时找到该行,我们可能需要--full-history,因为添加路径来限制提交git log将考虑,还可以通过修剪每个提交的树以仅包含提到的内容来简化历史记录文件,然后使用它TREESAME代码。)

从已知良好的版本开始,我们现在可以尝试--reverse[编辑:我注意到3068c7d2548f1798b6840f73b13a649937339f28==master并在这里实际使用master,可能应该直接使用SHA-1]:

$ git blame --reverse master..HEAD coffee
^3068c7d (Ram Rachum 2016-04-19 16:02:27 +0300 1) Sugar
Run Code Online (Sandbox Code Playgroud)

这似乎意味着这3068c7d是该行存在的最后一个版本,因此必须在沿着该特定路径的部分或所有子项中删除它,这是正确的:

$ 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
Run Code Online (Sandbox Code Playgroud)

只有一个提交是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
Run Code Online (Sandbox Code Playgroud)

(我们需要-m让 git 来将合并与父项进行比较)。这确实找到了它,以一种稍微迂回的方式。


(与此同时,似乎没有解决二分问题的方法。好吧,除了“避免邪恶合并”......)