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.