我刚刚向错误的分支做出了完美的承诺。 我如何撤消在我的主分支中的最后一次提交,然后采取这些相同的更改,并将它们放入我的升级分支?
当前回答
如果你还没有推送你的更改,你也可以做一个软重置:
git reset --soft HEAD^
这将恢复提交,但将提交的更改放回索引中。假设分支之间是相对最新的,git会让你签入另一个分支,然后你可以简单地提交:
git checkout branch
git commit -c ORIG_HEAD
-c ORIG_HEAD部分对于不再输入提交消息很有用。
其他回答
在常见的情况下,你在提交之前忘记从master切换到你的特性分支:
git checkout -B feature
git branch -f master origin/master
将origin/master替换为您希望主分支指向的提交。例如,如果您希望它指向HEAD后面的3个提交,则使用HEAD~3,如果您希望它指向带有该哈希的提交,则使用a1b2c3d。
其思想是在当前提交上重新创建特性分支并切换到它。然后使master分支指向与origin/master相同的提交。
一般情况下
在一般情况下,你想在你的特性分支上重放在master上完成的提交,如下图所示:
A---B---C---D $old_master A---B---C---D master
| \ | \
| G---H---I master <- HEAD => | G---H---I
| |
`-E---F feature `-E---F---G'--H'--I' feature <- HEAD
然后使用下面的命令在你的特性分支上选择你在master上做的提交。将$old_master替换为提交主机在进行更改之前所指向的哈希值。
git checkout feature
git cherry-pick $old_master..master
git branch -f master $old_master
如果需要,使用git stash -include-untracked隐藏你的本地更改,然后使用git stash pop取消隐藏。
不重写历史
除了选择特性分支上的更改之外,您还需要git恢复这些更改,而不是将主分支重置到过去。
git checkout feature
git cherry-pick $old_master..master
git checkout master
git revert $old_master..
git checkout feature
确保git不会将你的提交合并到特性中。如果你试图将你的特征分支合并回主分支,这些变化将被忽略,因为我们刚刚恢复了它们。
下面是结果的样子,rG, rH和rI分别是G, H和I的还原提交:
A---B---C---D rG--rH--rI master
| \ /
| G---H---I-`
|
`-E---F---G'--H'--I' feature <- 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/
如果你遇到这个问题,并且你有Visual Studio,你可以做以下事情:
右键单击分支并选择View History:
右键单击要返回的commit。并根据需要恢复或重置。
如果你还没有推送你的更改,你也可以做一个软重置:
git reset --soft HEAD^
这将恢复提交,但将提交的更改放回索引中。假设分支之间是相对最新的,git会让你签入另一个分支,然后你可以简单地提交:
git checkout branch
git commit -c ORIG_HEAD
-c ORIG_HEAD部分对于不再输入提交消息很有用。
为了详细说明这个答案,如果你有多个提交要从,例如develop到new_branch:
git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的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之间的区别