2016-04-20 26 views
6

が、私は約7年間、多額のGitを使用してきたblame`` gitのための `--full-history`の等価。数日前、私は私を驚かせた行動を見つけました。私はgit loggit blamegit bisectがこの奇妙な動作を示すことが分かった。 A friend私の問題を解決したgit logへの--full-historyの旗について教えてください。私自身の教育のために、git blamegit bisectの同等の修正があるかどうかを知りたいと思います。Gitリポジトリ: `Gitのbisect`と

このレポを自分のために問題を参照してくださいお気軽に:非常に最初のコミット、ファイルcoffeeが追加されましたで

$ git log --graph 
* commit b7a8d7aa001d06eb7491ab5fb447a8dd3aa421a8 
| Author: Ram Rachum <[email protected]> 
| Date: Tue Apr 19 17:45:01 2016 +0300 
| 
|  adding more to some-file 
| 
* commit 0aa833916e908ea93902a6c4c227f9a884a1bcef 
|\ Merge: 2413945 3068c7d 
| | Author: Ram Rachum <[email protected]> 
| | Date: Tue Apr 19 17:44:31 2016 +0300 
| | 
| |  Merge branch 'master' into development 
| | 
| * commit 3068c7d2548f1798b6840f73b13a649937339f28 
| | Author: Ram Rachum <[email protected]> 
| | Date: Tue Apr 19 16:02:27 2016 +0300 
| | 
| |  Adding sugar to coffee 
| | 
* | commit 24139451ab954b1f0a9ef616775a3dba0ac81669 
|/ Author: Ram Rachum <[email protected]> 
| Date: Tue Apr 19 16:01:28 2016 +0300 
| 
|  Creating some-file 
| 
* commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661 
    Author: Ram Rachum <[email protected]> 
    Date: Tue Apr 19 16:00:47 2016 +0300 

     Create coffee 

https://dl.dropboxusercontent.com/u/1927707/problematic_repo.7z

は、ここでそのログです。コミット3068c7dでは、coffeeファイルに "sugar"という行を追加しました。しかし、その後、このブランチをdevelopmentブランチにマージし、そのマージで間違いが起き、 "sugar"ラインが削除され、coffeeは空のままになりました。次に、別のコミットb7a8d7aが無関係な変更を加えて追加されました。

今、私は私のコーヒーを見て、そして砂糖はそれでありません探しています。私はコーヒーに砂糖を加えることをはっきりと覚えています。私はgit log coffeeを実行し、この出力を得ます:

$ git log coffee 
commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661 
Author: Ram Rachum <[email protected]> 
Date: Tue Apr 19 16:00:47 2016 +0300 

    Create coffee 

これはそれです。 git logは砂糖を加えたオリジナルのコミットも、それを削除したマージも表示されていません。非常に関連性の高いコミットが2つあります。

それはコミットが手動で見つけるのは非常に困難です巨大企業のレポに起こったので、私は、この問題により、約1時間に不満でした。

git bisectgit blameを使用して2つのコミットをピン止めしましたが、これらのツールは両方とも2つのコミットを無視しました。 git bisect badgit bisect goodアクションをすべて完了した後にgit bisectが私に間違ったコミットを指摘しました。

$ git log --full-history --graph coffee     
* commit 0aa833916e908ea93902a6c4c227f9a884a1bcef  
|\ Merge: cf02fbb 3068c7d        
| | Author: Ram Rachum <[email protected]>     
| | Date: Tue Apr 19 17:44:31 2016 +0300    
| |              
| |  Merge branch 'master' into development   
| |              
| * commit 3068c7d2548f1798b6840f73b13a649937339f28  
|/ Author: Ram Rachum <[email protected]>     
| Date: Tue Apr 19 16:02:27 2016 +0300    
|              
|  Adding sugar to coffee       
|              
* commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661  
    Author: Ram Rachum <[email protected]>     
    Date: Tue Apr 19 16:00:47 2016 +0300    

     Create coffee          

これは、2つの関連するコミット、1加える砂糖や削除、マージを示しているので、私は幸せ:私が最初に言ったよう

その後、友人が--full-history旗に向けて私を指摘しましたそれ。だから私の問題は解決される。 しかし、私は実際にgit bisectgit blameを同様に動作させる方法を知りたいと思っています。誰も知りませんか?

+0

'Gitのblame'が良く' --full-歴史を許可するかもしれません'ここに直接(私はあなたのレポでそれを試してみますが、私は7zipファイルを解凍することはできません)。 Bisectはそれ自身を処理するので、マージに触れることを拒否するかもしれません。 'git rev-list'は多くのマージをスキップしているので、一般的には表示されません.TREESAMEとマージ処理に関するドキュメンテーションの議論を参照してください。 – torek

+0

@torek私は今、それを試しました、 '非難'は旗を受け入れるように見えますが、それは何も変わらないように見えます。 'git blame -full-history'と' git blame -full-history-reverse'の両方を試しても結果は見られませんでした。 7zアーカイブを開くことができないということについては、ここにあります。https://dl.dropboxusercontent.com/u/1927707/foo.zip –

+0

@torek 'git blame --reverse HEAD ^^^ .. HEAD --full-history coffee'、まだ何も得られない。 –

答えて

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のコミットを制限するためにパスを追加すると、各コミットのツリーを。おそらく、使用している必要があり、私は3068c7d2548f1798b6840f73b13a649937339f28 == masterに気づき、実際にここでmasterを使用:上記のファイルおよびその後TREESAMEコード)

は、既知の良好な回転からスタートすることを使用して、我々は今、編集--reverse [を試すことができます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 

一つだけのコミットがありますそれはそう、ここではすなわち0aa83393068c7dの子である:

$ git show -m 0aa8339 
commit 0aa833916e908ea93902a6c4c227f9a884a1bcef (from 3068c7d2548f1798b6840f73b1 
Merge: 2413945 3068c7d 
Author: Ram Rachum <[email protected]> 
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を取得する-mが必要)。そして、それは少し丸みを帯びた形でそれを見つけます。


(一方、二等分の問題の治療法はないと思われます。さて、 "悪のマージを避ける" 以外...)

+0

あなたの答えをありがとう!私の誤った '--reverse'は、正しい左のコミットを使用していませんでした。 –

+0

更新:私は 'blame'を似たような場合に使用しようとしましたが、以前のコミットが以前に存在していた行を削除し、マージが誤ってそれらを再追加しました。 '--full-history'と' --full-history-reverse branch..other_branch'を使用したとしても、 '' blame''は行を誤って再追加したマージを表示できませんでした。どんな考え? –

+0

私は本当に分かっていません。一般的には、順方向であろうと逆方向であろうとも、コミットの前/後のそれぞれ(行内のファイルの行)をペアで比較して、行が変更されたかどうかを調べるだけです。その行には、そのペアの対応するコミットのIDが割り当てられます。このメソッドは、複数のペアが存在するため、マージではうまく動作しません(できません)。 – torek