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

Ho usato git pull e ho 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 è ctriggers, quindi tutti i miei cambiamenti dovrebbero essere abbandonati. Come posso fare questo?

Poiché il tuo pull non ha avuto successo, 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 da Junio ​​Hamano (il manutentore di Git). Come indicato nel link , invece dovresti fare questo:

 git fetch origin git reset --hard origin 

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

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

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

Dalla pagina man di git merge

git merge --abort equivale 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 hai delle modifiche che non vuoi commettere prima di iniziare un’unione, basta git stash prima della fusione e git stash pop dopo aver completato l’unione o interromperlo.

 git merge --abort 

Interrompere l’attuale processo di risoluzione dei conflitti e provare a ribuild lo stato di pre-unione.

Se durante l’unione si sono verificate modifiche di worktree non impegnate, git merge --abort in alcuni casi, in alcuni casi, non sarà ansible ribuild queste modifiche. Si consiglia quindi di eseguire sempre il commit o il salvataggio delle modifiche prima dell’esecuzione di git merge.

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

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

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 

Penso che sia un git reset hai bisogno.

Attenzione, git revert significa qualcosa di molto diverso da, 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 , cioè eliminare le modifiche indesiderate.

Poiché i commenti suggeriscono che git reset --merge è un alias per git merge --abort , vale la pena notare che git merge --abort è solo equivalente a git reset --merge dato che un 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 un’unione 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 vecchia e la nuova syntax per la stessa cosa .

Personalmente trovo git reset --merge molto più potente per scenari simili a quello descritto, e fallisce unioni in generale.

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 

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.

E se si finisce con un conflitto di merge e non si hanno cose da commettere ma si fondono ancora errori viene visualizzato dopo aver applicato tutti i comandi sotto menzionati,

 git reset --hard HEAD git pull --strategy=theirs remote_branch git fetch origin git reset --hard origin 

si prega di rimuovere

.git \ index.lock

file [taglia incolla in qualche altro punto in caso di recupero] e poi inserisci uno dei comandi sottostanti a seconda della versione che desideri.

 git reset --hard HEAD git reset --hard origin 

Spero possa aiutare!!!

Ho trovato il seguente lavoro per me (ripristinare un singolo file per lo stato di pre-unione):

 git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*