Domanda Annulla una fusione Git che non è stata ancora spinta


All'interno del mio master branch, ho fatto un git merge some-other-branch localmente, ma non ha mai spinto le modifiche al master di origine. Non intendevo unirmi, quindi mi piacerebbe annullarlo. Quando si fa a git status dopo la mia fusione, ho ricevuto questo messaggio:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Basato su alcuni istruzioni che ho trovato, Ho provato a correre

git revert HEAD -m 1

ma ora sto ricevendo questo messaggio git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Non voglio che la mia filiale sia in vantaggio con un numero qualsiasi di commit. Come ritorno a quel punto?


3075
2018-03-05 19:24


origine


risposte:


Con git reflog controlla quale commit è uno prima dell'unione (git reflog sarà l'opzione migliore di git log). Quindi puoi resettarlo usando:

git reset --hard commit_sha

C'è anche un altro modo

git reset --hard HEAD~1

ti riporterà 1 commit.

Tieni presente che tutti i file modificati e non salvati / non archiviati verranno ripristinati allo stato non modificato. Per tenerli entrambi, riporre o cambiare le modifiche --merge opzione di seguito.


Come @Velmont ha suggerito sotto nella sua risposta, in questo caso diretto usando:

git reset --hard ORIG_HEAD

potrebbe dare risultati migliori, in quanto dovrebbe preservare le tue modifiche. ORIG_HEAD punterà a un commit direttamente prima che si verifichi l'unione, quindi non dovrai cercarlo da solo.


Un altro consiglio è usare il --merge interruttore invece di --hard dal momento che non ripristina i file inutilmente:

--merge

Reimposta l'indice e aggiorna i file nell'albero di lavoro che sono diversi tra <commit> e HEAD, ma mantiene quelli che sono diversi tra l'indice e l'albero di lavoro (cioè che hanno modifiche che non sono state aggiunte).


3367
2018-03-05 19:34



Supponendo che il tuo master locale non fosse in anticipo su origine / master, dovresti essere in grado di farlo

git reset --hard origin/master

Allora il tuo locale master il ramo dovrebbe essere identico a origin/master.


1288
2018-03-17 18:06



Vedere capitolo 4 nel libro Git e il post originale di Linus Torvalds.

Per annullare un'unione questo era già stato spinto:

git revert -m 1 commit_hash

Assicurati di annullare il ripristino se stai ancora commettendo il ramo, come ha detto Linus.


1082
2018-06-02 16:31



È strano che mancasse il comando più semplice. La maggior parte delle risposte funziona, ma annulla l'unione che hai appena fatto, questo è il modo facile e sicuro:

git reset --merge ORIG_HEAD

Il rif ORIG_HEAD punterà al commit originale di prima dell'unione.

(Il --merge l'opzione non ha nulla a che fare con l'unione. È proprio come git reset --hard ORIG_HEAD, ma più sicuro poiché non tocca le modifiche senza commit.)


831
2018-01-29 15:46



Con le versioni Git più recenti, se non hai ancora effettuato l'unione e hai un conflitto di fusione, puoi semplicemente fare:

git merge --abort

A partire dal man git merge:

[Questo] può essere eseguito solo dopo che l'unione ha provocato conflitti. git merge --abort interromperà il processo di unione e tenterà di ricostruire lo stato di pre-unione.


306
2018-02-12 02:13



È necessario ripristinare il commit precedente. Questo dovrebbe funzionare:

git reset --hard HEAD^

O anche HEAD^^ per ripristinare quel ripristino. Puoi sempre dare un riferimento SHA completo se non sei sicuro di quanti passi dovresti fare.

Nel caso in cui si riscontrino problemi e il ramo principale non abbia apportato modifiche locali, è possibile ripristinare a origin/master.


104
2018-03-05 19:31



Ultimamente, sto usando git reflog per aiutare con questo. Questo principalmente funziona solo se si è verificata l'unione JUST, ed è stato sulla tua macchina.

git reflog potrebbe restituire qualcosa come:

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

La prima riga indica che si è verificata un'unione. La seconda linea è il momento prima della mia fusione. io semplicemente git reset --hard 43b6032 per forzare questo ramo a tracciare da prima dell'unione e carry-on.


78
2017-12-19 17:51



Con Git moderno, puoi:

git merge --abort

Sintassi precedente:

git reset --merge

Vecchia scuola:

git reset --hard

Ma in realtà vale la pena di notarlo git merge --abort è solo equivalente a git reset --merge dato che MERGE_HEAD è presente. Questo può essere letto nella guida di Git per il comando di unione.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Dopo una fusione fallita, quando non c'è MERGE_HEAD, l'unione fallita può essere annullata con git reset --merge, ma non necessariamente con git merge --abort, quindi non sono solo la sintassi vecchia e nuova per la stessa cosa.

Personalmente trovo git reset --merge molto più potente e utile nel lavoro di tutti i giorni, quindi è quello che uso sempre.


42
2018-05-08 19:13



Ok, le risposte che altre persone mi hanno dato erano vicine, ma non ha funzionato. Ecco cosa ho fatto.

Facendo questo...

git reset --hard HEAD^
git status

... mi ha dato il seguente stato.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

Ho quindi dovuto digitare lo stesso git reset comando diverse volte. Ogni volta che l'ho fatto, il messaggio è cambiato di uno come puoi vedere qui sotto.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

A questo punto, ho visto il messaggio di stato cambiato, quindi ho provato a farlo git pulle quello sembrava funzionare:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

Per farla breve, i miei comandi sono arrivati ​​a questo:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

32
2018-03-05 19:54



Potresti usare git reflog per trovare il checkout precedente. A volte questo è un buono stato in cui vuoi tornare.

concretamente,

$ git reflog
$ git reset --hard HEAD@{0}

21
2018-01-17 22:36



Se non l'hai ancora fatto, puoi solo usarlo

$ git checkout -f

Annulla l'unione (e tutto ciò che hai fatto).


12
2018-01-18 15:25