Як виправити фіксацію неправильної гілки Git?

Я просто відмінно зробив фіксацію неправильної гілки. Як мені скасувати останню Комміт в моїй головній гілці, а потім виконати ті ж самі зміни і отримати їх в моїй гілці оновлення?

414
31 мая '10 в 8:30 2010-05-31 08:30 заданий mikewilliamson 31 травня '10 о 8:30 2010-05-31 8:30
@ 8 відповідей

Якщо ви ще не натиснули свої зміни, ви також можете зробити м'який reset:

 git reset --soft HEAD^ 

Це поверне фіксацію, але поверне виправлені зміни в ваш індекс. Припускаючи, що гілки щодо сучасні відносно один одного, git дозволить вам виконати перевірку в іншій гілці, після чого ви можете просто зафіксувати:

 git checkout branch git commit 

Недоліком є ​​те, що вам потрібно повторно ввести повідомлення про фіксацію.

618
31 мая '10 в 8:53 2010-05-31 08:53 відповідь дан Blair Holloway 31 травня '10 о 8:53 2010-05-31 8:53

Якщо у вас є чиста (немодифіковані) робоча копія

Відкат одного фіксації (переконайтеся, що ви відзначили хеш фіксації для наступного кроку):

 git reset --hard HEAD^ 

Щоб перенести це фіксацію в іншу гілку:

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

Якщо ви змінили або не відслідковує зміни

Також зверніть увагу, що git reset --hard буде вбивати будь-які невідтворювані і змінені зміни, які можуть бути у вас, тому, якщо у вас є ті, які ви можете віддати перевагу:

 git reset HEAD^ git checkout . 
79
31 мая '10 в 8:33 2010-05-31 08:33 відповідь дан Michael Mrozek 31 травня '10 о 8:33 2010-05-31 8:33

4 роки пізно по темі, але це може бути корисно комусь.

Якщо ви забули створити нову гілку перед тим, як зробити і передати все на master, незалежно від того, скільки ви зробили, наступний підхід простіше:

 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 

Тепер ваша головна гілка дорівнює origin/master , і все нові коммітов знаходяться на my_feature . Зверніть увагу, що my_feature є локальною гілкою, а не віддаленій.

61
06 февр. відповідь дан fotanus 06 февр. 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 

Попередження: жорсткий reset скасує будь-які незавершені зміни у вашій робочій копії, в той час як примусове натискання повністю перезапише стан віддаленої гілки поточним станом локальної гілки.

Про всяк випадок, в Windows (використовуючи командний рядок Windows, а не Bash), насправді чотири ^^^^ замість одного, тому

 git reset --hard HEAD^^^^ 
17
31 мая '10 в 9:11 2010-05-31 09:11 відповідь дан Igor Zevaka 31 травня '10 в 9:11 2010-05-31 9: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..." before your most recent commit // 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..." commit // 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..." that not attached to any branch using git stash // 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..." put into a stack of temporary commits // 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..." to // 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..." new branch // 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..." stack of temp commits // 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 commit onto the stack // 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 to // 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 branch // 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 a single commit // 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 of and continue coding // 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 відповідь дан Ali Mizan 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 Квітня. 2016-04-08 16:19 '16 о 16:19 2016-04-08 16:19

Якщо ви зіткнулися з цією проблемою, і у вас є Visual Studio, ви можете зробити наступне:

Клацніть правою кнопкою миші на своїй гілці і виберіть View History :

2019

05 апр. відповідь дан Trevor 05 Квітня. 2017-04-05 02:39 '17 о 2:39 2017-04-05 2: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 Серпня. 2016-08-24 01:15 '16 о 1:15 2016-08-24 1:15

Інші питання по мітках або Задайте питання