Errore Git su commit dopo unione - fatale: impossibile eseguire un commit parziale durante una fusione


280

Ho corso un git pullche si è concluso in un conflitto. Ho risolto il conflitto e ora va tutto bene (ho usato anche mergetool).

Quando commetto il file risolto con git commit file.php -m "message"ottengo l'errore:

fatal: cannot do a partial commit during a merge.

Ho avuto lo stesso problema prima e l'utilizzo -adi commit ha funzionato perfettamente. Penso che non sia il modo perfetto perché non voglio impegnare tutti i cambiamenti. Voglio impegnare i file separatamente con commenti separati. Come lo posso fare? Perché git non consente agli utenti di eseguire il commit dei file separatamente dopo un'unione? Non sono riuscito a trovare una risposta soddisfacente a questo problema.


5
E sai, la ricerca di git esegue "commit completo" non restituisce quasi nulla di utile. Nessun documento rilevante dalle pagine man di Git. Questo è uno strumento così miserabile.
JWW

6
@Torek - parla di un altro pasticcio creato da Git ... Perché è così dannatamente difficile fare il checkout di un file in conflitto da un altro ramo in modo da evitare il conflitto, aggiungerlo a questo ramo e poi commetterlo ??? E WTF è un commit parziale? Non riesco a trovare alcuna documentazione su di esso ... Gli utenti sono costretti a provare le ipotesi di seguito ...
jww

Come hai fatto? Ho un conflitto e non posso fare nulla
Niklas R.

Risposte:


442

Ho scoperto che l'aggiunta di "-i" al comando commit risolve questo problema per me. -I in pratica gli dice di mettere in scena file aggiuntivi prima di eseguire il commit. Questo è:

git commit -i myfile.php

18
Cosa Stage additional filessignifica?
jcalfee314,

9
@ jcalfee314 la gestione temporanea in git consiste nel preparare il file per il commit. In questo caso particolare mette in scena il file tramite riga di comando prima di eseguire il commit. Il flag -i viene utilizzato principalmente per quando si sta concludendo un'unione. Puoi leggere di più sulle flag di commit qui .
MikaelHalen,

4
@ jcalfee314 Ho controllato la documentazione e mi dice "Prima di fare un commit dei contenuti in scena finora, metti in scena anche i contenuti dei percorsi forniti sulla riga di comando. Questo di solito non è quello che vuoi a meno che tu non stia concludendo una fusione in conflitto" . La mia ipotesi è che in questa condizione, ci sia una sorta di incoerenza nell'area di stadiazione che non può essere risolta git add, il che fa git commitfallire. L'aggiunta -idirebbe a git di aggiungere e impegnare allo stesso tempo. Non sono ancora sicuro del perché, ma sembra avere senso.
JonSlowCN,

5
Per nessuno come me, otterrai anche lo stesso errore se provi un messaggio che include spazi senza virgolette. Per esempio. [git commit -m one two three] Corretto: [git commit -m "one two three"]
Skychan

2
Il commento di @ Skychan è stato il biglietto per me.
Tehbeardedone,

106
git commit -am 'Conflicts resolved'

Questo ha funzionato per me. Puoi provare anche questo.


1
Incredibile, non lo sapevo!
JeanValjean,

11
Ciò aggiunge tutti i file modificati al commit, anche quelli che non sono in scena che potrebbero non essere desiderabili. Gli utenti potrebbero voler lasciare la bandiera 'a'
Chase Sandmann

4
Questo è esattamente ciò che l'utente chiede di non fare, ovvero evitare di eseguire il commit di tutti i file.
Michael,

33

È possibile utilizzare git commit -iper la maggior parte dei casi, ma nel caso in cui non funzioni

Hai bisogno di fare git commit -m "your_merge_message". Durante un conflitto di unione non è possibile unire un singolo file, quindi è necessario

  1. Stage solo il file in conflitto ( git add your_file.txt)
  2. git commit -m "your_merge_message"

16

Probabilmente hai un conflitto in qualcosa che non hai messo in scena per il commit. git non ti permetterà di impegnare le cose in modo indipendente (perché fa tutto parte della fusione, immagino), quindi è necessario git addquel file e poi git commit -m "Merge conflict resolution". La -ibandiera per git commitfa l'aggiunta per te.


5
Non in 1.9.0 - commit -ifunzionava, ma nongit add; git commit
LeeGee

14

Ho avuto questo quando ho dimenticato il -mmio commit git durante la risoluzione di un conflitto di unione git.

git commit "commit message"

dovrebbe essere

git commit -m "commit message"

2
Ah ah! Ho dimenticato di nuovo!
user2705463,

9

Poiché il messaggio di errore indica che non è possibile eseguire un commit parziale dopo un'unione. Invece di impegnarti file.php, dovresti impegnare tutte le modifiche.

Questo dovrebbe funzionare.

git commit -m "Fixing merge" 

Grazie, mi ha aiutato
Narendra Pandey il

Ha funzionato per me così com'è
Shashank Bodkhe il

6

La tua unione si è interrotta nel mezzo dell'azione. Dovresti aggiungere i tuoi file e quindi 'git commit':

git add file_1.php file_2.php file_3.php git commit

Saluti


5

Se vuoi semplicemente abbandonare l'intera raccolta delle ciliegie e eseguire il commit dei file in qualsiasi set desideri,

git reset --soft <ID-OF-THE-LAST-COMMIT>

ti porta lì.

Ciò che fa il soft reset è che sposta il puntatore che punta a HEAD corrente sul commit (ish) che hai dato ma non modifica i file. L'hard reset sposta il puntatore e riporta tutti i file allo stato in quel commit (ish). Ciò significa che con il ripristino software è possibile cancellare lo stato di unione, ma mantenere le modifiche ai file effettivi e quindi eseguirne il commit o il ripristino singolarmente a piacimento.


Potresti spiegarlo di più? Questo è probabilmente ciò di cui ho bisogno, ma non seguo il modo in cui funzionerebbe ... Tutte le risposte qui sono solo "aggiungi i file, quindi esegui il commit!", Ma è così banalmente ovvio; il motivo per cui sono qui è che non voglio aggiungere quei file prima di impegnarmi. -_-;
Kyle Baker,

Questo aiuta. Grazie. :)
Kyle Baker,

5
  1. vai alla directory del tuo progetto
    1. mostra file nascosti (apparirà la cartella .git)
    2. aprire la cartella .git
    3. rimuovi MERGE_HEAD
    4. impegnarsi di nuovo
    5. se git ti ha detto che git è bloccato, torna alla cartella .git e rimuovi index.lock
    6. commetti di nuovo tutto funzionerà bene questa volta.

Grande! Funzionerebbe per me. A proposito, se su MacOS, dal terminale avresti potuto chiamare `open .git`, streghe mostrerà il contenuto '.git' nel Finder
tontonCD

Questo funziona anche per me. Questo dovrebbe essere accettato come risposta.
vandu,

3

Per quanto mi riguarda, ciò è accaduto in SourceTree quando ho provato a eseguire una fusione prima di risolvere tutti i file. Ho quindi contrassegnato l'ultimo file risolto e tuttavia mi ha ancora dato questo errore quando ho provato a eseguire il commit. Ho chiuso SourceTree e l'ho riaperto, e poi ha funzionato bene.


1
grazie, ma sfortunatamente non ha funzionato per me. In modo fastidioso, ho dovuto commettere una vista-privata così come l'unione prima che mi permettesse di eseguire l'unione.
Coxy,

3

Ho risolto questo con un approccio completamente diverso, usando solo il controllo del codice sorgente di Xcode.

Background: un altro team ha apportato modifiche al repository Git remoto (tramite Beanstalk). Da parte mia, i file .xcodeproj sono arrivati ​​in directory diverse e le modifiche non sono state apportate. Successivamente, quando ho provato a eseguire il commit, ho ricevuto un errore di conflitto dell'albero in Xcode.

Schermata Conflitto albero

Essendo quasi impossibile correggere usando Xcode, ho sostituito il .xcodeprojfile con una versione scaricata dal server Git. Il risultato ... il progetto Xcode sembrava chiarire, tuttavia tutti gli aggiornamenti del pull corrotto si stavano presentando come modifiche che avevo fatto e sono stati messi in scena per un commit.

Guarda tutte queste mod e i file aggiunti

Tuttavia, quando ho provato a eseguire il commit, ho ricevuto lo stesso errore "fatale: impossibile eseguire un commit parziale durante un'unione", discusso qui.

Ecco come ho risolto il problema ... (Ora, capisci che sono un programmatore principiante, quindi potrei mancare di comprensione ... ma la mia ignoranza mi ha portato a trovare un altro modo per farlo.) Innanzitutto, ho clonato il mio maestro Ramifica in un ramo secondario e passa a quel ramo. Quindi ho creato una copia di lavoro e ho posizionato la directory in quella copia di lavoro al di fuori della directory di progetto originale. (Non so se questo fosse necessario, ma è quello che ho fatto mentre leggevo altre tecniche di risoluzione dei problemi.) Poi ho passato i rami al master, dove mi sono reso conto che tutti i miei file Staged (modifiche a Commit) erano spariti. Per essere sicuro che tutti i file siano stati aggiornati alle ultime modifiche apportate dall'altra parte, ho creato un nuovo ramo chiamato ThirdBranch, che ha duplicato tutti i file, Lo ha inviato al server Git e ha permesso a Beanstalk di confrontare la versione del mio server del ramo principale con il ramo ThirdBrach che ho appena spinto (riga per riga) e tutte le modifiche dell'altra parte erano presenti sul mio Xcode. Ciò significava che il mio repository principale e il repository principale Git erano gli stessi, il che verifica che ho risolto il problema utilizzando solo Xcode.

Non chiedermi come, al di là di quello che ho appena descritto ... e certamente colmare le lacune che ho lasciato fuori. Sono nuovo in questo e non capisco tutto. Forse un programmatore esperto può separare le informazioni irrilevanti da quelle pertinenti e ricreare questa tecnica in modo più chiaro, il che è in parte il motivo per cui sto postando questo.

Questa è una risposta duplicata alla domanda duplicata come: Xcode Git Merge non riuscito è bloccato


2
Si prega di non pubblicare risposte duplicate. Sebbene il problema sottostante possa essere lo stesso, la tua risposta è per un problema molto più specifico e annulla solo le risposte a questa domanda generale. Penso che in questo caso sia più appropriato un commento alla domanda in cui ti colleghi alla tua risposta originale.
Fookatchu,

2

Durante un'unione Git vuole tenere traccia dei rami principali per tutti i tipi di motivi. Quello che vuoi fare non è un'unione come lo vede Git. Probabilmente vorrai fare un rebase o cherry-pick manualmente.


1
Non ho mai usato rebase o cherry-pick prima, ho appena sfogliato il manuale ora, quindi cosa suggeriresti, "git rebase master" dopo che i conflitti di fusione funzioneranno?
pMan,

1
È un flusso di lavoro parallelo. Vedi stackoverflow.com/questions/804115/git-rebase-vs-git-merge Fondamentalmente, se vuoi che la "unione" sia separata, ti impegni invece a reimpostare il ramo di origine alla fine del ramo di destinazione.
Talljoe,

1
Basta aggiungere ogni singolo file quindi eseguire il commit senza -a.
Peter DeWeese,

4
non hai effettivamente risposto alla domanda, ma semplicemente hai dato di più da cercare. Ora abbiamo bisogno di sapere "cosa sta raccogliendo ciliegia" e "cosa è rebase".
ftrotter,

2
Mi chiedo perché questa risposta sia stata votata in negativo. Ho sempre avuto la curiosità del bambino quando qualcuno mi ha detto cose che non avevo mai saputo prima. Come ho commentato sopra, ora so di ciliegia pick e rebase. Non è stato progressivo / utile?
pMan

2

git commit -i -m 'merge message'non ha funzionato per me. Ha detto:

fatal: No paths with --include/--only does not make sense.

FWIW, sono arrivato qui tramite questa domanda correlata perché stavo ricevendo questo messaggio:

fatal: You have not concluded your merge (MERGE_HEAD exists).

Ho anche provato a fusione, che ha detto No files need merging. Molto confuso! Quindi MERGE_HEAD non si trova in un file che deve essere unito- ??

Infine, ho usato questo trucco per aggiungere solo i file modificati (non volevo aggiungere tutti i file nel mio albero, poiché ne ho alcuni che voglio mantenere non tracciati):

git ls-files -m | xargs git add

Poi sono stato finalmente (!) In grado di impegnarmi e spingere verso l'alto. Sarebbe sicuramente bello se Git ti desse suggerimenti migliori su cosa fare in queste situazioni.


1

Se si trova nell'albero dei sorgenti , dovremmo contrassegnare esplicitamente un file come risolto dopo che i conflitti sono stati risolti. Seleziona il file che è stato appena risolto per evitare conflitti. Quindi Azioni -> Risolvi conflitti -> Segna risolto . Se hai più file, fai lo stesso per tutti. Commetti ora.


1

Dopo aver letto tutti i commenti. questa era la mia risoluzione:
ho dovuto "aggiungerlo" di nuovo rispetto al commit:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html

1

Se si utilizza l'albero dei sorgenti o altra interfaccia grafica, assicurarsi che tutti i file siano selezionati (dopo l'unione).


0

A volte durante l'unione, se sorgono conflitti e ci sono delta che richiedono una risoluzione manuale. In tal caso, correggere la risoluzione manuale per i file menzionati.

Ora se emetti,

git status Lib/MyFile.php

Vedrai un output simile

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Da allora, hai già messo in scena il commit, devi solo emettere

git commit

E il tuo impegno verrà eseguito senza alcun problema.

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.