Ho dimenticato "git rebase --continue" e "git commit". Come risolvere?


112

Stavo ribasando il codice in git, ho avuto alcuni conflitti di unione. Ho risolto i conflitti e ho fatto:

git add

A questo punto mi sono dimenticato di fare:

git rebase --continue

Ho continuato a programmare e ho fatto:

git commit

per le modifiche. Ora sono attivo "no branch"e non posso fare:

git rebase --continue 

Come lo risolvo?


# Attualmente non in nessuna filiale. niente da commettere (directory di lavoro pulita)
Abhilash

Risposte:


4

EDIT : guarda anche la risposta qui sotto per vedere se questa è una soluzione più semplice per te. https://stackoverflow.com/a/12163247/493106


Dovrei provarlo, ma penso che questo sia quello che farei:

  1. Tagga il tuo ultimo commit (o scrivi semplicemente il suo SHA1 da qualche parte in modo da non perderlo): git tag temp
  2. git rebase --abort
  3. Ripeti il ​​rebase. Dovrai risolvere di nuovo l'unione. :(
  4. git rebase --continue
  5. git cherry-pick temp

Il problema con questo è che il tuo tempcommit probabilmente contiene sia la risoluzione dell'unione che il nuovo codice. Quindi potrebbe essere complicato, ma lo proverei e vedrei se funziona.


O puoi taggare come dice @MatrixFrog o puoi salvarlo anche come patch. Quindi esegui il rebase abort. Controlla lo stato per assicurarti che il repository sia in uno stato che sai che non ha avuto problemi, quindi avvia il recupero e il rebase.
yasouser

18
Non farlo. Vedi la risposta di kirikaza di seguito per un modo molto più semplice / pulito. Non scherzare con la scelta e la risoluzione dei conflitti una seconda volta.
tandrewnichols

4
@ Abhilash Per favore accetta la risposta di kirikaza. Io (come ho fatto i tandrewnichols) ho fatto questo e c'era un modo molto più semplice (e Internet sembra essere d'accordo in quanto quella risposta ha il quadruplo dei voti positivi).
David Doria

Ora sono 10 volte i voti positivi ... inoltre, usa git rerere per ricordare le tue risoluzioni dei conflitti (utile, a meno che a volte non prendi cattive risoluzioni che non vuoi che ricordi).
Ajax

217

Fallo e basta git reset --soft HEAD^. Sposta il puntatore HEAD sul suo genitore ma mantiene l'albero di lavoro e aggiunge la modifica di unione all'indice. Quindi puoi continuare a ribasare git rebase --continuecome prima.


1
Ha funzionato perfettamente, ed è stata anche la prima volta che ho trovato un uso per --soft. Bello sapere come funziona, grazie!
mmocny

1
Spero che le persone vedranno tutti i voti positivi su questa risposta e seguiranno ciò che viene suggerito qui!
Raghu

1
Questo è esattamente quello che pensavo (ma potrebbe essere passato duro per caso). Non ero sicuro se HEAD fosse stato aggiornato durante un rebase. Grazie per la conferma! Sono così felice di aver fatto scorrere un po 'di più prima di scherzare con il mal di testa sopra.
DeezCashews

Ho modificato la risposta accettata per inserire un collegamento qui: non ho visto questa risposta fino a quando non ho seguito le istruzioni sopra.
xaxxon

0

Ho avuto lo stesso problema e, come se non bastasse, ho ribasato tre commit e, dopo aver risolto i conflitti sul secondo commit, ho "eseguito il commit" invece di "rebase --continue".

Di conseguenza ho avuto questo reflog git

Quando ho applicato la soluzione di kirikaza, ho semplicemente annullato il terzo commit e non il secondo, il che era problematico ..

Come puoi vedere, il rebase inizia con un checkout dal ramo remotes / origin / master e poi applica i miei tre commit che appaiono come le tre operazioni precedenti (prima del checkout) nel reflog.

Quindi, se vuoi riavviare da una base pulita, prima del rebase, puoi semplicemente reimpostare in modo definitivo l'hash appena prima del checkout dell'operazione di rebase. Nel mio caso (vedi l'immagine):

git reset --hard 859ed3c

Quindi puoi iniziare un nuovo file git rebase.


0

Avevo git ribasato, risolto conflitti, git aggiunto file con conflitti e (erroneamente) eseguito il commit.

Ho provato le soluzioni git reset --soft HEAD^e git reset --hardfornite, ma nessuna delle due ha funzionato per me.

Tuttavia, ha git rebase --abortfunzionato: mi ha portato indietro a prima dell'inizio del rebase con un albero funzionante pulito.

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.