2016-01-20 19 views
8

Dopo aver eseguito un'unione dal ramo origin/base nel ramo feature, ho dovuto risolvere un conflitto sul file . Ho lanciato il mio strumento Git merge e l'ho risolto. Una volta risolto, ho eseguito uno git commit e questo ha aperto Vim con il messaggio di commit di unione predefinito.Git messaggio di unione di merge non incluso conflitti

Questo messaggio di commit predefinito contiene l'elenco dei conflitti, ma a partire da #, pertanto verranno ignorati nel messaggio di commit.

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 

C'è qualche config da aggiungere per inserire automaticamente queste righe di conflitto nel messaggio di commit? Quindi rimuovere lo # sui file in conflitto nella parte Conflicts?

risposta

8

È possibile utilizzare il gancio prepare-commit-msg per farlo.

Copia .git/hooks/prepare-commit-msg.sample-.git/hooks/prepare-commit-msg

L'esempio all'interno di esso in realtà aggiunge # per la parte Conflitti:

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

Questo gancio ha un senso in quanto le versioni precedenti sono stati facendo questo per default (come in Linux git version 1.7.10.4).

Ora quello che vuoi fare è esattamente l'opposto: rimuovere # nella parte Conflitti. In effetti, il git version 2.6.2.windows.1 commenti per default i conflitti parte in modo da poter aggiornare semplicemente il comando in prepare-commit-msg con:

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

'# Questo gancio comprende tre esempi. Il primo commento alla parte "Conflicts:" parte di un merge commit. "È scritto all'inizio del file, quindi in realtà è il contrario. Ad ogni modo, ho provato a rinominarlo come suggerivi, ho riavviato Git bash ma ancora non funziona, la parte dei conflitti è ancora commentata. – jeerbl

+0

Hai ragione. Ho modificato la mia risposta. –

+1

Perl, sostituto 'sed -i.bak '/^# Conflitti: /,/^ # $/s /..//'" $ 1 "' – jthill

-1

Non è necessario aggiungere al messaggio impegnarsi. Dopo aver effettuato un commit di unione, se ci sono stati conflitti, git ti dirà dove si trovavano. Basta eseguire un git show --name-only [commit sha] su un commit che era un'unione contenente conflitti e lo vedrai come parte del messaggio.

+0

Puoi mostrare un esempio? L'ho provato e non sembra funzionare. Per quanto ne so, una volta eseguito il commit, Git non memorizza alcuna informazione sui conflitti. –

+0

Puoi vedere un esempio qui: https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line/ – mohammedkhan

+0

Interessante. Forse è una questione di versione git. Non l'ho visto mentre lo provavo. –

1

Io uso questo, che utilizza sed s' ranges by patterns (e si basa su jthill's answer)

Leggi in linguaggio umano: Nella gamma di linee tra # Conflicts: e # o (blank line), rimuovere precedente #(space) o # (# \?).

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

preparare-commit-msg gancio:

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

che si traduce in

Conflicts: 
    GIT-VERSION-GEN 
    RelNotes