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?
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.
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 .
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łą.
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^^^^
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/
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
.
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.
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
:
Kliknij prawym przyciskiem myszy commit, do którego chcesz wrócić. I przywróć lub zresetuj w razie potrzeby.
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