8

私は約 7 年間、Git を多用しています。数日前、私は驚くべき振る舞いを見つけました。を見つけgit log、この奇妙な動作を示しgit blameました。友人が私の問題を解決したフラグについて教えてくれました。私自身の教育のために、 と の同等の修正があるかどうかを知りたいです。git bisect--full-historygit loggit 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が追加されました。commit3068c7dで、「sugar」という行をcoffeeファイルに追加しました。しかし、その後、このブランチをdevelopmentブランチにマージしましたが、そのマージでミスが発生し、「sugar」行が削除されてcoffee空のままになりました。その後、別の commitb7a8d7aが追加され、無関係な変更が加えられました。

今、私は自分のコーヒーを見て、砂糖が入っていないことを発見しました. コーヒーに砂糖を入れたことをはっきりと覚えています。を実行する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砂糖を追加した元のコミットも、それを削除したマージも示していません。欠落している 2 つの非常に関連性の高いコミット。

手動でコミットを見つけるのがはるかに難しい大規模なエンタープライズ リポジトリで発生したため、この問題に約 1 時間イライラしました。

また、 と を使用して 2 つのコミットを特定しようとしましたが、これらのツールはどちらも 2 つのコミットを無視しましたgit bisect。すべてのandアクションを完了した後、間違ったコミットを指摘してくれました。git blamegit bisectgit 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                                    

関連する 2 つのコミット (砂糖を追加するコミットとそれを削除するマージ) が示されているので、これは嬉しいことです。だから私の問題は解決しました。でも、作り方や振る舞い方も知りたいです。git bisectgit blame誰かがたまたま知っていますか?

4

1 に答える 1

0

面白い。行がないため、git blame最初はまったく役に立ちません。git blameノートのドキュメントとして:

レポートは、削除または置換された行については何も通知しません。git diff などのツールや、次の段落で簡単に説明する「つるはし」インターフェイスを使用する必要があります。

この場合git log -SSugar、それがどこに入ったのかを見つけるために実行するかもしれません:

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

しかし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

これは、行が存在する最後のリビジョンであることを暗示しているように思われる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

3068c7dhereの子であるコミットは 1 つだけです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 を取得する必要があります)。そして、それは少し回りくどい方法でそれを見つけます。


(一方、バイセクトの問題を解決する方法はないようです。まあ、「悪のマージを回避する」以外に...)

于 2016-04-20T12:17:14.400 に答える