Kaip nustatyti neteisingą git šaką?

Aš tiesiog padariau puikią klaidą netinkamoje šakoje. Kaip galiu atšaukti paskutinį įvykį mano pagrindiniame filiale ir tada padaryti tuos pačius pakeitimus ir gauti juos naujinimo skyriuje?

414
31 мая '10 в 8:30 2010-05-31 08:30 nustatė mikewilliamson gegužės 31 d. 10.30 val. 2010-05-31 08:30
@ 8 atsakymai

Jei dar nepaspaudėte savo pakeitimų, taip pat galite atlikti programinę įrangą iš naujo:

 git reset --soft HEAD^ 

Tai grąžins įsipareigojimą, bet grąžins pataisytus jūsų indekso pakeitimus. Darant prielaidą, kad filialai yra palyginti modernūs vienas kito atžvilgiu, „git“ leis jums atlikti čekį kitame filiale, po kurio galite tiesiog išspręsti:

 git checkout branch git commit 

Trūkumas yra tas, kad jums reikia iš naujo įvesti įvykio pranešimą.

618
31 мая '10 в 8:53 2010-05-31 08:53 atsakė Blairui Hollovei gegužės 10 d. 8:53 val. 2010-05-31 08:53

Jei turite švarią (nepakeistą) darbo kopiją

Perkelkite vieną įvykį (įsitikinkite, kad kitą veiksmą patikrinote įvykdymą):

 git reset --hard HEAD^ 

Jei norite perkelti šį įrašą į kitą filialą:

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

Jei pakeitėte arba nepaisėte pakeitimų

Taip pat atkreipkite dėmesį, kad git reset --hard nužudys visus git reset --hard ir modifikuotus pakeitimus, kurie gali būti, taigi, jei turite tokių, kurie jums gali būti naudingi:

 git reset HEAD^ git checkout . 
79
31 мая '10 в 8:33 2010-05-31 08:33 atsakė Michaelui Mrozekui gegužės 31 d. 10 val. 8:33 2010-05-31 08:33

4 metai vėlai temoje, tačiau jis gali būti naudingas kitam.

Jei pamiršote sukurti naują filialą, prieš pradėdami ir perduodami viską, kas jums reikia, nesvarbu, kiek jūs tai padarėte, toks požiūris yra paprastesnis:

 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 

Dabar jūsų pagrindinis filialas yra origin/master , o visi nauji įsipareigojimai yra my_feature . Atkreipkite dėmesį, kad my_feature yra vietinis filialas, o ne nuotolinis.

61
06 февр. Atsakymas pateiktas fotanus 06 Feb. 2014-02-06 17:44 '14 at 17:44 2014-02-06 17:44

Jei jau atlikote pakeitimus, kitą kartą iš naujo nustatysite HEAD.

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

Įspėjimas: kietojo atstatymo metu bus atšaukti visi laukiantys darbo kopijos pakeitimai, o stūmimas visiškai perrašys nuotolinio filialo būseną su dabartine vietinės filialo būsena.

Bet kuriuo atveju „Windows“ (naudojant „Windows“ komandinę eilutę, o ne „Bash“), iš tikrųjų yra keturios ^^^^ vietoj vienos, todėl

 git reset --hard HEAD^^^^ 
17
31 мая '10 в 9:11 2010-05-31 09:11 atsakymą pateikė Igoris Zevaka gegužės 10 d., 10 val

Neseniai dariau tą patį, kai atsitiktinai pereidavau prie šeimininko, kai turėjau skirti sau kitą filialą. Bet aš nieko nedariau.

Jei ką tik padarėte neteisingą filialą ir po to nieko nekeičiate ir nepaspaudėte repo, galite atlikti šiuos veiksmus:

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

PASTABA. Pirmiau pateiktame pavyzdyje aš sugrąžinau 1 fiksaciją su git reset HEAD ~ 1. Bet jei norite atsukti n, tai galite padaryti git reset HEAD ~ n.

Be to, jei baigėte darbą su neteisingu filialu ir taip pat baigėte rašyti kitą kodą, prieš suvokdami, kad padarėte neteisingą filialą, tada galite naudoti git stash, kad išsaugotumėte nebaigtą darbą:

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

PASTABA. Šią svetainę naudoju kaip nuorodą 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 atsakymą pateikė „ Ali Mizan “ gegužės 31 d. 17, 00:51 00-31 00:51

Taigi, jei jūsų scenarijus yra tas, kad išlaikėte master , bet buvo skirtas perduoti another-branch (kuris gali būti arba gali nebūti), bet dar nepaspaudėte, tai gana lengva išspręsti.

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

Dabar visi jūsų įsipareigojimai master bus another-branch .

Šaltiniai: http://haacked.com/archive/2015/06/29/git-migrate/

2
08 апр. Atsakyti Lorcan O'Neill 08 Bal 2016-04-08 16:19 '16, 16:19 PM 2016-04-08 16:19

Jei susiduriate su šia problema ir turite „Visual Studio“, galite atlikti šiuos veiksmus:

Dešiniuoju pelės mygtuku spustelėkite filialą ir pasirinkite View History :

2019

05 апр. atsakymas pateikiamas Trevor 05 balandžio. 2017-04-05 02:39 '17 at 2:39 2017-04-05 02:39

Jei filialas, kuriam norėjote taikyti pakeitimus, jau egzistuoja (pvz., Filialams kurti), vadovaukitės žemiau pateiktomis fotanus instrukcijomis, tada:

 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 

Ir, žinoma, galite naudoti tempbranch arba bet kurį kitą šakos pavadinimą, o ne mano_feature, jei norite.

Be to, jei taikytina, palaukite iššokantį pranešimą (taikomas), kol susivienysite savo tikslinėje šakoje.

0
24 авг. atsakymą pateikė fbicknel 24 rug . 2016-08-24 01:15 '16 at 1:15 am 2016-08-24 01:15

Kiti klausimai apie tag žymes arba užduoti klausimą