我刚刚向错误的分支做出了完美的承诺。 我如何撤消在我的主分支中的最后一次提交,然后采取这些相同的更改,并将它们放入我的升级分支?
当前回答
这个话题晚了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年,但这可能对某些人有帮助。
如果你忘记在提交之前创建一个新的分支,并在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是一个本地分支,而不是远程分支。
用于在错误的分支上进行多次提交
如果对你来说,它只是1次提交,那么有很多其他更简单的重置解决方案可用。对于我来说,我无意中在主分支上创建了大约10个提交,而不是,让我们称之为目标,我不想失去提交历史。
你能做的,也是拯救我的,就是把这个答案作为参考,用一个4步的过程,也就是:
从master创建一个新的临时分支temp 将temp合并到最初用于提交的分支中,即目标 在主服务器上撤销提交 删除临时分支temp。
以下是上述步骤的详细说明:
Create a new branch from the master (where I had accidentally committed a lot of changes) git checkout -b temp Note: -b flag is used to create a new branch Just to verify if we got this right, I'd do a quick git branch to make sure we are on the temp branch and a git log to check if we got the commits right. Merge the temporary branch into the branch originally intended for the commits, i.e. target. First, switch to the original branch i.e. target (You might need to git fetch if you haven't) git checkout target Note: Not using -b flag Now, let's merge the temporary branch into the branch we have currently checkout out target git merge temp You might have to take care of some conflicts here, if there are. You can push (I would) or move on to the next steps, after successfully merging. Undo the accidental commits on master using this answer as reference, first switch to the master git checkout master then undo it all the way back to match the remote using the command below (or to particular commit, using appropriate command, if you want) git reset --hard origin/master Again, I'd do a git log before and after just to make sure that the intended changes took effect. Erasing the evidence, that is deleting the temporary branch. For this, first you need to checkout the branch that the temp was merged into, i.e. target (If you stay on master and execute the command below, you might get a error: The branch 'temp' is not fully merged), so let's git checkout target and then delete the proof of this mishap git branch -d temp
在常见的情况下,你在提交之前忘记从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。但我没有推动任何东西。
如果你只是提交了错误的分支,并且从那以后没有改变任何东西,也没有推送到回购,那么你可以执行以下操作:
// 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..."
注意:在上面的例子中,我用git重置HEAD~1来重卷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/
如果你想要应用你的更改的分支已经存在(例如分支开发),遵循下面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弹出(apply)延迟到合并目标分支之后。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的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之间的区别