Git rebase --continue si lamenta anche quando tutti i conflitti di unione sono stati risolti


115

Sto affrontando un problema che non sono sicuro di come risolvere.

Ho fatto un rebase contro il master del mio ramo:

git rebase master

e ha ricevuto il seguente errore

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

Quindi sono andato al mio editor preferito, ho risolto il conflitto di 1 riga, salvato il file e ho eseguito uno stato git e ho ottenuto il seguente output:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

Ho aggiunto Git AssetsLoader.java e uno stato git e ho ottenuto quanto segue:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

e quando ho fatto git rebase --continue ottengo:

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

So di poter saltare la patch e continuare il rebase, ma non sono sicuro se le modifiche in PassengerContactHandler.java verranno ribasate o meno nel mio ramo.

quindi non sono sicuro, come devo procedere?

Modifica: potrebbe essere che il file con il conflitto risolto sia esattamente come la versione originale?

Grazie mille, Lucas

Modifica, mi è appena successo di nuovo:

Mi è appena successo di nuovo

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...) | REBASE) $ git rebase --continue

You must edit all merge conflicts and then
mark them as resolved using git add

git --version

git version 1.7.1

Questo è il risultato completo di git status, giusto? Nessuna sezione mancante sotto?
Cascabel

git-rebasenon dovrebbe mai segnalare che ci sono conflitti irrisolti se non ce ne sono. Se riesci a riprodurre il problema in un test case più semplice, sarebbe molto più facile eseguire il debug, ma comunque, se non hai git statussegnalato conflitti quando lo git rebase --continuefa e la tua versione di Git è attuale, potresti provare a inviare un'e-mail allo sviluppatore di Git mailing list all'indirizzo git@vger.kernel.org con tutte le informazioni diagnostiche che puoi ottenere.
Cascabel

1
Mi è appena successo di nuovo, (307ac0d ...) | REBASE) $ git status # Attualmente non su nessun ramo. # Modifiche da eseguire: # (usa "git reset HEAD <file> ..." per rimuovere lo stage) # # modified: assets / world / level1 / Level-1.xml # modified: George.java # modified: DefaultPassenger.java # # File non tracciati: # (usa "git add <file> ..." per includerlo in ciò che verrà inserito) # # mb-art / originalAssets / 27dec /
Lucas

Penso che dovresti usare GITKRAKEN, ti aiuterà a risolvere i tuoi conflitti
Nikhil Bhardwaj

Risposte:


115

Ciò accade perché quando si risolve un conflitto, è stato rimosso tutto il codice nella patch applicata al ramo su cui si sta ribasando. Usa git rebase --skipper continuare.

Qualche dettaglio in più:

Normalmente, quando risolvi un conflitto durante il rebase, modifichi il file in conflitto, mantenendo parte o tutto il codice nella patch attualmente applicata al ramo su cui rebase. Dopo aver aggiustato la patch e fatto

git add your/conflicted/file
git status

otterrai una linea (solitamente verde) che mostra il file modificato

modificato: il tuo file / in conflitto /

git rebase --continue funzionerà bene in questa situazione.

A volte, tuttavia, quando risolvi il conflitto, rimuovi tutto nella tua nuova patch, mantenendo solo il codice dal ramo su cui hai ribasato. Ora, quando aggiungi il file, sarà esattamente come quello su cui hai tentato di rebase. git status non mostrerà alcuna linea verde che mostra i file modificati. Ora, se lo fai

git rebase --continue

git si lamenterà con

Nessuna modifica: hai dimenticato di utilizzare "git add"?

Quello che git vuole che tu faccia in questa situazione è usare

git rebase --skip

per saltare la patch. In precedenza non l'ho mai fatto, poiché non ero sempre sicuro di cosa sarebbe stato effettivamente saltato se lo avessi fatto, non era ovvio per me cosa significasse veramente "salta questa patch". Ma se non ottieni alcuna linea verde con

modificato: il tuo file / in conflitto /

dopo aver modificato il file in conflitto, averlo aggiunto e aver eseguito git status, puoi essere abbastanza sicuro di aver rimosso l'intera patch e puoi invece usare

git rebase --skip

continuare.

Il post originale diceva che a volte funziona:

git add -A
git rebase --continue
# works magically?

... ma non fare affidamento su questo (e assicurati di non aggiungere file rimanenti nelle cartelle del tuo repository)


1
Mi sembrava di avere lo stesso problema e la stessa soluzione, sembrava anche magico!
bspink

Ho avuto lo stesso problema, sembra che se hai effettuato il refactoring nel ramo ribasato e hai aggiunto nuovi file, e quindi il processo di risoluzione unione ha apportato modifiche a quei nuovi file, devi aggiungerli di nuovo esplicitamente.
Ibrahim

Non farlo a meno che tu non voglia tenere traccia di tutti i file spazzatura nel tuo repository.
Jed Lynch

git add ...diventa davvero fastidioso da digitare dopo aver modificato un mucchio di file con percorsi lunghi. C'è un git add --all-the-files-i-changedposso correre prima git rebase continue?
jozxyqk

3
Per fare attenzione quando usi il comando git rebase --skip, potresti perdere il tuo lavoro (file modificati)
Youness Marhrani


8

Ho ricevuto questo avviso quando avevo file non archiviati. Assicurati di non avere file non archiviati. Se non si desidera che i file non gestiti vengano modificati, eliminare le modifiche con

git rm <filename>  

2
Così semplice potrebbe essere un commento; così utile dovrebbe essere una risposta. Grazie!
Lucas Lima

4

Prova a eseguirlo nella riga di comando:

$ git mergetool

Dovrebbe far apparire un editor interattivo che ti consenta di risolvere i conflitti. Più facile che provare a farlo manualmente, e anche git riconoscerà quando farai l'unione. Eviterà anche situazioni in cui non ti unisci completamente per errore che possono accadere quando provi a farlo manualmente.


Ho solo pensato che potrebbe essere più facile e ti avrebbe anche permesso di evitare situazioni come questa in futuro.
Batkins

1
Mi hai salvato la serata. Sebbene sia uno strumento semplice, non sarei mai in grado di capire come risolvere i miei conflitti senza questo strumento.
eonil

4

Dopo aver risolto il conflitto, assicurati che i file modificati siano aggiunti ai tuoi file di staging. Questo ha risolto il problema per me.


Questo ha funzionato per me. Ho controllato Sourcetree dopo aver ricevuto il messaggio descritto nell'OP e ho immediatamente visto i due file menzionati nella finestra di comando come non in scena. Messo in scena i file, eseguito "git rebase --continue" e sono tornato in pista.
Mass Dot Net

3

Hai perso un conflitto di unione in AssetsLoader.java. Aprilo e cerca gli indicatori di conflitto (">>>>", "====", "<<<<<") e poi aggiungi di nuovo git. Se hai difficoltà a trovarlo, fai un "git diff --staged".


3
Ho eseguito un grep su tutti i file tracciati e non c'erano marcatori di conflitto.
Lucas

Non git diff --stagedrivela nulla di utile? Ciò indica quali modifiche stai per eseguire per risolvere il conflitto di unione a questo punto del rebase. Dovrebbe esserci un bit "oops, non è quello che intendevo fare per risolvere questo" bit in uno dei file.
Ether il

4
Git non cerca i marcatori di conflitto di unione quando provi ad andare avanti. Controlla solo che l'indice sia in uno stato pulito. Se hai messo in scena un file che contiene ancora marcatori di conflitto, stai indicando che vuoi eseguirne il commit con loro al suo interno. Probabilmente è sempre un errore, ma ti permetterà di farlo.
Cascabel

@Ether questo non è affatto il motivo. Puoi creare git addun file anche con marcatori di conflitto. Dopotutto, tali file potrebbero essere perfettamente legali!
fge

@ Jefromi: ah, buono a sapersi! Ho sempre pensato che i marcatori fossero controllati e che sarebbe stato necessario forzarlo oltre se fosse stato intenzionale.
Ether

3

Ho appena avuto questo problema, e anche se penso che potrebbero esserci alcune cause, ecco la mia ...

Avevo un hook pre-commit git che rifiutava i commit in determinate condizioni. Questo va bene quando si esegue il commit manualmente, poiché visualizzerà l'output dell'hook e posso correggerlo o scegliere di ignorarlo usando commit --no-verify.

Il problema sembra essere che durante il rebase, rebase --continue chiamerà anche l'hook (per eseguire il commit dell'ultimo periodo di modifiche). Ma rebase non mostrerà l'output dell'hook, vedrà solo che non è riuscito, quindi sputerà un errore meno specifico che dice "Devi modificare tutti i conflitti di unione e quindi contrassegnarli come risolti usando git add"

Per risolverlo, metti in scena tutte le tue modifiche e invece di fare 'git rebase --continue', prova un 'git commit'. Se soffri dello stesso problema con il gancio, dovresti vedere i motivi per cui non funziona.

È interessante notare che, sebbene git rebase non mostri l'output di git hook, accetta un --no-verify per bypassare gli hook.


1
Ho avuto un problema simile. Nient'altro qui ha funzionato per me, ma solo fare 'git commit' e poi abortire sembrava risolvere magicamente qualunque discrepanza c'era, e quindi sono stato in grado di 'git rebase --continue' con successo.
patrickvacek

Solo per la cronaca, poiché di recente ho avuto problemi con un problema simile, git rebaseaccetta l' --no-verifyopzione. Tuttavia, omette solo l' pre-rebasehook, ma questa opzione non viene applicata alle chiamate successive a git commit.
pkrysiak

Contiene un punto valido (commit delle modifiche) ma troppo dettagliato per una buona risposta.
Jack Miller

2

Dopo aver corretto le modifiche, potresti dimenticare di eseguire "git add -A"

git add -A
git rebase --continue

1

Mi sono appena imbattuto nel problema. Non lo farei git rebase --skip perché git statusmostrano chiaramente le modifiche bloccate, che volevo mantenere. Anche se avevo alcuni file extra arrivati ​​inaspettatamente. Ho risolto con

git checkout .

per rimuovere le modifiche non contrassegnate, quindi è git rebase --continueriuscito.

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.