Kako popraviti pogrešan git git?

Napravio sam veliku grešku na pogrešnoj grani. Kako mogu otkazati posljednju pohranu u glavnoj grani, a zatim izvršiti iste promjene i dobiti ih u svojoj grani ažuriranja?

414
31 мая '10 в 8:30 2010-05-31 08:30 postavila mikewilliamson dana 31. svibnja 2010. u 8:30 AM 2010-05-31 08:30
@ 8 odgovora

Ako još niste kliknuli na svoje promjene, možete izvršiti i soft resetiranje:

 git reset --soft HEAD^ 

Ovo će vratiti urezivanje, ali će vratiti ispravljene promjene u indeks. Pod pretpostavkom da su grane relativno moderne jedna u odnosu na drugu, git će vam omogućiti da pokrenete ček u drugoj grani, nakon čega možete jednostavno popraviti:

 git checkout branch git commit 

Nedostatak je što morate ponovno unijeti poruku urezivanja.

618
31 мая '10 в 8:53 2010-05-31 08:53 odgovorila Blair Holloway 31. svibnja '10 u 8:53 2010-05-31 08:53

Ako imate čistu (nemodificiranu) radnu kopiju

Vratite jednu obvezu (provjerite jeste li označili hash za sljedeći korak):

 git reset --hard HEAD^ 

Za prijenos ove popravke u drugu granu:

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

Ako ste promijenili ili niste pratili promjene

Također imajte na umu da će git reset --hard ubiti sve izmjene koje se ne mogu reproducirati i izmijeniti , tako da ako imate one koje možda više volite:

 git reset HEAD^ git checkout . 
79
31 мая '10 в 8:33 2010-05-31 08:33 odgovorio je Michaelu Mrozeku 31. svibnja 2010. u 8:33 2010-05-31 08:33

4 godine kasni na temu, ali nekome može biti korisno.

Ako ste zaboravili stvoriti novu granu prije nego što urezujete i prenesete sve na master, bez obzira na to koliko ste učinili, sljedeći pristup je jednostavniji:

 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 

Sada je vaša glavna grana origin/master , a sve nove my_feature su na my_feature . Napominjemo da je my_feature lokalna podružnica, a ne udaljena.

61
06 февр. Odgovor je dat fotanus 06. veljače. 2014-02-06 17:44 '14 u 17:44 2014-02-06 17:44

Ako ste već napravili promjene, morat ćete prisiliti sljedeću nakon resetiranja HEAD.

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

Upozorenje: hard reset će poništiti sve promjene na čekanju u vašoj radnoj kopiji, dok će pritiskanje potpuno prepisati stanje udaljene grane trenutnim stanjem lokalne podružnice.

Za svaki slučaj, u sustavu Windows (koristeći naredbenu liniju sustava Windows, a ne Bash), postoje zapravo četiri ^^^^ umjesto jednog, dakle

 git reset --hard HEAD^^^^ 
17
31 мая '10 в 9:11 2010-05-31 09:11 odgovor je dao Igor Zevaka 31. svibnja 2010. u 9:11 2010-05-31 09:11

Nedavno sam to učinio kad sam slučajno prešao na gospodara, kada sam se morao posvetiti drugoj grani. Ali nisam ništa gurnula.

Ako ste upravo napravili pogrešnu granu i niste ništa promijenili od tada i niste kliknuli na repo, možete učiniti sljedeće:

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

NAPOMENA. U gornjem primjeru sam preokrenuo 1 fiksaciju s git reset HEAD ~ 1. Ali ako želite premotati n, onda možete napraviti git reset HEAD ~ n.

Osim toga, ako ste završili rad s pogrešnom podružnicom i završili pisanje drugog koda, prije nego što shvatite da ste učinili pogrešnu granu, možete upotrijebiti git skrivenu datoteku da biste spremili nedovršeni rad

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

NAPOMENA. Ovu sam web-lokaciju koristio kao vezu 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 odgovor je dao Ali Mizan 31. svibnja '17 u 0:51 2017-05-31 00:51

Dakle, ako je vaša skripta da ste prošli master , ali su trebali proći u another-branch (koja možda ili ne postoji), ali još niste kliknuli, to je prilično lako popraviti.

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

Sada će sve vaše obveze da master biti na another-branch .

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

2
08 апр. Odgovori Lorcan O'Neill 08 Apr 2016-04-08 16:19 '16 u 16:19 2016-04-08 16:19

Ako naiđete na ovaj problem i imate Visual Studio, možete učiniti sljedeće:

Desnom tipkom miša kliknite granu i odaberite View History :

2019

05 апр. odgovor je dat Trevor 05 apr. 2017-04-05 02:39 '17 u 2:39 2017-04-05 02:39

Ako grana na koju ste htjeli primijeniti svoje promjene već postoji (na primjer, za razvoj podružnica), slijedite upute koje daje fotanus , a zatim

 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, očito, možete koristiti tempbranch ili bilo koji drugi naziv grane umjesto my_feature ako želite.

Osim toga, ako je primjenjivo, odgodite pop-up poruku (primijenite) dok se ne ujedinite u ciljnu granu.

0
24 авг. odgovor je fbicknel 24 aug. 2016-08-24 01:15 '16 u 1:15 am 2016-08-24 01:15

Ostala pitanja o oznakama ili postavi pitanje