Jak naprawić commitowanie do niewłaściwej gałęzi Git?

Właśnie zrobiłem całkiem dobry commit do złej gałęzi. Jak cofnąć ostatnią zmianę w gałęzi master, a następnie wprowadzić te same zmiany do gałęzi upgrade?

Author: mikewilliamson, 2010-05-31

8 answers

Jeśli jeszcze nie przesunąłeś zmian, Możesz również wykonać miękki reset:

git reset --soft HEAD^

Spowoduje to odwrócenie zmian, ale przywróci je do twojego indeksu. Zakładając, że gałęzie są relatywnie aktualne względem siebie, git pozwoli Ci wykonać checkout w innej gałęzi, po czym możesz po prostu zatwierdzić:

git checkout branch
git commit

Wadą jest to, że musisz ponownie wprowadzić wiadomość o zatwierdzeniu.

 733
Author: Blair Holloway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-31 05:53:20

Jeśli masz czystą (niezmodyfikowaną) kopię roboczą

Aby cofnąć jeden commit (pamiętaj, aby zapamiętać hash commita dla następnego kroku):

git reset --hard HEAD^

Aby ściągnąć ten commit do innej gałęzi:

git checkout other-branch
git cherry-pick COMMIT-HASH

Jeśli zmieniłeś lub nie śledziłeś zmian

Zauważ również, że git reset --hard będzie zabijać wszelkie Nie śledzone i zmodyfikowane zmiany możesz mieć, więc jeśli masz te, które możesz preferować:

git reset HEAD^
git checkout .
 93
Author: Michael Mrozek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-18 07:37:13

4 lata spóźnienia w temacie, ale to może komuś pomóc.

Jeśli zapomniałeś utworzyć nową gałąź przed zatwierdzeniem i zatwierdzeniem wszystkich NA master, bez względu na to, ile commitów zrobiłeś, następujące podejście jest łatwiejsze:

git stash                       # skip if all changes are committed
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop                   # skip if all changes were committed

Teraz masz gałąź master równą origin/master i wszystkie nowe commity są włączone my_feature. Zauważ, że my_feature jest lokalną gałęzią, a nie odległą.

 86
Author: fotanus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-01 16:45:07

Jeśli już przesunąłeś zmiany, będziesz musiał wymusić następne pchnięcie po zresetowaniu głowy.

git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force

Warning: twardy reset cofnie wszelkie niezatwierdzone modyfikacje w Twojej kopii roboczej, podczas gdy wymuszone naciśnięcie całkowicie nadpisze stan zdalnej gałęzi z bieżącym stanem lokalnej gałęzi.

Na wszelki wypadek, w systemie Windows (używając wiersza poleceń Windows, a nie Bash) jest to w rzeczywistości cztery ^^^^ zamiast jednego, więc jest to

git reset --hard HEAD^^^^
 17
Author: Igor Zevaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-18 07:32:24

Ostatnio zrobiłem to samo, gdzie przypadkowo popełniłem zmianę NA master, kiedy powinienem był zaangażować się w inną gałąź. Ale niczego nie naciskałem.

Jeśli po prostu zaangażowałeś się w niewłaściwą gałąź i od tego czasu nic nie zmieniłeś i nie pchnąłeś się do repo, możesz zrobić co następuje:

// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes. 
git reset HEAD~1 

// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash

// create other-branch (if the other branch doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// take the temporary commit you created, and apply all of those changes to the new branch. 
//This also deletes the temporary commit from the stack of temp commits.
git stash pop

// add the changes you want with git add...

// re-commit your changes onto other-branch
git commit -m "some message..."

Uwaga: w powyższym przykładzie przewijałem 1 commit z GIT reset HEAD~1. Ale jeśli chcesz przewijać N commitów, możesz zrobić Git reset HEAD~n.

Ponadto, jeśli skończyłeś na przypisaniu się do niewłaściwej gałęzi, a także napisałeś więcej kodu, zanim zdałeś sobie sprawę, że przypisałeś się do niewłaściwej gałęzi, możesz użyć git stash, aby zapisać swoją trwającą pracę:

// save the not-ready-to-commit work you're in the middle of
git stash 

// rewind n commits
git reset HEAD~n 

// stash the committed changes as a single temp commit onto the stack. 
git stash 

// create other-branch (if it doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// apply all the committed changes to the new branch
git stash pop

// add the changes you want with git add...

// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."

// pop the changes you were in the middle of and continue coding
git stash pop

Uwaga: użyłem tej strony jako odniesienia https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/

 9
Author: Ali Mizan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 21:51:29

Więc jeśli twój scenariusz jest taki, że zobowiązałeś się do master, ale zamierzałeś zobowiązać się do another-branch (który może lub nie może jeszcze nie istnieć), ale jeszcze nie naciskałeś, jest to dość łatwe do naprawienia.

// if your branch doesn't exist, then add the -b argument 
git checkout -b another-branch
git branch --force master origin/master

Teraz wszystkie Twoje commity do {[1] } będą włączone another-branch.

Http://haacked.com/archive/2015/06/29/git-migrate/

 5
Author: Lorcan O'Neill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-08 13:19:46

Jeśli gałąź, do której chcesz zastosować zmiany, już istnieje( na przykład gałąź develop), postępuj zgodnie z instrukcjami dostarczonymi przez fotanus poniżej, to:

git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature

I oczywiście możesz użyć tempbranch lub innej nazwy gałęzi zamiast my_feature, Jeśli chcesz.

Również, jeśli ma to zastosowanie, opóźnij wpis skrytki (Zastosuj) do czasu połączenia się w docelowej gałęzi.

 0
Author: fbicknel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:09

Jeśli napotkasz ten problem i masz Visual Studio, możesz wykonać następujące czynności:

Kliknij prawym przyciskiem myszy na swojej gałęzi i wybierz View History:

Tutaj wpisz opis obrazka

Kliknij prawym przyciskiem myszy commit, do którego chcesz wrócić. I przywróć lub zresetuj w razie potrzeby.

Tutaj wpisz opis obrazka

 0
Author: Trevor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-04 23:39:24