将多个提交(其中包含合并)从主服务器移动到单独的分支

时间:2017-09-06 06:03:18

标签: git github

使用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

1 个答案:

答案 0 :(得分:2)

一种方法是从mastermyNewBranch挑选两个提交,然后将它们压缩到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选项。