Annulla completamente un rebase


255

Ho eseguito un rebase come questo:

git rebase --onto master new_background_processing export_background_processing

Quello non ha fatto quello che volevo, quindi ho eseguito un reset:

git reset --hard HEAD@{1}

Ho riportato il mio ramo allo stato in cui si trovava, ma ho ricevuto questo messaggio quando ho digitato git status:

# You are currently rebasing branch 'export_background_processing' on 'e378641'.

Come posso cancellare completamente questo rebase? Non sono sicuro di cosa significhi di per sé.


16
git rebase --abort
Micha Wiedenmann

6
Git 2.12 ora fornisce git rebase --quit. Vedi la mia risposta di seguito
VonC,

Risposte:


408

Usa git rebase --abort. Dalla documentazione ufficiale del kernel Linux pergit rebase :

git rebase --continue | --skip | --abort | --edit-todo

5
Nel mio caso il git rebase --abortnon ha funzionato, perché ho fatto un casino. Ho ricevuto solo seguente errore: error: could not read '.git/rebase-apply/head-name': directory of file does not exist. Il git rebase --quit muggito descritto ha risolto il mio problema.
Kout

84

Nel caso di un rebase passato che non hai interrotto correttamente, ora (Git 2.12, Q1 2017) hai git rebase --quit

Vedi commit 9512177 (12 nov 2016) di Nguyễn Thái Ngọc Duy ( pclouds) . (Unita da Junio ​​C Hamano - gitster- in commit 06cd5a1 , 19 dic 2016)

rebase: aggiungi --quita cleanup rebase, lascia intatto tutto il resto

Ci sono occasioni in cui decidi di interrompere un rebase in corso e passare a fare qualcos'altro ma ti dimentichi di fare " git rebase --abort" prima . Oppure il rebase è in corso da così tanto tempo che te ne sei dimenticato. Quando ti rendi conto che (ad esempio avviando un altro rebase) è già troppo tardi per tornare sui tuoi passi. La soluzione è normalmente

rm -r .git/<some rebase dir>

e continua con la tua vita.
Ma potrebbero esserci due diverse directory per <some rebase dir>(e ovviamente richiede una certa conoscenza di come funziona rebase), e la parte " .git" potrebbe essere molto più lunga se non si è al vertice o in un worktree collegato. E " rm -r" è molto pericoloso da fare .git, un errore potrebbe distruggere il database degli oggetti o altri dati importanti.

Fornire "git rebase --quit " per questo caso d'uso, imitando un precedente che è " git cherry-pick --quit".


Prima di Git 2.27 (Q2 2020), la voce nascosta creata da " git merge --autostash" per mantenere lo stato iniziale sporco è stata scartata per errore su " git rebase --quit", che è stata corretta.

Vedi commit 9b2df3e (28 aprile 2020) di Denton Liu ( Denton-L) .
(Unita da Junio ​​C Hamano - gitster- in commit 3afdeef , 29 aprile 2020)

rebase: salva la voce di autashash in stash reflog on--quit

Firmato-fuori-da: Denton Liu

In a03b55530a (" merge: teach --autostash option", 2020-04-07, Git v2.27.0 - merge elencato nel batch # 5 ), l' --autostashopzione è stata introdotta pergit merge .

(Vedi " Can“può git pullstash e pop automaticamente le modifiche in sospeso? ")

In particolare, quando git merge --quit viene eseguito con una voce diash automatico, viene salvato nel reflog di stash.

Questo è in contrasto con l'attuale comportamento di git rebase --quit dove la voce di autashash è semplicemente abbandonata.

Adotta il comportamento di git merge --quitin git rebase --quite salva la voce di Autashash nel reflog di stash invece di eliminarla.


3
Questo è molto utile per evitare l'effetto collaterale di ripristinare la directory di lavoro quando vengono apportate modifiche sopra a git rebase, invece di perderle come ho appena fatto: P.
Warlike Chimpanzee,

12

Sei fortunato a non aver completato il rebase, quindi puoi ancora farlo git rebase --abort. Se avessi completato il rebase ( riscrive la storia ), le cose sarebbero state molto più complesse. Prendi in considerazione la possibilità di taggare le punte dei rami prima di eseguire operazioni potenzialmente dannose (in particolare la riscrittura della cronologia), in questo modo puoi riavvolgere se esplode qualcosa.


8

Se stai "Rebasing" , "Già avviato rebase" che desideri annullare , commenta (#)tutti i commit elencati nell'editor rebase.

Di conseguenza riceverai un messaggio da riga di comando

Nothing to do
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.