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 pull
e 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