16

情况:从A我的 Master 开始分支并B(C). 在进行了更多更改后,我D发现我需要在没有分支中发生的更改的情况下部署代码。如果我手不合并它会很好。

A_______C___D
 \     /
  \_B_/

首先,我想知道我应该从这里做些什么来部署代码,就好像合并从未发生过一样。注意:在分支中编辑的相同文件都没有在 master 中编辑。

第二...

我没有时间想出最好的方法来处理这个问题,所以我删除了分支添加的文件,并手动恢复了在分支中所做的一些编辑,然后提交了部署结果(F

A_______C___D___F
 \     /
  \_B_/

我希望能够继续开发分支并将 master 中的任何更改合并到其中以使其保持最新状态,但是如果这样做,我创建的内容F将被合并并导致文件被删除并且要还原的编辑。处理这个问题的最佳方法是什么?

4

2 回答 2

16

您可以使用 rebase 一步完成:

git rebase --onto A C D

我刚刚对此进行了测试,并得到了适当的结果:

$ edit test.txt
$ git add .
$ git commit -mA
$ git checkout -b the_branch
$ edit test.txt
$ git commit -a -mB
$ git checkout master
$ git merge master the_branch --no-ff
$ edit test.txt
$ git commit -a -mD

从这里你有你描述的情况。然后:

$ git rebase --onto <SHA1-for-A> <SHA1-for-C> master

将 C (排除)到主控的提交变基到 A 上。我需要修复一些冲突,因为我在 B 和 D 的相同位置进行了修改,但我认为你不会。

   _D'
  /
 /
A_______C___D
 \     /
  \_B_/

关于 的文档git rebase --onto,这或多或少是您的情况: http: //git-scm.com/docs/git-rebase


如果你有:

A_______C___D___F
 \     /
  \_B_/

,那么你现在有:

   _D'___F'_(master)
  /
 /
A_______C___D___F
 \     /
  \_B_/(the_branch)

从这里开始,将 master 中的更改合并到分支中很容易。完全放弃提交F'

$ git checkout master # if you were not here already
$ git branch old_fix  # if you want to be able to return to F' later
$ git reset --hard <SHA1-to-D'>

在上面的命令之后,你有:

     (master)
    /
   _D'___F'_(old_fix)
  /
 /
A_______C___D___F
 \     /
  \_B_/(the_branch)

要将 master 的更新合并到 the_branch 中:

$ git checkout the_branch
$ git merge master

...并解决冲突。

于 2010-12-14T10:45:03.787 回答
6

显而易见的解决方案是重置为A,手动重新应用所有补丁并解决冲突(您不会遇到)。

或者,您可以只打git revert补丁B,但这会创建一个新的提交。

虽然 Gauthier 的回答更好。

于 2010-12-14T00:27:44.850 回答