Как исправить фиксацию неправильной ветки Git?

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

414
задан 31 мая '10 в 8:30
источник поделиться
8 ответов

Если вы еще не нажали свои изменения, вы также можете сделать мягкий reset:

git reset --soft HEAD^

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

git checkout branch
git commit

Недостатком является то, что вам нужно повторно ввести сообщение о фиксации.

618
ответ дан 31 мая '10 в 8:53
источник

Если у вас есть чистая (немодифицированная) рабочая копия

Откат одного фиксации (убедитесь, что вы отметили хеш фиксации для следующего шага):

git reset --hard HEAD^

Чтобы перенести это фиксацию в другую ветку:

git checkout other-branch
git cherry-pick COMMIT-HASH

Если вы изменили или не отслеживали изменения

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

git reset HEAD^
git checkout .
79
ответ дан 31 мая '10 в 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 февр. '14 в 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
источник

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

Если вы только что совершили неправильную ветку и ничего не изменили с тех пор и не нажали на репо, вы можете сделать следующее:

// 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
источник

Итак, если ваш сценарий заключается в том, что вы передали 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 апр. '16 в 16:19
источник

Если вы столкнулись с этой проблемой, и у вас есть Visual Studio, вы можете сделать следующее:

Щелкните правой кнопкой мыши на своей ветке и выберите View History:

введите описание изображения здесь

Щелкните правой кнопкой мыши фиксацию, на которую вы хотите вернуться. И верните или Reset по мере необходимости.

введите описание изображения здесь

0
ответ дан 05 апр. '17 в 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 авг. '16 в 1:15
источник

Другие вопросы по меткам или Задайте вопрос