使用git,我想将我自己的本地提交(ace45b0和2d4ac36)创建的所有更改移动到单独分支上的单个提交,并从master中删除这些提交。我可以这样做吗?
7ff6336 (HEAD -> master, origin/master, origin/HEAD) Merged remote master before pushing
2d4ac36 Made some local changes
bb60891 Merged upstream master into local master
b7a4d2e (upstream/master) Merge 271eb1a into upstream master
271eb1a Commit in another fork
ace45b0 Made some local changes
959d04b head when I first cloned.
我想我是在完成最后的结果之后:
origin/master myNewBranch
bb60891 HEAD <hash after applying ace45b0 & 2d4ac36> HEAD
b7a4d2e bb60891
271eb1a
959d04b
答案 0 :(得分:2)
一种方法是从master
到myNewBranch
挑选两个提交,然后将它们压缩到myNewBranch
中的单个提交。最后,您可以通过执行master
(简单和安全),或者可能通过交互式rebase删除git revert
中提交的原始两个提交。 / p>
首先选择两个提交到master
:
myNewBranch
请注意,您可能会遇到与每个挑选的合并冲突,如果是,您将不得不处理它们。
有几种方法可以将这两个新提交压缩到一个提交中。交互式rebase可能是最强大的,但它是重型的,并且由于你想要压缩的两个提交是HEAD或紧接在HEAD之前,因此有一个更简单的选项。我们可以尝试对git checkout myNewBranch
git cherry-pick ace45b0
git cherry-pick 2d4ac36
分支中的两个提交进行软复位:
myNewBranch
这将把HEAD指针移动到提交之前两个樱桃选择提交中的第一个。它不会更新阶段或工作目录,这意味着现在将暂停这些提交的更改。现在你所要做的就是做一个提交:
git reset --soft HEAD~2
现在要清理git commit -m 'brought in two commits from local changes'
分支,对你来说最好的选择就是恢复两次提交,例如
master
这将在git checkout master
git revert 2d4ac36
git revert ace45b0
之上添加两个 new 提交,这将在功能上取消两个提交正在执行的操作。如果您的master
分支由您自己以外的人发布和共享,则此选项是安全的,因为它实际上不会重写历史记录,只会添加新的提交。
如果没有其他人分享master
,那么您在这里有另一种选择。您可以对master
分支执行交互式rebase并删除两个提交。如果您可以容忍与此相关的风险,您可以尝试以下方法:
master
这将显示一个窗口,显示HEAD最近提交的7个提交,从旧版本到更新版本:
git rebase -i HEAD~7
现在删除包含您不想要的两个提交的行,留下您的信息:
959d04b head when I first cloned.
ace45b0 Made some local changes
271eb1a Commit in another fork
b7a4d2e (upstream/master) Merge 271eb1a into upstream master
bb60891 Merged upstream master into local master
2d4ac36 Made some local changes
7ff6336 Merged remote master before pushing
现在保存窗口(959d04b head when I first cloned.
271eb1a Commit in another fork
b7a4d2e (upstream/master) Merge 271eb1a into upstream master
bb60891 Merged upstream master into local master
7ff6336 Merged remote master before pushing
如果你正在使用Vim)并退出。应该开始变革。同样,当Git在新基础上重放旧提交时,您可能会遇到合并冲突。完成rebase后,您的:wq
分支将完全没有两个原始提交。同样,如果master
没有被其他人共享,这只是一个非常好的选择,因为它需要重写历史记录,除非master
选项。