Jak mogę cofnąć 1 zatwierdzenie?

127

Mam 2 zatwierdzenia, których nie wypchnąłem:

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

Jak mogę przywrócić mój pierwszy (najstarszy), ale zachować drugi?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Stąd:

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

Czy muszę po prostu zrobić:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

To jest?

n179911
źródło
3
To pytanie wydaje się być nie na temat, ponieważ dotyczy narzędzia programistycznego. Należy do Przepełnienia stosu.
Peter Mortensen
@PeterMortensen Zgoda. Dotyczy to SuperUser
Kanion Kolob

Odpowiedzi:

95

Najbezpieczniejszym i prawdopodobnie najczystszym sposobem jest interakcja.

git rebase -i HEAD^^

Lub,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Stamtąd możesz zgniatać zatwierdzenia, co łączy jeden lub więcej zatwierdzeń razem w poprzednim zatwierdzeniu. Aby całkowicie usunąć zatwierdzenie z historii, usuń wiersz z listy.

Możesz cofnąć zatwierdzenie za pomocą, git revertale spowoduje to dodanie większej liczby komunikatów zatwierdzenia do historii, co może być niepożądane. Użyj tego -nparametru, aby powiedzieć Gitowi, aby nie dokonywał natychmiastowego przywracania. Możesz bazować interaktywnie i wyciskać je do poprzedniego zlecenia, aby utrzymać porządek.

Jeśli dwa zatwierdzenia, nad którymi pracujesz, wpływają na te same pliki, możesz zobaczyć konflikt scalania.

Resetowanie repozytorium za pomocą git reset --hardnależy wykonać ostrożnie, ponieważ nie można go cofnąć.

Przepisywanie historii powinno odbywać się ostrożnie.

jtimberman
źródło
Jak mogę usunąć zatwierdzenie podczas „git rebase”? Istnieją tylko 3 polecenia: wybieranie, edycja, squash. Nie ma usunięcia AFAIK.
n179911
8
całkowicie usuwa wiersz z listy i usuwa to dokonanie
jtimberman
kiedy chciałem cofnąć zmianę, nie chciałem pozostawiać po niej śladu. Jeśli chcesz również nie pozostawiać śladu swojego powrotu, jest to najlepszy sposób, aby to zrobić.
Phillip Whelan,
„najbezpieczniejszym i prawdopodobnie najczystszym sposobem jest interakcja z bazami” Może nie, jeśli nie używasz vima. Miałem szczęście i wymyśliłem sobie drogę do wyjścia z tego bałaganu. Wciąż entuzjastycznie, bo powinienem nauczyć się vim :-)
isimmons,
Sugerowałbym użycie rebasemniejszej ilości, jak to możliwe. Jeśli pracujesz z innymi, po prostu zrób revert.
boldnik
52

To jeśli z http://nakkaya.com/2009/09/24/git-delete-last-commit/ i zadziałało dla mnie

Git Usuń ostatnie zatwierdzenie

Raz na jakiś czas późno w nocy, kiedy zabrakło mi kawy, popełniam rzeczy, których nie powinienem mieć. Następnie spędzam następne 10–15 minut na wyszukiwaniu, jak usunąć ostatni zatwierdzony plik. Więc po raz trzeci chciałem go nagrać, aby móc później do niego wrócić.

Jeśli popełniłeś śmieci, ale nie wypchnąłeś ich,

git reset --hard HEAD~1

HEAD ~ 1 jest skrótem dla zatwierdzenia przed głową. Alternatywnie możesz odwołać się do SHA-1 skrótu, który chcesz zresetować. Zauważ, że podczas używania --hard wszelkie zmiany w śledzonych plikach w pracującym drzewie od czasu utraty zatwierdzenia przed głową.

Jeśli nie chcesz wymazać pracy, którą wykonałeś, możesz użyć --softopcji, która usunie zatwierdzenie, ale pozostawi wszystkie zmienione pliki „Zmiany do zatwierdzenia”, tak jak napisałby status git.

Teraz, jeśli już nacisnąłeś i ktoś pociągnął, co zwykle jest moim przypadkiem, nie możesz użyć git reset. Możesz jednak przywrócić git,

git revert HEAD

Spowoduje to utworzenie nowego zatwierdzenia, które odwróci wszystko wprowadzone przez przypadkowe zatwierdzenie.

iStryker
źródło
2
Dzięki opcji --soft idealnie nadaje się do zmiany nazwy pliku i przypadkowego „git commit -a” zamiast używania najpierw „git add”.
Aaron Harun
8

Nie. git-reset --hard przywróci cię do historii. To, czego szukasz, to git revert, który cofnie zatwierdzenie.

Peltier
źródło
4
Cóż, to działa, ale zanieczyszcza również rejestrację. Jeśli te zatwierdzenia nie zostały już wypchnięte / wyciągnięte, lepiej je wyczyścić za pomocą interaktywnego rebase. Możliwość zmiany historii jest jedną z głównych zalet git w porównaniu z innymi systemami kontroli wersji.
knweiss,
6

Właśnie to zrobiłem:

git rebase -i HEAD^^

Zepsułem to, więc zrobiłem

git rebase --abort

Zrobiłem to jeszcze raz. Potem musiałem naciskać w ten sposób:

git push origin master -f

I zniszczyło to zatwierdzenia nowsze niż zatwierdzenie, do którego przywróciłem. Działa świetnie.

hamstar
źródło
4

Nie, git reset --hard baf8d5eusunie 3368e1czatwierdzenie, a HEAD będzie baf8d5epóźniej.

Jeśli chcesz zachować 3368e1czatwierdzenie i usunąć bad8d5ezatwierdzenie, najłatwiejszym rozwiązaniem jest zrobienie „ git rebase -i HEAD~2” (tzn. Interaktywnej bazy dwóch ostatnich zatwierdzeń). To polecenie uruchomi edytor komunikatów zatwierdzania i zobaczysz jeden wiersz dla każdego z dwóch ostatnich zatwierdzeń. Tam po prostu usuwasz bad8d5elinię zatwierdzenia i zapisujesz. git następnie przepisuje twoją historię i 2. zatwierdzenie zniknie.

Istnieją inne przydatne polecenia można użyć w popełnienia edytorze wiadomości jak squash, edititp Interactive rebase jest bardzo silny!

Nie rób tego, jeśli ktoś już widział te zatwierdzenia (wypychanie lub wyciąganie z repozytorium)!

knweiss
źródło
1
git reset --hard {ref}

jest jedynym sposobem na cofnięcie zatwierdzenia, jeśli w repozytorium jest tylko jedno zatwierdzenie (np. wstępne zatwierdzenie i jeszcze 1). Pozostałe sposoby (revert, rebase) odmawiają działania, przynajmniej od wersji 1.7.5.1.

Jeśli zastosujesz się do git resetniego, git gcgit faktycznie usunie stare dane zatwierdzenia z repozytorium.

wycieraczka gumowa
źródło
1
git checkout <treeish> -- /path/to/dir

Spowoduje to powrót katalogu z podanego „drzewiastego” katalogu / path / to / dir

lokeshpahal
źródło
0

Mam to do pracy, ręcznie edytując kody skrótu ostatnich zatwierdzeń z plików HEAD w folderze repozytorium:

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

Wcześniej nigdy nie byłem w stanie naciskać na rozpoczęcie operacji UNMERGE, które wykonywałem lokalnie. Powtarzał, że „nie wypchnął niektórych referencji” do Centralnego repozytorium.

Leandro M.
źródło