Perché git dice "Pull non è possibile perché hai file non uniti"?


197

Quando provo a inserire la directory del mio progetto nel terminale, vedo il seguente errore:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Perché Git dice "Pull is not possible because you have unmerged files"e come posso risolverlo?


1
Nel mio caso ho appena usato questi comandi "git add". poi "git commit -m" Test "e alla fine" git push ". Errore rimosso
Akhzar Nazir

Devi semplicemente aggiungere "$ git add <file>" ... per aggiornare ciò che verrà eseguito il commit o il ripristino (per scartare le modifiche nella directory di lavoro), quindi eseguire il commit di "$ git commit", quindi "$ git push" per concludere l'unione.
find_X

Nel caso in cui aiuti: ho notato che solo facendo "git add". quindi l'impegno non ha funzionato. Ho dovuto aggiungere il singolo file per nome, quindi eseguire il commit e pull / push.
ouonomos,

Risposte:


215

Ciò che sta accadendo attualmente è che hai un certo set di file, che hai provato a fondere in precedenza, ma hanno sollevato conflitti di unione. Idealmente, se si ottiene un conflitto di unione, dovrebbe risolverli manualmente e applicare le modifiche utilizzando git add file.name && git commit -m "removed merge conflicts". Ora, un altro utente ha aggiornato i file in questione sul suo repository e ha inviato le sue modifiche al repository upstream comune.

Accade così che i conflitti di unione tra (probabilmente) l'ultimo commit non siano stati risolti, quindi i file non vengono uniti correttamente e quindi il flag U( unmerged) per i file. Quindi ora, quando lo fai git pull, git sta lanciando l'errore, perché hai una versione del file, che non è stata risolta correttamente.

Per risolvere questo problema, dovrai risolvere i conflitti di unione in questione e aggiungere e confermare le modifiche prima di poter eseguire un git pull.

Riproduzione campione e risoluzione del problema:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

Innanzitutto, creiamo la struttura del repository

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Ora siamo in repo_clone e, se lo fai git pull, si generano conflitti

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

Se ignoriamo i conflitti nel clone e ora facciamo più commit nel repository originale,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

E poi facciamo un git pull, otteniamo

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Nota che fileora è in uno stato non unito e se facciamo un git status, possiamo vedere chiaramente lo stesso:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

Quindi, per risolvere questo problema, dobbiamo prima risolvere il conflitto di unione che abbiamo ignorato in precedenza

repo_clone $ vi file

e impostane il contenuto su

text2
text1
text1

e quindi aggiungerlo e confermare le modifiche

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts

1
Per essere completo, aggiungerei la risposta di @ Pawan per usare "git mergetool" per risolvere i conflitti. Il penultimo passaggio potrebbe non essere molto pratico ("risolvi l'unione ... [impostando] ... il suo contenuto su: [del testo]").
innegabilmente

In alternativa, puoi unirti usando i consigli di @ user261. Ad ogni modo, penso che aggiungere un passo su come fondersi in senso pratico completerebbe questa risposta.
innegabilmente

3
Questa risposta funziona davvero bene quando si hanno semplici conflitti da risolvere su singoli file. Ad esempio, una o due righe di codice che sono diverse. Se hai più file che sono stati modificati pesantemente, questa è una soluzione difficile. Ma porta a casa l'idea che con Git dovresti impegnarti spesso per evitare conflitti difficili.
Vaughn D. Taylor,

46

Stai tentando di aggiungere altri nuovi commit nella tua filiale locale mentre la tua directory di lavoro non è pulita. Di conseguenza, Git si rifiuta di fare il tiro. Considera i seguenti diagrammi per visualizzare meglio lo scenario:

remoto: A <- B <- C <- D
locale: A <- B *
(* indica che hai diversi file che sono stati modificati ma non impegnati.)

Esistono due opzioni per affrontare questa situazione. Puoi annullare le modifiche nei tuoi file o conservarle.

Opzione 1: eliminare le modifiche
È possibile utilizzare git checkoutper ogni file non unito oppure è possibile utilizzare git reset --hard HEADper ripristinare tutti i file nel proprio ramo su HEAD. A proposito, HEAD nella tua filiale locale è B, senza un asterisco. Se si sceglie questa opzione, il diagramma diventa:

remoto: A <- B <- C <- D
locale: A <- B

Ora quando tiri, puoi far avanzare rapidamente il tuo ramo con le modifiche dal master. Dopo aver tirato, il tuo ramo sembrerebbe un maestro:

locale: A <- B <- C <- D

Opzione due: conservare le modifiche
Se si desidera conservare le modifiche, è innanzitutto necessario risolvere eventuali conflitti di unione in ciascuno dei file. Puoi aprire ogni file nel tuo IDE e cercare i seguenti simboli:

<<<<<<< HEAD
// la tua versione del codice
=======
// la versione remota del codice
>>>>>>>

Git ti presenta due versioni di codice. Il codice contenuto nei marker HEAD è la versione del tuo attuale ramo locale. L'altra versione è ciò che proviene dal telecomando. Dopo aver scelto una versione del codice (e rimosso l'altro codice insieme agli indicatori), è possibile aggiungere ogni file all'area di gestione temporanea digitando git add. Il passaggio finale consiste nell'impegnare il risultato digitando git commit -m con un messaggio appropriato. A questo punto, il nostro diagramma è simile al seguente:

remoto: A <- B <- C <- D
locale: A <- B <- C '

Qui ho etichettato il commit che abbiamo appena fatto come C 'perché è diverso dal commit C sul telecomando. Ora, se provi a tirare, otterrai un errore di avanzamento non veloce. Git non può riprodurre le modifiche in remoto sul tuo ramo, perché sia ​​il tuo ramo che il telecomando si sono discostati dal comune commit antenato B. A questo punto, se vuoi estrarre puoi fare un altro git merge, o il git rebasetuo ramo sul telecomando.

Ottenere una padronanza di Git richiede la capacità di comprendere e manipolare elenchi collegati unidirezionali. Spero che questa spiegazione ti spinga a pensare nella giusta direzione sull'uso di Git.


33

C'è una soluzione semplice ad esso. Ma per questo dovrai prima imparare quanto segue

vimdiff

Per rimuovere i conflitti, puoi usare

git mergetool

Il comando sopra apre sostanzialmente il file locale, il file misto, il file remoto (3 file in totale), per ogni file in conflitto. I file locali e remoti sono solo per riferimento e utilizzandoli puoi scegliere cosa includere (o meno) nel file misto. E basta salvare ed uscire dal file.


2
Direi che vimdiff non è richiesto (puoi usare qualsiasi strumento di unione / diff di tua scelta, come WinMerge o FileMerge integrato di OSX, ecc.). Detto questo, questa è un'ottima aggiunta alla risposta di @ mu.
innegabilmente

32

Se non desideri unire le modifiche e desideri comunque aggiornare il tuo locale, esegui:

git reset --hard HEAD  

Questo ripristinerà il tuo locale con HEAD e poi tirerà il tuo telecomando usando git pull.

Se hai già eseguito il commit della tua unione localmente (ma non hai ancora eseguito il push sul telecomando) e vuoi ripristinarlo anche:

git reset --hard HEAD~1 

7

Se si desidera aprire un ramo remoto da eseguire localmente (ad esempio per scopi di revisione o test) e quando si verificano $ git pullconflitti di unione locali:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)

5

Ci sono alcuni file localmente che devono essere uniti prima di poter estrarre. È possibile effettuare il checkout dei file e quindi estrarre per sovrascrivere i file locali.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master

L'unione combina il contenuto di due file. Attualmente i tuoi file locali differiscono da quelli sul server remoto. L'unione deve essere eseguita sul server remoto. Pertanto, se si mettono in scena i file modificati e li si invia, le modifiche verranno aggiunte ai file nel repository. Quindi i tuoi file saranno sincronizzati e potrai estrarre l'intero progetto con altre modifiche. Ho trovato il libro di aiuto di git molto utile quando ho iniziato a usare git. Puoi trovarlo qui: git-scm.com/book/en/Getting-Started
Nick

Nota che non sono l'OP. "Unione di file" è una terminologia errata. A rigor di termini, si uniscono commit, non file.
jub0bs,

Ah sì, è vero, le mie scuse. Stavo cercando di dare una risposta semplice
Nick,

Bene, se hai conflitti durante l'unione di un commit, allora sì, avrai file in conflitto e non uniti e dovrai unirli.
Edward Thomson,

3

Passaggi da seguire:

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

Grazie, Sarbasish


2

C'è stato lo stesso problema con me
Nel mio caso, i passaggi sono i seguenti:

  1. Rimosso tutto il file che stava iniziando con il simbolo U (non unito) . come-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Estrai il codice dal master

$ git pull origin master
  1. Controllato per lo stato

 $ git status

Ecco il messaggio che è apparso-
e hanno 2 e 1 commit diverso ciascuno, rispettivamente. Hai percorsi non uniti.
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

Percorsi non uniti:
(usa "git add ..." per contrassegnare la risoluzione)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Aggiunte tutte le nuove modifiche -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Commettere modifiche su testa

$ git commit -am "resolved conflict of the app."
  1. Spinto il codice -

$ git push origin master

Quale svolta può essere risolta con questa immagine - inserisci qui la descrizione dell'immagine


1

Quando si verifica un conflitto di unione, è possibile aprire un singolo file. Otterrai i simboli "<<<<<<< o >>>>>>>". Si riferiscono alle modifiche e alle modifiche presenti sul telecomando. È possibile modificare manualmente la parte richiesta. dopodiché salva il file e poi fai: git add

I conflitti di unione verranno risolti.


-1

Basta eseguire questo comando:

git reset --hard

3
Dovresti spiegare cosa fa il comando, perché alcune persone saranno molto deluse se provano e scoprono che ha eliminato tutte le loro attuali modifiche locali: /
Joseph Budin,

Funziona se copi le tue modifiche su una fonte temporanea esterna ... se hai solo un paio di file, ad esempio file di configurazione per un progetto, è perfetto. Esegui il comando e poi ripristina le modifiche. Per me va bene!
cwiggo,
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.