8 ответов:
Если вы еще не нажали свои изменения, вы также можете сделать мягкий сброс:
git reset --soft HEAD^это вернет фиксацию, но вернет зафиксированные изменения в ваш индекс. Предполагая, что ветви относительно актуальны по отношению друг к другу, git позволит вам выполнить проверку в другую ветвь, после чего вы можете просто зафиксировать:
git checkout branch git commitнедостатком является то, что вам нужно повторно вводить свое сообщение.
если у вас есть чистая (не измененная) рабочая копия
для отката одного коммита (убедитесь, что вы отметили хэш коммита для следующего шага):
git reset --hard HEAD^чтобы вытащить эту фиксацию в другую ветку:
git checkout other-branch git cherry-pick COMMIT-HASHесли вы изменили или не отслеживали изменения
также обратите внимание, что
git reset --hardбудет убить любые неотслеженные и измененные изменения вы могли бы, так что если у вас есть те, которые вы могли бы предпочесть:git reset HEAD^ git checkout .
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является локальным филиалом, а не удаленным.
Если вы уже нажали свои изменения, вам нужно будет заставить ваш следующий толчок после сброса головы.
git reset --hard HEAD^ git merge COMMIT_SHA1 git push --forceпредупреждение: жесткий сброс отменит любые незафиксированные изменения в вашей рабочей копии, в то время как принудительный толчок полностью перезапишет состояние удаленной ветви с текущим состоянием локальной ветви.
на всякий случай, на Windows (с помощью командной строки Windows, а не Bash) это на самом деле четыре
^^^^вместо одного, так этоgit reset --hard HEAD^^^^
недавно я сделал то же самое, где я случайно совершил изменение в master, когда я должен был совершить в другой ветке. Но я ни на что не давил.
Если вы просто совершили ошибку в ветке, и ничего не изменили с тех пор, и не нажали на РЕПО, то вы можете сделать следующее:
// 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's 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 Голова~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/
Итак, если ваш сценарий заключается в том, что вы совершили
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/
если ветвь, к которой вы хотели применить изменения, уже существует (ветвь разработки, например), следуйте инструкциям, которые были предоставлены 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 Если вы хотели.
кроме того, если это применимо, задержите Stash pop (apply) до тех пор, пока вы не объединитесь в своей целевой ветви.


Comments