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

Jak mogę cofnąć 1 zobowiązanie?

Mam 2 zobowiązania, których nie popchnąłem:

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

Jak mogę cofnąć pierwsze (najstarsze), ale zatrzymać drugie?

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

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

Czy po prostu muszę to zrobić:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

To znaczy?

Odpowiedzi (9)

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

Najbezpieczniejszym i prawdopodobnie najczystszym sposobem jest interaktywne ponowne złożenie zobowiązania.

git rebase -i HEAD^^

lub,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Stamtąd możesz zgnieść zobowiązanie, które łączy jedno lub więcej zobowiązań do poprzedniego zobowiązania. Aby całkowicie usunąć commit z historii, usuń wiersz z listy.

Możesz odwrócić commit z git revert, ale doda on więcej wiadomości do historii, co może być niepożądane. Użyj parametru -n, aby powiedzieć Git'owi, że nie ma zamiaru od razu anulować commit. Możesz interaktywnie zrestartować dane i zgnieść je na poprzednim commmicie, aby zachować czystość.

Jeśli dwa pliki commit, z którymi pracujesz, wpływają na ten sam plik(i), możesz zobaczyć konflikt merge'u.

Resetowanie repozytorium za pomocą git reset --hard powinno być zrobione ostrożnie, ponieważ nie może być cofnięte.

Przepisywanie historii powinno być zrobione ostrożnie.

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

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

Git Delete Last Commit

Once in a late late at night when I ran out of coffee, I commit things that I shouldn’t have. Następnie spędzam kolejne 10-15 minut googlując, jak usunąć ostatnie zobowiązanie, które popełniłem. Więc po raz trzeci chciałem to nagrać, abym mógł się do tego później odnieść.

If you have committed junk but not pushed,

git reset --hard HEAD~1

HEAD~1 is a shorthand for the commit before head. Alternatywnie możesz odwołać się do SHA-1 hasha, na który chcesz zresetować. Zwróć uwagę, że podczas używania –hard wszelkie zmiany w śledzonych plikach w drzewie roboczym od momentu, gdy commit przed głową zostało utracone.

Jeśli nie chcesz wymazać wykonanej pracy, możesz użyć opcji --soft, która usunie commit, ale pozostawi wszystkie zmienione pliki “Changes to be committed”, jak by to określił status git.

Teraz, jeśli już pchnąłeś i ktoś pociągnął, co zazwyczaj jest moją sprawą, nie możesz użyć git resetu. Możesz jednak zrobić git revert,

git revert HEAD

To utworzy nowe commit, które odwróci wszystko wprowadzone przez przypadkowe commit.

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

Nie. Git-reset-twardy przywróci cię do historii. To, czego szukasz, to git-reset, który cofnie każde zaangażowanie.

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

I just done this:

git rebase -i HEAD^^

I screwed it up so I did

git rebase --abort

Then did it again. Potem musiałam naciskać w ten sposób:

git push origin master -f

I to zniszczyło zobowiązania nowsze niż te, do których się cofnęłam. Zadziałało świetnie.

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

W nawiązaniu do komentarza Jtimbermana o tym, że git reset --hard jest nie do naprawienia, nie jest to do końca prawda. Patrz tutaj: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

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

Nie, git reset --hard baf8d5e usunie 3368e1c commit, a HEAD będzie w baf8d5e po nim.

Jeśli chcesz zachować 3368e1c commit i usunąć bad8d5e commit najłatwiejszym rozwiązaniem jest wykonanie “git rebase -i HEAD~2” (tj. interaktywnej bazy dwóch ostatnich commit). To polecenie spowoduje uruchomienie edytora wiadomości commit i zobaczysz jedną linię dla każdego z dwóch ostatnich commitów. Tam po prostu skasujesz linię bad8d5e commit i zapiszesz. git zapisze ponownie Twoją historię i drugie commit zniknie.

W edytorze wiadomości commit możesz użyć innych użytecznych poleceń, takich jak squash, edit, itd. Interaktywna baza danych jest BARDZO potężna!

Nie rób tego, jeśli ktoś już widział te komendy (push lub pull z Twojego repozytorium)!

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

Który przywróci katalog z danego “treeish” dla /path/to/dir

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

jest jedynym sposobem na cofnięcie zobowiązania, jeśli w umowie repo jest tylko jedno inne zobowiązanie (np. początkowe zobowiązanie i 1 więcej). Pozostałe sposoby (revert, rebase) nie działają, przynajmniej od git 1.7.5.1.

Jeśli postępujesz zgodnie z git reset z git gc, git usunie stare dane commit z repo całkowicie.

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

Udało mi się to osiągnąć poprzez ręczną edycję kodów skrótów ostatnich zobowiązań z plików HEAD w folderze repozytorium:

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

Przedtem nigdy nie byłem w stanie wypchnąć na początek operacji UNMERGE, które robiłem lokalnie. Ciągle powtarzał, że “nie udało mi się wypchnąć kilku refów” do centralnego repozytorium.