2009-09-03 21:23:58 +0000 2009-09-03 21:23:58 +0000
133
133

Hoe kan ik 1 commit terugdraaien?

Ik heb 2 commits die ik niet heb geduwd:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

Hoe kan ik mijn eerste terugdraaien (de oudste), maar de tweede behouden?

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Vanaf hier: http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Moet ik gewoon:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

doen Dat is?

Antwoorden (9)

99
99
99
2009-09-03 21:32:01 +0000

De veiligste en waarschijnlijk schoonste manier om te gaan is door interactief te rebasen.

git rebase -i HEAD^^

Of,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Vanaf daar kun je commits verpletteren, wat een of meer commits samenbrengt in de vorige commit. Om een vastlegging volledig uit de geschiedenis te verwijderen, verwijder je de regel uit de lijst.

Je kunt een vastlegging terugzetten met git revert, maar het gaat om meer vastleggingsberichten toe te voegen aan de geschiedenis, wat ongewenst kan zijn. Gebruik de -n parameter om Git te vertellen dat hij de vastlegging niet meteen moet terugzetten. Je kunt interactief rebasen en deze verpletteren tot aan een vorige commmit om de dingen schoon te houden.

Als de twee commits waar je mee werkt hetzelfde bestand of dezelfde bestanden beïnvloeden, kun je een samenvoegingsconflict zien.

Het resetten van het archief met git reset --hard moet met zorg gebeuren, omdat het niet ongedaan gemaakt kan worden.

Herschrijven van de geschiedenis moet met zorg gedaan worden.

54
54
54
2011-08-05 17:52:58 +0000

Dit als van http://nakkaya.com/2009/09/24/git-delete-last-commit/ en het werkte voor mij

Git Delete Last Commit

Af en toe laat in de avond toen ik zonder koffie kwam te zitten, ik dingen vastleg die ik niet had moeten doen. Dan ga ik de volgende 10 - 15 minuten googlen hoe ik de laatste afspraak die ik gemaakt heb kan verwijderen. Dus na de derde keer wilde ik er een verslag van maken zodat ik er later naar kan verwijzen.

Als je wel rommel hebt vastgelegd maar niet geduwd,

git reset --hard HEAD~1

HEAD~1 is een steno voor de vastlegging voor het hoofd. Als alternatief kun je verwijzen naar de SHA-1 van de hash waar je naar wilt resetten. Merk op dat als je –hard alle wijzigingen aan bijgehouden bestanden in de werkboom gebruikt sinds de vastlegging voor hoofd verloren zijn gegaan.

Als je het werk dat je gedaan hebt niet wilt wissen, kun je de --soft optie gebruiken die de vastlegging zal verwijderen, maar het zal al je gewijzigde bestanden “Veranderingen die vastgelegd moeten worden” laten staan, zoals git status het zou zeggen.

Als je nu al geduwd hebt en iemand heeft getrokken wat meestal mijn geval is, kun je geen git reset gebruiken. Je kunt echter wel een git revert doen,

git revert HEAD

Dit zal een nieuwe commit creëren die alles terugdraait wat door de toevallige commit geïntroduceerd is.

8
8
8
2009-09-03 21:26:55 +0000

Nope. Git-reset –hard brengt je terug in de geschiedenis. Wat je zoekt is Git-reset, wat elke verbintenis ongedaan zal maken.

6
6
6
2011-12-12 04:39:48 +0000

Ik heb net dit gedaan:

git rebase -i HEAD^^

Ik heb het verknald dus heb ik

git rebase --abort

gedaan. Toen moest ik zo duwen:

git push origin master -f

en het vernietigde de commits nieuwer dan de commits waar ik naar teruggerold was. Werkte geweldig.

4
4
4
2010-01-28 03:48:38 +0000

Met betrekking tot de opmerking van jtimberman over het feit dat git reset --hard ongedaan gemaakt kan worden, is dat niet helemaal waar. Zie hier: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1 ](https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1)

4
4
4
2009-09-03 21:46:37 +0000

Nee, git reset --hard baf8d5e zal de 3368e1c commit verwijderen en HEAD zal daarna bij baf8d5e zijn.

Als je de 3368e1c commit wilt behouden en de bad8d5e commit wilt verwijderen is de makkelijkste oplossing om een “git rebase -i HEAD~2” te doen (d.w.z. interactieve rebase van de laatste twee commits). Dit commando zal je vastleggingsbericht editor starten en je zult een regel zien voor elk van de laatste twee commits. Daar verwijder je gewoon de bad8d5e commit regel en sla je op. git zal dan je geschiedenis herschrijven en de 2de commit zal weg zijn.

Er zijn andere nuttige commando’s die je kunt gebruiken in de commit message editor zoals squash, edit, etc. Interactieve rebase is ZEER krachtig!

Doe dit niet als iemand deze commits al gezien heeft (push of pull van je repository)!

1
1
1
2012-10-12 09:23:13 +0000
git checkout <treeish> -- /path/to/dir

Dat brengt de directory terug van de gegeven “boomachtige” voor de /path/to/dir

1
1
1
2012-02-28 20:17:27 +0000
git reset --hard {ref}

is de enige manier om een vastlegging ongedaan te maken als er slechts één andere vastlegging in de repo staat (bijv. initiële vastlegging en nog 1 vastlegging). De rest van de manieren (terugzetten, rebasen) weigeren te werken, tenminste vanaf git 1.7.5.1.

Als je de git reset met een git gc volgt, dan zal git in feite de oude commit data volledig uit de repo verwijderen.

0
0
0
2014-06-13 00:08:14 +0000

Ik heb dit aan het werk gezet door de hash codes van de laatste commits van HEAD bestanden in de repository map:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

handmatig te bewerken. Het bleef zeggen dat het “niet lukte om een aantal refs te pushen” naar de Central Repository.