使用GIT中功能分支的删除操作覆盖master?

时间:2016-10-04 11:47:13

标签: git github

我从名为#master的master中分叉了一个名为#ftr的功能分支。随着时间的推移,我们分别承诺。现在*我如何将#ftr中的所有内容推送到#master,删除master中的额外文件并覆盖master *中的所有其他文件

注意:此处的操作是“覆盖主文件并删除额外文件”而不是“与我们的母版合并(或合并)”(用于冲突)“

2 个答案:

答案 0 :(得分:0)

听起来你想要的是等同于-s theirs(基本上是Jeff Puckett II suggested in a comment)。不幸的是,这不存在 - 但你可以很容易地合成它。

简单明了的方法

最明显的缓慢而简单的方法是将git merge--no-commit一起使用:

$ git checkout \#master
$ git merge --no-commit \#ftr # this may produce lots of conflicts
                              # but we don't care!

此时,无论合并是准备好还是已经停止并且存在大量冲突,我们只需从工作树和索引中删除所有

$ git rm -r .                 # assumes you're in the top level

现在您要提交删除所有内容,我们从您要保留的提交中重新填充索引和工作树,这是#ftr指向的版本:

$ git checkout \#ftr -- .

(请注意,这是使用"检查一些文件"形式为git checkout,而不是"切换到另一个分支"表单。)

现在合并已准备就绪:

$ git commit

结果是在当前(#master)分支上进行合并提交,其内容是来自#ftr分支的树,其父项是#master的上一个提示(第一个父母)和#ftr(第二个父母)的当前提示。

快速方法

快速方法使用以下事实:新合并提交的只是#ftr提示的当前现有树。我们所需要做的就是创建一个具有两个父项的新提交 - #master的提示和#ftr的提示,按顺序 - 并且具有树的结尾树#ftr

管道命令git commit-tree可以执行此操作。它不是最容易使用的命令:首先你应该准备你的提交消息,可能是在一个文件中,然后你可以运行:

$ newid=$(git commit-tree -F /tmp/mergemsg -p \#master -p \#ftr \#ftr^{tree})

这将创建提交对象并将其存储在您的存储库中。两个-p标志设置父ID,#ftr^{tree}参数设置树,而提交消息来自/tmp/mergemsg文件。但是,您现在需要更改#master分支以指向新的提交ID。最简单的方法是签出#master并使用git merge --ff-only快进到新提交:

$ git checkout \#master && git merge --ff-only $newid

答案 1 :(得分:0)

正如torek在他的回答中指出的,-s theirs不存在,但有-s ours可以在这样的临时分支上使用:

  • git checkout \#ftr
  • git checkout -b master-to-be 让主人指向#ftr指向的地方
  • git merge -s ours \#master将master合并为master-to-be但仅使用#ftr
  • git checkout -B \#master将#master分支移至新提示
  • git branch -d master-to-be不再需要临时分支