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 --merge
dato 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