我从名为#master的master中分叉了一个名为#ftr的功能分支。随着时间的推移,我们分别承诺。现在*我如何将#ftr中的所有内容推送到#master,删除master中的额外文件并覆盖master *中的所有其他文件
注意:此处的操作是“覆盖主文件并删除额外文件”而不是“与我们的母版合并(或合并)”(用于冲突)“
答案 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
不再需要临时分支