Come posso completare l'unione dopo aver risolto i miei conflitti di unione?


282

Ho letto la sezione ramificazione e fusione di base del Git Community Book.

Quindi seguo e crearne un ramo: experimental.

Quindi io:

  1. passa al ramo sperimentale (checkout git sperimentale)
  2. apportare molte modifiche
  3. commit (git commit -a)
  4. passa al ramo principale (git checkout master)
  5. apportare alcune modifiche e impegnarsi lì
  6. torna a sperimentale (git checkout sperimentale)
  7. unisci master change in sperimentale (git merge master)
  8. ci sono alcuni conflitti ma dopo averli risolti, ho fatto 'git add myfile'

  9. E ora sono bloccato, non posso tornare al maestro

quando io faccio

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

e ho fatto:

$ git rebase --abort

Nessun rebase in corso?

e ho fatto:

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Cosa posso fare in modo da poter tornare al mio ramo principale?


Dopo aver risolto il conflitto, eseguire l'aggiunta e quindi tentare di eseguire il commit con git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts", risulta fatal: cannot do a partial commit during a merge.. E, naturalmente, "commit parziali" non sembrano essere documentati o discussi da nessuna parte nelle pagine man di git. L'esecuzione di un git mergedopo la correzione si traduce in Please, commit your changes before you can merge.Che strumento di culo rotto ...
jww

2
git commit con percorsi espliciti è documentato nella manpage nella DESCRIZIONE "come" 3. elencando i file come argomenti per il comando commit, nel qual caso il commit ignorerà le modifiche messe in scena nell'indice e registrerà invece il contenuto corrente dei file elencati (che deve essere già noto a Git); "e anche sotto" - -solo 'opzione. Sono abbastanza sicuro che il messaggio di unione sia stato scritto da qualcuno che ha supposto che avresti letto come funziona il comando commit e che potrebbe riconoscere il significato della parola "parziale" in quella descrizione, se non già almeno allora ancora e più attentamente. @jww
jthill

1
Quindi, perché questo caso di studio merita un'attenta lettura per la comprensione, quindi, mentre le manpage no? @jww
jthill,

1
Bene, usare git richiede chiaramente una migliore comprensione della lettura di quella che sei disposto ad acquisire. Forse sono ancora più incerto che sia un difetto di Git di quanto tu sia sicuro.
jillill

1
Con Git 2.12 (Q1 2017), presto farai semplicemente un git merge --continue. Vedi la mia risposta di seguito
VonC,

Risposte:


267

Quando si verifica un conflitto durante un'unione, è necessario completare manualmente il commit di unione. Sembra che tu abbia fatto i primi due passaggi, per modificare i file in conflitto e quindi eseguirli git addper contrassegnarli come risolti. Infine, è necessario impegnare effettivamente l'unione con git commit. A quel punto sarai in grado di cambiare di nuovo i rami.


Se si utilizza "git gui &" per eseguire il commit, è possibile che non si realizzi che lo stato della filiale non si sta "unendo". Seguire uno "stato git" è utile per assicurarsi che lo stato della filiale sia corretto.
Tony Ashworth,

4
Prova git commit -am "your commit message"a eseguire l'aggiunta e il commit contemporaneamente.
vaheeds

3
git commitfunziona. Ed è meglio usarlo per ottenere il messaggio di commit di unione predefinito popolato per te. Evito `git commit -am" poiché sovrascriverà il messaggio
Arijoon,

1
Prova git push.
Alper

Ho avuto questa situazione nello scenario seguente -> Ho unito il ramo X con il ramo Y. Poi mi sono reso conto di aver fatto qualcosa di sbagliato nel ramo Y, quindi l'ho corretto e poi ho "modificato" le mie modifiche nel ramo Y. A causa di un emendamento git non ha creato un nuovo commit. Quindi, quando ho unito il ramo X con il ramo Y aggiornato, ha dato conflitto. A proposito grazie per questa risposta.
doga,

157

Come posso completare l'unione dopo aver risolto i miei conflitti di unione?

Con Git 2.12 (Q1 2017), avrai il comando più naturale:

git merge --continue

Vedi commit c7d227d (15 dic 2016) di Jeff King ( peff) .
Vedi commit 042e290 , commit c261a87 , commit 367ff69 (14 dic 2016) di Chris Packham ( cpackham) .
(Unita da Junio ​​C Hamano - gitster- in commit 05f6e1b , 27 dic 2016)

Vedi le note di rilascio della 2.12 .

merge: aggiungi ' --continue' opzione come sinonimo di ' git commit'

Insegnare ' git merge' l' --continueopzione che consente di 'continuare' una fusione completandola.
Il modo tradizionale di completare una fusione dopo aver risolto i conflitti è usare ' git commit'.
Ora con comandi come ' git rebase' e ' git cherry-pick' avere --continueun'opzione ' ' che aggiunge tale opzione a ' git merge' presenta un'interfaccia utente coerente.


Mi stavo preparando a postare un commento su come questo è stato aggiunto di recente in 2.12 nel primo trimestre del 2017, ma poi ho riletto la prima riga della tua risposta. Non c'è da stupirsi che l'opzione non sia stata trovata per me nella versione 2.10!
cjsimon,

1
Ho provato git merge --continue e Git Bash non è stato in grado di riconoscerlo come comando. Ma ciò che ha funzionato è stato git commit -m "Commit message"
Mimi

2
@Mimi OK, ma stai usando un Git 2.12 o più?
VonC,

@VonC hai ragione, sto usando una versione precedente di Git!
Mimi,

23

Nel caso in cui rimani bloccato durante un'unione / rebase, puoi sempre

git reset --hard

per ripristinare il tuo lavoro allo stato dell'ultimo commit. Questo perderà le tue modifiche dall'albero di lavoro, quindi se hai apportato modifiche locali prima dell'unione, queste verranno perse dopo questo, motivo per cui è consigliabile non iniziare un'unione quando si hanno modifiche locali. :)


16
avvertimento obbligatorio: git reset --hardelimina le modifiche non confermate
Geoffrey Hale,

2
Perché non solo git merge --abort, che non ha il rischio di perdere qualcosa?
Alexander George,


11

Ogni volta che unisci due rami usando il comando git merge brancha branchb, ci sono due possibilità:

  1. Un ramo (diciamo brancha) può essere raggiunto dall'altro ramo (diciamo ramo b) seguendo la sua cronologia di commit. In questo caso git semplicemente avanzare rapidamente la testa per puntare al ramo recente (in questo caso ramo b).

    2. Ma se i due rami sono divergenti in un punto precedente, git crea una nuova istantanea e aggiunge un nuovo commit che punta ad esso. Quindi nel caso in cui non ci siano conflitti tra i rami che stai unendo, git crea senza problemi un nuovo commit.

Esegui git logper visualizzare il commit dopo aver unito due rami non in conflitto.

Ora torniamo al caso interessante quando ci sono conflitti di unione tra i rami che si fondono. Cito questo dalla pagina https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git non ha creato automaticamente un nuovo commit di unione. Ha sospeso il processo mentre si risolve il conflitto. Se si desidera vedere quali file non sono stati uniti in qualsiasi momento dopo un conflitto di unione, è possibile eseguiregit status


Quindi, in caso di conflitti di unione, è necessario risolvere il conflitto, quindi aggiungere le modifiche apportate all'area di gestione temporanea utilizzando git add filenamee quindi eseguire il commit delle modifiche utilizzando il comando git commit che è stato messo in pausa da Git a causa del conflitto. Spero che questo spieghi query. Visitate anche il link sopra per una comprensione dettagliata. In caso di domande, ti preghiamo di commentare qui sotto, sarò felice di aiutarti.


7

I passi successivi dopo la risoluzione manuale dei conflitti sono: -

  1. git add.
  2. stato git (questo ti mostrerà quali comandi sono necessari per continuare la procedura di unione automatica)
  3. [comando git suggerisce, per esempio git merge --continue, git cherry-pick --continue, git rebase --continue]

16
Non c'è git merge --continua
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidad Questo non è corretto. Uscita Zie git di seguito dopo il conflitto: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly

5
C'è rebase --continua, non unisci --continua
Hola Soy Edu Feliz Navidad

git merge --continue, che è quello che sto cercando di fare, risulta error: unknown option 'continue'. Sono sicuro che la tua risposta sia sbagliata poiché la git-mergepagina man non la elenca. Quale versione di Git stai usando? Sto usando git version 1.8.5.2 (Apple Git-48). Ho anche provato con MacPorts git version 2.9.3.
JWW

1
Con git 2.10 per una semplice fusione il comando è semplicemente vecchiogit commit
Chris Charabaruk l'

2

Un conflitto di unione si verifica quando due rami che stai tentando di unire hanno entrambi cambiato la stessa parte dello stesso file. È possibile generare un elenco di conflitti congit status .

Quando viene rilevata la linea in conflitto, Git modificherà il contenuto dei file interessati con indicatori visivi che contrassegnano entrambi i lati del contenuto in conflitto.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Quando si correggono i file in conflitto e si è pronti a unire, è sufficiente eseguire git adde git commitgenerare il commit di unione. Una volta effettuato il commit, git pushle modifiche al ramo.

Articolo di riferimento: Git merge .


2

Dopo aver aggiunto tutti i file, il passaggio successivo è un " git commit ".

"git status" suggerirà cosa fare: i file ancora da aggiungere sono elencati in fondo e, una volta terminati, suggeriranno un commit in alto, dove spiega lo stato di unione del ramo corrente.


1

La prima cosa che voglio chiarire è che i nomi dei rami sono solo un alias per un commit specifico. un commit è ciò che git funziona, quando tiri, spingi unione e così via. Ogni commit ha un ID univoco.

Quando esegui $ git merge, ciò che sta realmente accadendo è che git tenta di far avanzare rapidamente il tuo ramo corrente al commit su cui si trova il ramo di riferimento (in altre parole entrambi i nomi di ramo indicano lo stesso commit.) Questo scenario è il più semplice per git da gestire, dal momento che non esiste un nuovo commit. Pensa al maestro che salta sul lilipad sul quale il tuo ramo si sta rilassando. È possibile impostare il flag --no-ff, nel qual caso git creerà un nuovo commit indipendentemente dal fatto che ci siano stati conflitti di codice.

In una situazione in cui vi sono conflitti di codice tra i due rami che si sta tentando di unire (in genere due rami la cui cronologia di commit condivide un commit comune in passato), l'avanzamento rapido non funzionerà. git potrebbe essere ancora in grado di unire automaticamente i file, a condizione che la stessa riga non sia stata modificata da entrambi i rami in un file in conflitto. in questo caso, git unirà i file in conflitto per te e li commetterà automaticamente. Puoi vedere in anteprima come ha fatto git facendo $ git diff - nella cache. Oppure puoi passare il flag --no-commit al comando merge, che lascerà i file modificati nel tuo indice che dovrai aggiungere e eseguire il commit. Ma puoi $ git diff questi file per rivedere cosa cambierà l'unione.

Il terzo scenario è quando ci sono conflitti che git non può risolvere automaticamente. In questo caso dovrai unirli manualmente. Secondo me questo è più facile da fare con una fusione presa, come araxis merge o p4merge (gratuito). Ad ogni modo, devi fare ogni file uno per uno. Se l'unione sembra mai essere bloccata, usa $ git merge --continue, per spostarti. Git dovrebbe dirti se non può continuare, e se sì perché no. Se ritieni di aver sciolto l'unione a un certo punto, puoi fare $ git merge --abort, e qualsiasi fusione si annullerà e puoi ricominciare da capo. Al termine, ogni file che hai unito sarà un file modificato che deve essere aggiunto e sottoposto a commit. Puoi verificare dove sono i file con lo stato $ git. Se non hai ancora eseguito il commit dei file uniti. Devi farlo per completare l'unione.


0

Potrebbe essere tardi. È successo perché il tuo git HEAD non è aggiornato. questo encomio lo risolverebbe git reset HEAD.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.