Как мога да поправя грешен клон на git?

Направих страхотно поправяне на грешния клон. Как мога да анулирам последното фиксиране в основния си клон, а след това да направя същите промени и да ги взема в моята област за обновяване?

414
31 мая '10 в 8:30 2010-05-31 08:30 настроен от mikewilliamson на 31 май 2010 г. в 8:30 ч. 2010-05-31 08:30
@ 8 отговора

Ако все още не сте кликнали върху промените си, можете също да направите меко нулиране:

 git reset --soft HEAD^ 

Това ще върне ангажимент, но ще върне коригираните промени в индекса ви. Ако приемем, че клоновете са относително модерни един спрямо друг, git ще ви позволи да изпълните чек в друг клон, след което можете просто да поправите:

 git checkout branch git commit 

Недостатъкът е, че трябва да въведете отново съобщението за кореспонденция.

618
31 мая '10 в 8:53 2010-05-31 08:53 отговори на Блеър Холоуей на 31 май'10 в 8:53 2010-05-31 08:53

Ако имате чисто (непроменено) работно копие

Превърнете назад една корекция (уверете се, че проверявате хеша за поемане за следващата стъпка):

 git reset --hard HEAD^ 

За да прехвърлите тази фиксация към друг клон:

border=0
 git checkout other-branch git cherry-pick COMMIT-HASH 

Ако сте променили или не сте проследили промените

Също така имайте предвид, че git reset --hard ще убие всички невъзможни за git reset --hard и модифицирани промени , така че ако имате такива, които бихте предпочели:

 git reset HEAD^ git checkout . 
79
31 мая '10 в 8:33 2010-05-31 08:33 отговори на Майкъл Мрозек на 31 май'10 в 8:33 2010-05-31 08:33

4 години закъснение по темата, но може да е полезно за някого.

Ако сте забравили да създадете нов клон, преди да извършите ангажимента и да прехвърлите всичко за овладяване, без значение колко сте направили, следният подход е по-прост:

 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 

Сега основният ви клон е my_feature origin/master , а всички нови my_feature са в my_feature . Обърнете внимание, че my_feature е локален клон, а не отдалечен.

61
06 февр. Отговорът е даден на fotanus 06 Feb. 2014-02-06 17:44 '14 в 17:44 2014-02-06 17:44

Ако вече сте направили промените, ще трябва да принудите следващия след нулиране на HEAD.

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

Внимание: hard reset ще отмени всички предстоящи промени във вашето работно копие, докато натискането ще презапише напълно състоянието на отдалечения клон с текущото състояние на местния клон.

Само в случай, че в Windows (използвайки командния ред на Windows, а не Bash), всъщност има четири ^^^^ вместо един, следователно

 git reset --hard HEAD^^^^ 
17
31 мая '10 в 9:11 2010-05-31 09:11 отговорът е даден от Игор Зевака на 31 май'10 в 9:11 2010-05-31 09:11

Наскоро направих същото, когато случайно преминах към господаря, когато трябваше да се посветя на друг клон. Но аз не натисках нищо.

Ако току-що сте направили грешен клон и не сте променили нищо оттогава и не сте кликнали върху репо, можете да направите следното:

 // 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 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..." 

ЗАБЕЛЕЖКА. В примера по-горе, пренавих 1 фиксация с git reset HEAD ~ 1. Но ако искате да превъртите n коммити, тогава можете да направите git reset HEAD ~ n.

Освен това, ако сте приключили да работите с грешен клон и сте написали друг код, преди да разберете, че сте извършили грешен клон, можете да използвате git stash, за да запазите незавършената работа:

 // 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 

ЗАБЕЛЕЖКА. Използвах този сайт като връзка https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/

4
31 мая '17 в 0:51 2017-05-31 00:51 отговорът е даден от Али Мизан на 31 май'17 в 0:51 часа 2017-05-31 00:51

Така че, ако вашият скрипт е, че сте преминали master , но са били предназначени да преминат към another-branch (което може или не може да съществува), но все още не сте кликнали, това е доста лесно да се поправи.

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

Сега всичките ви ангажименти към master ще бъдат на another-branch .

Източници: http://haacked.com/archive/2015/06/29/git-migrate/

2
08 апр. Отговор Lorcan O'Neill 08 Apr 2016-04-08 16:19 '16 в 16:19 2016-04-08 16:19

Ако срещнете този проблем и имате Visual Studio, можете да направите следното:

Кликнете с десния бутон върху клона си и изберете View History :

2019

05 апр. отговорът е даден Тревор 05 апр. 2017-04-05 02:39 '17 в 2:39 2017-04-05 02:39

Ако клонът, към който искате да приложите промените, вече съществува (например, за да развиете клонове), следвайте инструкциите, предоставени от fotanus по-долу, след това:

 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 

И, очевидно, можете да използвате tempbranch или друго име на клон, вместо my_feature, ако искате.

Освен това, ако е приложимо, забавете изскачащото съобщение (приложете), докато не бъдете обединени в целевия клон.

0
24 авг. отговорът се дава от fbicknel 24 aug. 2016-08-24 01:15 '16 в 1:15 ч. 2016-08-24 01:15

Други въпроси относно тагове или Ask a Question