2016-01-20 10 views
8

origin/baseブランチのマージをfeatureブランチにマージした後、ファイルParameter.javaで1つの競合を解決する必要がありました。私は私のGitのマージツールを起動し、私はそれを解決しました。解決したら、私はgit commitを実行し、これはデフォルトのマージコミットメッセージでVimを開いた。Gitの既定のマージコミットメッセージには、矛盾が含まれていません。

このデフォルトのコミットメッセージには、競合のリストが含まれていますが、#で始まるので、コミットメッセージで無視されます。

Merge remote-tracking branch 'origin/base' into feature 

# Conflicts: 
#  Parameter.java 
# 
# It looks like you may be committing a merge. 
# If this is not correct, please remove the file 
#  .git/MERGE_HEAD 
# and try again. 

# Please enter the commit message for your changes. Lines starting 
# with '#' will be ignored, and an empty message aborts the commit. 
# On branch feature 
# All conflicts fixed but you are still merging. 
# 
# Changes to be committed: 
#  modified: Parameters.java 
#  modified: SpecialParameters.java 
#  modified: Traveller.java 

これらのコンフリクトラインをコミットメッセージに自動的に入れるために追加する設定はありますか?したがって、Conflicts部分の競合するファイルの#を削除しますか?

答えて

8

prepare-commit-msgフックを使用すると、そうすることができます。

コピー.git/hooks/prepare-commit-msg.sample

.git/hooks/prepare-commit-msgの例では、実際に競合部分に#を追加して内側:

case "$2,$3" in 
    merge,) 
    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; 

以前のバージョンは(Linux git version 1.7.10.4のように)デフォルトでこれをやっていたので、このフックは理にかなっています。

これで、やりたいことはまったく逆です:Conflicts部分の#を削除してください。あなただけでprepare-commit-msgでコマンドを更新できるように確かに、デフォルトでgit version 2.6.2.windows.1コメントアウト競合一部:

/usr/bin/perl -i.bak -ne 's/^#// if /^# Conflicts/ .. /^#\R/; print' "$1" ;; 
+0

'#になります。最初のコメントは、 "Conflicts:"マージコミットの一部です。 "はファイルの先頭に書かれているので、実際にはそれとは逆です。とにかく、あなたが提案したとおりに名前を変更しようとしましたが、私はGit bashを再起動しましたが、それでも動作しません、衝突部分はまだコメントアウトされています。 – jeerbl

+0

あなたは正しいです。私は私の答えを編集しました。 –

+1

perlの場合は、 'sed -i.bak '/ ^#の代わりに/、/ ^#$/s /..//'" $ 1 "' – jthill

-1

あなたは、コミットメッセージにそれを自分で追加する必要はありません。マージコミットをしたら、矛盾があれば、どこにいるのかを教えてくれます。競合を含むマージであったコミットでgit show --name-only [commit sha]を実行するだけで、メッセージの一部として表示されます。 # Conflicts:及び#又は(blank line)間の線の範囲において、#(space)又は## \?)の前除去:

+0

を使用しますか?私はそれを試して、それは動作していないようです。私が知る限り、コミットが完了すると、Gitは競合に関する情報を保存しません。 –

+0

ここに例があります:https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line/ – mohammedkhan

+0

興味深い。たぶんgit版の問題です。私はそれを試してみることができませんでした。 –

1

Iは、人間の言語に

読み取りsedranges by patternsを使用(およびjthill's answerに基づいている)は、これを使用します。

sed -i '/start/,/stop/ s/# \?//' 

が準備コミット-MSGフック:

# prepare-commit-msg 
case "$2,$3" in 
    merge,) 
    # Uncomment Conflicts section in merge commit body 
    sed -i '/^# Conflicts:/,/^#\?$/ s/# \?//' "$1" 
    ;; 
    *) ;; 
esac 

このフックは、3つの例を含む

Conflicts: 
    GIT-VERSION-GEN 
    RelNotes 
関連する問題