Vraag Maak een Git-fusie ongedaan die nog niet is gepusht


In mijn meestertak deed ik het git merge some-other-branch lokaal, maar nooit de wijzigingen naar de originemeester gepusht. Ik wilde niet samenvoegen, dus ik zou het ongedaan willen maken. Bij het doen van een git status na mijn fusie kreeg ik deze boodschap:

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

Gebaseerd op wat instructies die ik heb gevonden, Ik probeerde te rennen

git revert HEAD -m 1

maar nu krijg ik deze boodschap git status:

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

Ik wil niet dat mijn kantoor vooroploopt door een aantal commits. Hoe kom ik op dat punt terug?


3075
2018-03-05 19:24


oorsprong


antwoorden:


Met git reflog controleer welke commit een is voorafgaand aan de samenvoeging (git reflog is een betere optie dan git log). Vervolgens kunt u het opnieuw instellen met behulp van:

git reset --hard commit_sha

Er is ook een andere manier

git reset --hard HEAD~1

krijg je 1 commit terug.

Houd er rekening mee dat alle gewijzigde en niet-gecommiteerde / niet-opgeslagen bestanden worden teruggezet naar hun ongewijzigde status. Om ze te houden, worden wijzigingen weggestopt of zien --merge optie hieronder.


Zoals @Velmont in zijn antwoord hieronder suggereerde, in dit geval:

git reset --hard ORIG_HEAD

kan betere resultaten opleveren, omdat het uw wijzigingen moet bewaren. ORIG_HEAD zal naar een commit wijzen direct voordat het samenvoegen is gebeurd, dus je hoeft er niet zelf op te jagen.


Een verdere tip is om de --merge schakelen in plaats van --hard omdat het bestanden niet onnodig reset:

--merge

Hiermee wordt de index opnieuw ingesteld en worden de bestanden in de werkstructuur bijgewerkt die verschillen tussen <commit> en HEAD, maar de bestanden in de werkstructuur die verschillen tussen de index en de werkstructuur (dus met wijzigingen die niet zijn toegevoegd).


3368
2018-03-05 19:34



Ervan uitgaande dat uw lokale meester niet voor op de oorsprong / master stond, zou u moeten kunnen doen

git reset --hard origin/master

Dan is uw lokale master tak moet er identiek uitzien origin/master.


1289
2018-03-17 18:06



Zien hoofdstuk 4 in het Git-boek en de originele post door Linus Torvalds.

Een samenvoeging ongedaan maken dat was al gepusht:

git revert -m 1 commit_hash

Zorg ervoor dat je de teruggave ongedaan maakt als je de vestiging opnieuw begaat, zoals Linus zei.


1083
2018-06-02 16:31



Het is vreemd dat de eenvoudigste opdracht ontbrak. De meeste antwoorden werken, maar de samenvoeging ongedaan maken die u net hebt gedaan, dit is de gemakkelijke en veilige manier:

git reset --merge ORIG_HEAD

De ref ORIG_HEAD verwijst naar de oorspronkelijke commit van vóór de samenvoeging.

(De --merge optie heeft niets te maken met de samenvoeging. Het is net zoals git reset --hard ORIG_HEAD, maar veiliger omdat het ongecommitteerde wijzigingen niet raakt.)


831
2018-01-29 15:46



Met nieuwere Git-versies, als je de samenvoeging nog niet hebt vastgelegd en je hebt een samenvoegingsconflict, je kunt gewoon doen:

git merge --abort

Van man git merge:

[Dit] kan alleen worden uitgevoerd nadat het samenvoegen heeft geresulteerd in conflicten. git merge --abort zal het samenvoegproces afbreken en proberen de voor samenvoegstatus te reconstrueren.


306
2018-02-12 02:13



Je zou moeten terugkeren naar de vorige commit. Dit zou moeten werken:

git reset --hard HEAD^

Of zelfs HEAD^^ om dat terugdraaien vast te leggen. U kunt altijd een volledige SHA-referentie geven als u niet zeker weet hoeveel stappen u moet nemen.

In het geval dat u problemen ondervindt en uw hoofdtak geen lokale wijzigingen heeft aangebracht, kunt u deze opnieuw instellen op origin/master.


104
2018-03-05 19:31



De laatste tijd gebruik ik git reflog om hiermee te helpen. Dit werkt meestal alleen als de samenvoeging JUST gebeurde en deze op je computer stond.

git reflog kan iets teruggeven als:

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

De eerste regel geeft aan dat er een samenvoeging heeft plaatsgevonden. De 2e regel is de tijd vóór mijn samenvoeging. Ik gewoon git reset --hard 43b6032 om deze tak te laten volgen van vóór de fusie en door te gaan.


78
2017-12-19 17:51



Met moderne Git kunt u:

git merge --abort

Oudere syntaxis:

git reset --merge

Ouderwets:

git reset --hard

Maar eigenlijk is het de moeite waard dat op te merken git merge --abort is alleen equivalent aan git reset --merge gezien dat MERGE_HEAD is aanwezig. Dit is te lezen in de opdracht Git help voor samenvoegen.

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

Na een mislukte samenvoeging, wanneer er geen is MERGE_HEAD, de mislukte samenvoeging kan ongedaan worden gemaakt git reset --merge, maar niet noodzakelijkerwijs met git merge --abort, dus ze zijn niet alleen de oude en nieuwe syntaxis voor hetzelfde.

Persoonlijk vind ik dat git reset --merge veel krachtiger en bruikbaarder in het dagelijkse werk, dus dat is degene die ik altijd gebruik.


42
2018-05-08 19:13



Oké, de antwoorden die andere mensen hier me gaven waren in de buurt, maar het werkte niet. Dit is wat ik deed.

Dit doen...

git reset --hard HEAD^
git status

... gaf me de volgende status.

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

Ik moest toen hetzelfde typen git reset meerdere keren op commando. Elke keer dat ik dat deed, veranderde het bericht met een bericht zoals je hieronder kunt zien.

> 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.

Op dit punt zag ik de statusmelding veranderen, dus ik probeerde het te doen git pull, en dat leek te werken:

> 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

Zo lang verhaal kort, mijn commando's kwamen hierop neer:

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

32
2018-03-05 19:54