56

Ho provato a unire un file nella riga di comando utilizzando Git, quando è apparso un messaggio di errore che mi diceva che l'unione era stata interrotta.Git si fondono a sinistra segni HEAD nei miei file

Ho pensato che era la fine, ma poi ho capito che ci sono gitmarks nei miei file. In questo modo:

start = 
    expression 

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

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

I file sono stati non a cura di me e mostrare le linee 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 a partire da maggiore di segni e il nome del ramo (>>>>>>> gh-pages)

Ciò che è peggio è che il contenuto del file non è più in ordine. Qualcuno sa come faccio a riportare i file alla normalità e le modifiche apportate al ramo gh si sono fuse nel ramo principale?

risposta

66

Questi sono conflict markers. Sei ancora in fase di fusione, ma c'erano alcune parti che Git non è riuscito a unire automaticamente. Tu devi aggiungere need to hand-edit those parts a ciò che vuoi che siano e poi confermare i risultati.


Per esempio, nel vostro caso particolare, si sarebbe probabilmente desidera risolvere in questo modo (nota - le frecce/testo a destra, sono solo le mie note, non qualcosa devi digitare 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, ci si salva il file come ...

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

Come dovrebbe apparire il file quando ho finito di modificare? – lowerkey

+3

@lowerkey Esattamente come si desidera ottenere il risultato finale unito. La mia ipotesi è che tu voglia solo la parte nella versione 'gh-pages', quindi devi solo eliminare la roba da << <<<<<<' a '======' e rimuovere anche il singolo '>>>>>>' line, lasciando le due righe di codice effettivo tra '======= 'e' >>>>>> '. – Amber

+0

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

19

Iniziamo Assolutamente con 'git status' per vedere quello che hai. Se hai interrotto una fusione (o una fusione è stata interrotta) e hai file in conflitto nella directory di lavoro, qualcosa è andato storto. Lo stato Git ti dirà dove sei. Dopo ciò, hai un numero di opzioni. Si dovrebbe risolvere il merge commit o per mano, che può essere impegnativo, oppure utilizzando uno strumento come:

git mergetool 

Lo strumento di unione funzionerà se i file sono elencati come bisognose di una fusione.

È inoltre possibile eseguire una delle:

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

È possibile visualizzare le diverse versioni che utilizzano la sintassi nome del file: 1. Vedi here per una spiegazione. Ma tutto ciò presuppone che 'git status' mostri i file come se avessero bisogno di unire.

Infine, si ha sempre la possibilità di:

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

Mi piacerebbe in assoluto seguire il consiglio di "iniziare con' git status' per vedere cosa hai ": è fasionable in alcuni ambienti dare la colpa a Git per la sua complessità immaginaria, ma in realtà attento a leggere l'output di' git status 'è sufficiente per capire cosa fare dopo nelle situazioni più comuni. Quindi, davvero: se qualcosa va storto, fermati, leggi 'stato git', pensa. – kostix

1

Tutte le risposte hanno ragione, ma se si vuole autoremove tutti i segni di conflitto & vogliono scambio automatico i file per mantenere la testa, quindi è possibile creare la tua proprio script bash come: -

Esempio script:

# vim /usr/sbin/solve.git

(Append 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

& basta eseguirlo in GIT repo/percorso per risolvere:

$ cd <path_to_repo>
$ solve.git

Avviso: - Sopra menzionato le estensioni dei file sono php, css, js, html, svg & txt.