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

时间:2016-04-20 09:58:26

标签: git version-control git-log git-bisect git-blame

我已经使用Git大约7年了。几天前,我发现了一个让我感到惊讶的行为。我发现git loggit blamegit bisect表现出这种奇怪的行为。 A friend让我知道解决我问题的--full-history git log旗帜。我想知道,对于我自己的教育,是否有git blamegit bisect的等效修正。

欢迎使用此代表回复查看问题: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

在第一次提交时,添加了文件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 bisectgit blame来确定两个提交,但这两个工具都忽略了这两个提交。在完成所有git bisectgit 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 bisectgit blame也行事。有没有人碰巧知道?

1 个答案:

答案 0 :(得分:0)

有趣。由于该行不存在,git blame开始时非常无益。作为git blame笔记的文档:

  

报告没有告诉你有关线路的任何信息     删除或替换;你需要使用git diff等工具     “pickaxe”界面在以下段落中简要提及。

在这种情况下,我们可能会运行git log -SSugar来查找它的位置:

$ git log --pretty=oneline -SSugar
3068c7d2548f1798b6840f73b13a649937339f28 Adding sugar to coffee

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

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

master

这似乎意味着$ git blame --reverse master..HEAD coffee ^3068c7d (Ram Rachum 2016-04-19 16:02:27 +0300 1) Sugar 是该行存在的最后一个转义,因此必须在此特定路径中的某些或所有子项中删除它,这是真的:

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 的孩子,即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 来获取git来比较两个父母的合并)。而这确实以一种略微迂回的方式找到了它。

(与此同时,似乎无法解决二等分问题。嗯,除了“避免邪恶合并”......)