Git merge ha lasciato i segni HEAD nei miei file


102

Ho provato a unire un file nella riga di comando usando Git, quando è apparso un messaggio di errore che mi diceva che l'unione era stata interrotta.

Ho pensato che fosse la fine, ma poi mi sono reso conto che ci sono gitmark nei miei file. Così:

start =
    expression

validchar = 
    [0-9a-zA-Z_?!+\-=@#$%^&*/.]

integer = 
<<<<<<< HEAD
    digits:[0-9]+
        { return digits.join(""); }
=======
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages

I file sono stati modificati non da me e mostrano righe inserite con:

  • TESTA dopo meno di segni ( <<<<<<< HEAD)
  • righe di codice modificato
  • una stringa di segni di uguale ( =======)
  • la nuova versione del codice
  • un'altra riga che inizia con segni di maggiore di e il nome del ramo ( >>>>>>> gh-pages)

Quel che è peggio è che il contenuto del file non è più in ordine. Qualcuno sa come faccio a riportare quei file alla normalità e le modifiche che ho fatto nel gh-branch si sono fuse nel ramo master?

Risposte:


96

Quelli sono indicatori di conflitto . Sei ancora in fase di fusione, ma c'erano alcune parti che Git non poteva unire automaticamente. Dovrai modificare manualmente quelle parti in quello che vuoi che siano e quindi impegnare i risultati.


Ad esempio, nel tuo caso particolare, probabilmente vorresti risolverlo in questo modo (nota: le frecce / il testo a destra sono solo le mie note, non qualcosa che digiteresti nel file):

integer = 
<<<<<<< HEAD                                  <-+ remove the bits here
    digits:[0-9]+                               |
        { return digits.join(""); }             |
=======                                       <-+
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages                              <-- and this

e quindi salveresti il ​​file come ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }

4
@lowerkey Esattamente come vuoi che appaia il risultato della fusione finale. La mia ipotesi è che tu voglia davvero solo la parte nella gh-pagesversione, quindi dovresti semplicemente eliminare il materiale da <<<<<<a ======e anche rimuovere la singola >>>>>>riga, lasciando le due righe di codice effettivo tra =======e >>>>>>.
Amber

Grazie, penso di aver capito. Elimina tutto dalla testa a ====== e quindi rimuovi gli HEADmarks rimanenti.
lowerkey

1
Sì, è corretto. (Non c'è un vero "riposo" di cui occuparsi - stai solo confermando i risultati dell'unione, cosa che Git normalmente farebbe automaticamente se non ci fossero conflitti.)
Amber

2
@lowerkey, per favore considera anche la lettura di un libro sull'argomento. Consiglierei di leggere quel libro nella sua interezza poiché sembra che manchi una certa conoscenza di base su come funzionano i VCS ed è meglio prepararsi per eventuali problemi futuri.
kostix

1
Quanto è divertente. Indichi una risposta alla domanda che viene contrassegnata come un duplicato di questa sebbene la risposta a questa domanda possa essere trovata nell'altra domanda.
t3chb0t

22

Inizia assolutamente con "git status" per vedere cosa hai. Se hai interrotto un'unione (o un'unione è stata interrotta) e hai file in conflitto nella directory di lavoro, qualcosa è andato storto. Lo stato di Git ti dirà dove ti trovi. Dopodiché, hai una serie di opzioni. Dovresti risolvere il commit di unione manualmente, che può essere impegnativo, o utilizzando uno strumento come:

git mergetool

Lo strumento di unione funzionerà se i tuoi file sono elencati come bisognosi di unione.

Puoi anche eseguire uno dei seguenti:

git checkout --ours -- /path/to/conflicted-file       # this is probably the one you want
git checkout --theirs -- /path/to/conflicted-file

Puoi vedere le diverse versioni usando la sintassi: 1: filename. Vedi qui per una spiegazione. Ma tutto quanto sopra presuppone che "git status" mostri che i file necessitano di un'unione.

Infine, hai sempre la possibilità di:

git reset --hard   # sounds like --hard is what you need but check other options

6
Mi piacerebbe assolutamente git statusseguire il consiglio "inizia con per vedere cosa hai": in alcuni circoli è possibile incolpare Git per la sua complessità immaginaria, ma in realtà git statusè sufficiente leggere attentamente l'output di per capire cosa fare dopo nelle situazioni più comuni. Quindi, davvero: se qualcosa va storto, fermati, leggi git status, pensa.
kostix

4

Tutte le risposte sono corrette, ma se desideri rimuovere automaticamente tutti i segni di conflitto e desideri modificare automaticamente i file per mantenere HEAD, puoi creare il tuo script bash come: -

Script di esempio:

# vim /usr/sbin/solve.git

(Aggiungi seguito)

#!/bin/bash
for f in $(grep -Rl '^>>>>>>> ' --include="*.php" --include="*.css" --include="*.js" --include="*.html" --include="*.svg" --include="*.txt" .)
do
sed -i -e '/^=======/,/^>>>>>>> /d' -e '/^<<<<<<< /d' $f
sed -i -e '/^>>>>>>> /d' $f
echo "$f Fixed"
done
git add . ; git commit -am "[+] Resolved on `date` from `hostname` by `whoami`" --no-verify

# chmod 755 /usr/sbin/solve.git

ed eseguilo nel tuo repository / percorso GIT per risolvere:

$ cd <path_to_repo>
$ solve.git

Avviso: - Le estensioni di file sopra menzionate sono php, css, js, html, svg e txt.


0

In Atom ho avuto il problema che alcuni file non salvavano i conflitti di unione risolti sull'unità, quindi ho dovuto fare clic manualmente su "Salva". Mi ci è voluto un po 'di tempo per capirlo.


0

Vengo da questa domanda . E volevo un metodo automatizzato per unire i file semi uniti, invece di modificare manualmente i file ( come suggerito in altre risposte, cosa che non mi sento molto a mio agio a fare ). Quindi ecco cosa ho finito per fare tramite netbeans, ma può essere fatto anche tramite riga di comando.

Ora, tieni presente che questo funziona solo se subito dopo merge->add->commit, ti sei reso conto di aver sbagliato e vuoi ripetere il processo.

PASSO 1: ripristina un commit precedente.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

PASSAGGIO 2: riprova a unire il ramo

git merge --ff origin/feature/YOUR-Branch_here

A questo punto ti verrà chiesto con la finestra di fusione se stai usando una GUI. e puoi quindi procedere normalmente.

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.