我刚刚向错误的分支做出了完美的承诺。 我如何撤消在我的主分支中的最后一次提交,然后采取这些相同的更改,并将它们放入我的升级分支?
当前回答
如果你有一个干净的(未修改的)工作副本
回滚一次提交(确保你注意到了下一步的提交散列):
git reset --hard HEAD^
将该提交拉到不同的分支:
git checkout other-branch
git cherry-pick COMMIT-HASH
如果您已修改或未跟踪更改
还需要注意的是,git reset -hard会杀死你可能拥有的任何未跟踪和修改的更改,所以如果你有这些更改,你可能更喜欢:
git reset HEAD^
git checkout .
其他回答
如果你有一个干净的(未修改的)工作副本
回滚一次提交(确保你注意到了下一步的提交散列):
git reset --hard HEAD^
将该提交拉到不同的分支:
git checkout other-branch
git cherry-pick COMMIT-HASH
如果您已修改或未跟踪更改
还需要注意的是,git reset -hard会杀死你可能拥有的任何未跟踪和修改的更改,所以如果你有这些更改,你可能更喜欢:
git reset HEAD^
git checkout .
如果您已经执行了更改,则需要在重置HEAD后强制执行下一次推送。
git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force
警告:硬重置将撤销工作副本中任何未提交的修改,而强制推将完全覆盖远程分支的状态与本地分支的当前状态。
以防万一,在Windows上(使用Windows命令行,而不是Bash),它实际上是四个^^^^而不是一个,所以它是
git reset --hard HEAD^^^^
这个话题晚了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 --soft HEAD^
这将恢复提交,但将提交的更改放回索引中。假设分支之间是相对最新的,git会让你签入另一个分支,然后你可以简单地提交:
git checkout branch
git commit -c ORIG_HEAD
-c ORIG_HEAD部分对于不再输入提交消息很有用。
因此,如果你的场景是你已经提交给master,但打算提交给另一个分支(可能不存在,也可能不存在),但你还没有推送,这很容易修复。
// if your branch doesn't exist, then add the -b argument
git checkout -b another-branch
git branch --force master origin/master
现在你对master的所有提交都将在另一个分支上。
来自:http://haacked.com/archive/2015/06/29/git-migrate/
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别