Domanda Ho incontrato un conflitto di fusione. Come posso interrompere l'unione?


ero solito git pull e ha avuto un conflitto di fusione:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

So che l'altra versione del file è buona e che la mia è cattiva, quindi tutti i miei cambiamenti dovrebbero essere abbandonati. Come posso fare questo?


1911
2017-09-19 13:21


origine


risposte:


Dal tuo pull non ha avuto successo quindi HEAD (non HEAD^) è l'ultimo commit "valido" sul tuo ramo:

git reset --hard HEAD

L'altro pezzo che vuoi è lasciare che le loro modifiche superino le tue modifiche.

Le versioni precedenti di git ti consentivano di utilizzare la strategia di unione "loro":

git pull --strategy=theirs remote_branch

Ma da allora è stato rimosso, come spiegato in questo messaggio di Junio ​​Hamano (il manutentore di Git). Come notato in il link, invece dovresti fare questo:

git fetch origin
git reset --hard origin

1727
2017-09-19 14:33



Se la tua versione git è> = 1.6.1, puoi usare git reset --merge.

Inoltre, come @Michael Johnson menziona, se la tua versione git è> = 1.7.4, puoi anche usarla git merge --abort.

Come sempre, assicurati di non avere modifiche senza commit prima di iniziare un'unione.

Dal git unisce la pagina man

git merge --abort è equivalente a git reset --merge quando MERGE_HEAD è presente.

MERGE_HEAD è presente quando è in corso un'unione.

Inoltre, per quanto riguarda le modifiche non vincolate all'avvio di un'unione:

Se si hanno modifiche che non si desidera eseguire il commit prima di iniziare un'unione, solo git stash loro prima della fusione e git stash pop dopo aver completato l'unione o interromperlo.


1582
2018-03-28 23:16



git merge --abort

Interrompere l'attuale processo di risoluzione del conflitto e provare a ricostruire   lo stato di pre-fusione.

Se ci sono state modifiche del worktree non impegnate presenti durante l'unione   iniziato, git merge --abort sarà in alcuni casi impossibile   ricostruire questi cambiamenti. Si raccomanda quindi di sempre   commetti o memorizza le tue modifiche prima di eseguire git merge.

git merge --abort è equivalente a git reset --merge quando    MERGE_HEAD è presente.

http://www.git-scm.com/docs/git-merge


378
2017-11-12 21:40



In questo particolare caso d'uso, non si vuole veramente interrompere l'unione, basta risolvere il conflitto in un modo particolare.

Non è particolarmente necessario resettare ed eseguire un'unione con una strategia diversa. I conflitti sono stati correttamente evidenziati da git e il requisito di accettare le modifiche degli altri lati è solo per questo file.

Per un file non sommerso in un conflitto, git rende disponibili le versioni comuni di base, locali e remote del file nell'indice. (Qui è dove vengono letti per l'uso in uno strumento diff di 3 vie di git mergetool.) Puoi usare git show per vederli.

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

Il modo più semplice per risolvere il conflitto per utilizzare la versione remota verbatim è:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

Oppure, con git> = 1.6.1:

git checkout --theirs _widget.html.erb

73
2017-09-20 10:41



penso che sia git reset hai bisogno.

Attenzione git revert significa qualcosa di molto diverso, per esempio, svn revert - in Subversion il ripristino annulla le modifiche (non salvate), restituendo il file alla versione corrente dal repository, mentre git revert "annulla" un commit.

git reset dovrebbe fare l'equivalente di svn revert, ovvero, elimina le modifiche indesiderate.


72
2017-09-19 13:25



Poiché i commenti lo suggeriscono git reset --merge è un alias per git merge --abort, vale la pena notare git merge --abort è solo equivalente a git reset --mergedato che a MERGE_HEAD è presente. Questo può essere letto nella guida di git per il comando di unione.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Dopo una fusione fallita, quando non c'è MERGE_HEAD, l'unione fallita può essere annullata con git reset --merge ma non necessariamente con git merge --abort, quindi non sono solo la sintassi vecchia e nuova per la stessa cosa.

Personalmente trovo git reset --merge molto più potente per scenari simili a quelli descritti, e fallisce l'unione in generale.


29
2018-04-02 12:16



Dal momento che Git 1.6.1.3 git checkout è stato in grado di effettuare il checkout da entrambi i lati di un'unione:

git checkout --theirs _widget.html.erb

16
2017-07-17 01:29



Un'alternativa, che preserva lo stato della copia di lavoro è:

git stash
git merge --abort
git stash pop

Generalmente sconsiglio questo, perché è efficacemente come fondersi in Subversion quando getta via le relazioni tra le filiali nel seguente commit.


13
2017-07-13 18:57