2016-10-19 8 views
1

branch-agit rebase origin/master branch-aを指定すると、ファイルに競合が生じることがあります。リベースする前に(定義)に競合がなかったことを考えるとフィーチャーブランチにないファイルに影響するコミットを表示しますか?

CONFLICT (content): Merge conflict in .../file.txt 

は、その後、競合が唯一.../file.txtにB/C一つ以上のコミットを発生していることができます。

競合解消プロセス中に、私はこれらの変更をより自信を持って統合できるように、「origin/masterからのコミット.../file.txt」を簡単に表示する方法を見つけることができません。

---A---B---[C]---D 
    \    \ 
    E---[F]---G E'--[C/F']--G' 

ABCDはメインライン開発です。 EFGは私のローカルブランチ開発です。 Cをコミットすると、私のローカルrebase中にファイル/コミットでの競合が発生し、Dになりました。

考えると切り離さHEADまたは「リベース」状態、私はgit log -3 file.txtを行うときに、私がdiffがいたWHATである、見たいものを私に示していないようだ:競合の原因となった(すなわちCをコミット)コミットを適用するときに今解決しようとしていますF

ABCD ... EFGまたは現在アクティブな--rebaseにコミットを含めない特定のファイルにのみ影響するコミットのリストを取得するにはどうすればよいですか?

答えて

1

あなたはあなたが必要とする出力を得る必要があります。

git log --patch --full-history A..D -- file.txt 

--patch(または-pを)フラグは、おそらくあなたが探している主なものである:それはそれぞれのdiffがログに記録されたコミットを示しています。

フラグ--full-historyフラグは、ワークグループの現在のステータスに基づいてコミットを省略して、履歴を単純化しないようにします。これは、あなたの状況によっては必要ではないかもしれません。

A..Dは、出力をコミットA(排他)とコミットD(コミット)の間のコミットに制限します。 ADのリファレンスがあれば、-3の代わりにコミットを制限する方が信頼性の高い方法でしょう。そして実際に、あなたは常に両方の参照文献は便利だろう、Dはあなたのメインラインのブランチの先端で、あなたが実行してAを取得することができますので:

git merge-base <mainline> <local> 

を具体的な例:

はメインラインと仮定ブランチはmasterであり、もう一方のブランチはfeatureです。

git rebase master feature 
# conflicts occur 
git log --patch --full-history $(git merge-base master feature)..master -- file.txt 

時間を節約するために、あなたはまた、エイリアスを設定できます。

git config --global alias.conflict-commits "! git log --patch --full-history $(git merge-base $1 $2)..$1 -- $3" 

次にとしてそれを使用する:あなたがorigin/masterするlogコマンドのソースを選択することができます

git conflict-commits master feature file.txt 
+1

私は結局、あなたのアドバイスをちょっとしたコマンド/スクリプトレット(git conflict-commits)や何かにまとめようとしていますが、私はそれをやる気を尽くしています。 – user400575

+0

@ user400575:あなたのコメントは、エイリアスとして使用する方法を示すアイデアを私に与えました。私は私の答えを更新しました。 –

0

git log origin/master -3 file.txt 
関連する問題