Как исправить фиксацию неправильной ветки Git?
Я просто отлично сделал фиксацию неправильной ветки.
Как мне отменить последнее коммит в моей главной ветке, а затем выполнить те же самые изменения и получить их в моей ветке обновления?
Ответы
Ответ 1
Если вы еще не нажали свои изменения, вы также можете сделать мягкий reset:
git reset --soft HEAD^
Это вернет фиксацию, но вернет исправленные изменения в ваш индекс. Предполагая, что ветки относительно современны относительно друг друга, git позволит вам выполнить проверку в другой ветке, после чего вы можете просто зафиксировать:
git checkout branch
git commit
Недостатком является то, что вам нужно повторно ввести сообщение о фиксации.
Ответ 2
Если у вас есть чистая (немодифицированная) рабочая копия
Откат одного фиксации (убедитесь, что вы отметили хеш фиксации для следующего шага):
git reset --hard HEAD^
Чтобы перенести это фиксацию в другую ветку:
git checkout other-branch
git cherry-pick COMMIT-HASH
Если вы изменили или не отслеживали изменения
Также обратите внимание, что git reset --hard
будет убивать любые невоспроизводимые и измененные изменения, которые могут быть у вас, поэтому, если у вас есть те, которые вы можете предпочесть:
git reset HEAD^
git checkout .
Ответ 3
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
является локальной ветвью, а не удаленной.
Ответ 4
Если вы уже внесли свои изменения, вам нужно будет принудительно нажать следующий после сброса HEAD.
git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force
Предупреждение: жесткий reset отменит любые незавершенные изменения в вашей рабочей копии, в то время как принудительное нажатие полностью перезапишет состояние удаленной ветки текущим состоянием локальной ветки.
На всякий случай, в Windows (используя командную строку Windows, а не Bash), на самом деле четыре ^^^^
вместо одного, поэтому
git reset --hard HEAD^^^^
Ответ 5
Недавно я сделал то же самое, когда я случайно совершил переход к мастеру, когда я должен был посвятить себя другой ветке. Но я ничего не толкнул.
Если вы только что совершили неправильную ветку и ничего не изменили с тех пор и не нажали на репо, вы можете сделать следующее:
// 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/
Ответ 6
Итак, если ваш сценарий заключается в том, что вы передали 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/
Ответ 7
Если ветка, к которой вы хотели применить свои изменения, уже существует (например, для разработки ветвей), следуйте инструкциям, представленным 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, если хотите.
Кроме того, если применимо, задерживайте всплывающее сообщение (применить) до тех пор, пока вы не объединились в своей целевой ветке.
Ответ 8
Если вы столкнулись с этой проблемой, и у вас есть Visual Studio, вы можете сделать следующее:
Щелкните правой кнопкой мыши на своей ветке и выберите View History
:
Щелкните правой кнопкой мыши фиксацию, на которую вы хотите вернуться. И верните или Reset по мере необходимости.