2011-01-06 20 views
8

Stavo tirando nella mia directory .emacs, e ha colpito il seguente conflitto:Dopo git rm file; commit - come recuperare il file dal ramo remoto?

CONFLICT (add/add): Merge conflict in elisp/dired-details+.el 

stato Git ha mostrato il seguente:

Unmerged paths: 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# both added:   elisp/dired-details+.el 

Okay, quindi git suggerito utilizzando git rm. Voglio sostituire completamente il file locale con il file che sto tirando in, così sembra sorta di sorta di sensato ... Così faccio git rm elisp/dired-details+.el e git merge. Ottengo:

git unione: fatale: non hai concluso l'unione (MERGE_HEAD esiste). Per favore, commetti le modifiche prima che tu possa unire.

Ok, va bene: git commit -a -m "ugh merge conflicts"; git pull origin master.

Ora tutto si fonde bene, tranne per mi manca dired-details+.el, io sono un po 'confuso, e mi piacerebbe conoscere le risposte a quanto segue:

  1. Come faccio ad annullare git-rm e ottenere tale file dal il ramo a distanza? ..
  2. perché c'era un conflitto in primo luogo? .. che cosa sta succedendo qui con add/add? ..
  3. Cosa avrei dovuto fare, invece di git-rm 'ing il file che volevo sostituire? ..

risposta

9

In primo luogo, annullare la stampa commettere utilizzando git reset --hard HEAD^. Nota che questo cancellerà l'ultimo commit e resetterà la tua copia di lavoro allo stato del commit precedente, quindi fai attenzione a capire cosa farà prima di farlo. gitk può aiutare a visualizzare questo.

Secondo, git rm non fa quello che ti aspettavi qui. Quando si verifica un conflitto di unione, il file viene considerato in uno stato semi-unito, con il file contenente i contrassegni di conflitto che consentono di risolvere il conflitto. A questo punto, ti verrà chiesto di correggere la copia di lavoro nello stato in cui desideri che l'unione finale si impegni per apparire. Rimuovendo il file, hai detto a Git che non vuoi che il file sia più presente, che non è quello che volevi.

Quello che dovete fare in questa fase è aggiornare il file in conflitto nella copia di lavoro per la versione che si desidera conservare. Di solito questo viene fatto esaminando gli indicatori di conflitto e regolando il file di conseguenza. Nel tuo caso, se si sa per certo che si desidera la copia dal ramo si sta fondendo da, è possibile utilizzare git show :3:elisp/dired-details+.el > elisp/dired-details+.el per fare questo. Poi git add elisp/dired-details+.el a dire git che hai risolto il conflitto in quel file e poi git commit per terminare.

Qui, git show :3:... richiede la versione del file da MERGE_HEAD. Se è necessaria una versione diversa, è possibile utilizzare anche 1 per l'antenato comune o 2 per il "proprio" lato dell'unione.

+0

Bene, tutto sembra così ovvio con il senno di poi. Non sapevo che: n: notazione, sembra abbastanza utile. –

Problemi correlati