我正在合并一个可能有很多冲突的远程分支.我怎么知道它是否会有冲突?
我没有看到像什么--dry-run
的git-merge
.
如前所述,传入--no-commit
标志,但为了避免快进提交,也传入--no-ff
,如下所示:
$ git merge --no-commit --no-ff $BRANCH
要检查分阶段的变化:
$ git diff --cached
您可以撤消合并,即使它是快进合并:
$ git merge --abort
我只需要实现一个自动查找存储库与其远程存储库之间冲突的方法.此解决方案在内存中进行合并,因此它不会触及索引,也不会触及工作树.我认为这是解决这个问题最安全的方法.以下是它的工作原理:
将远程数据库提取到存储库.例如:
git fetch origin master
运行git merge-base: git merge-base FETCH_HEAD master
运行git合并树:git merge-tree mergebase master FETCH_HEAD
(mergebase是mergebase在先前步骤中打印的十六进制ID)
现在假设您要将远程主服务器与本地主服务器合并,但您可以使用任何分支.git merge-tree
将在内存中执行合并并将结果打印到标准输出.Grep的模式<<
或>>
.或者您可以将输出打印到文件并检查.如果你找到一条以"两者都改变"开头的行,那么很可能会发生冲突.
我对此的简单蛮力解决方案是:
创建一个"预主"分支(当然是硕士)
将您想要的所有内容合并到此预主程序中.
然后你可以看到合并是如何发生而不触及主人.
将pre-master合并为master OR
将所有想要释放的分支合并为主人
无论如何,我会遵循@ orange80的建议.
撤消与git的合并是如此简单,你甚至不应该担心干运行:
$ git pull $REMOTE $BRANCH # uh oh, that wasn't right $ git reset --hard ORIG_HEAD # all is right with the world
编辑:如下面的评论所述,如果您的工作目录或临时区域有变化,您可能希望在执行上述操作之前隐藏它们(否则它们将在git reset
上面的内容后消失)
我为这样做了一个别名并且像魅力一样,我这样做:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
现在我打电话
git mergetest
找出是否有任何冲突.
只是将当前分支与远程分支区分开来,这将告诉您在执行拉/合并时会发生什么变化.
#see diff between current master and remote branch git diff master origin/master
我使用request-pull git命令来执行此操作.它允许您查看合并时可能发生的每个更改,但不在本地或远程存储库上执行任何操作.
例如,假设您要将名为"feature-x"的分支合并到主分支中
git request-pull master origin feature-x
将向您展示会发生什么(没有做任何事情):
The following changes since commit fc01dde318: Layout updates (2015-06-25 11:00:47 +0200) are available in the git repository at: http://fakeurl.com/myrepo.git/ feature-x for you to fetch changes up to 841d3b41ad: ---------------------------------------------------------------- john (2): Adding some layout Refactoring ioserver.js | 8 +++--- package.json | 7 +++++- server.js | 4 +-- layout/ldkdsd.js | 277 +++++++++++++++++++++++++++++++++++++ 4 files changed, 289 insertions(+), 7 deletions(-) create mode 100644 layout/ldkdsd.js
如果添加-p
参数,您还将获得完整的补丁文本,就像您在每个更改的文件上执行git diff一样.
我很惊讶没有人建议使用补丁.
假设你想从测试合并your_branch
成master
(我假设你已经master
签出):
$ git diff master your_branch > your_branch.patch $ git apply --check your_branch.patch $ rm your_branch.patch
这应该够了吧.
如果你得到错误
error: patch failed: test.txt:1 error: test.txt: patch does not apply
这意味着补丁不成功,合并会产生冲突.没有输出意味着补丁是干净的,你可以轻松合并分支
请注意,这实际上不会更改您的工作树(当然,除了创建补丁文件,但之后您可以安全地删除它).从git-apply文档:
--check Instead of applying the patch, see if the patch is applicable to the current working tree and/or the index file and detects errors. Turns off "apply".
对于那些比我更聪明/更有经验的人,请注意:如果我在这里错了,请告诉我这个方法确实表现出与常规合并不同的行为.看起来奇怪的是,在这个问题存在的8年多时间里,没有人会提出这个看似明显的解决方案.
这可能很有趣:来自文档:
如果您尝试合并导致复杂的冲突并想重新开始,则可以使用git merge -abort进行恢复.
但你也可以采用天真(但很慢)的方式:
rm -Rf /tmp/repository cp -r repository /tmp/ cd /tmp/repository git merge ... ...if successful, do the real merge. :)
(注意:只有克隆到/ tmp才会起作用,你需要一个副本,以确保未提交的更改不会发生冲突).
我知道这是一个老问题,但它是第一个出现在Google搜索上的问题.
Git在合并时引入了--ff-only选项.
来自:http://git-scm.com/docs/git-merge
--ff只
拒绝以非零状态合并和退出,除非当前HEAD已经是最新的,或者合并可以解析为快进.
执行此操作将尝试合并和快进,如果它不能中止并提示您无法执行快进,但保持您的工作分支不受影响.如果它可以快进,那么它将在您的工作分支上执行合并.此选项也可用git pull
.因此,您可以执行以下操作:
git pull --ff-only origin branchA #See if you can pull down and merge branchA git merge --ff-only branchA branchB #See if you can merge branchA into branchB
我使用git log来查看master分支的功能分支上发生的变化
git log does_this_branch..contain_this_branch_changes
例如 - 查看已合并/未合并到master的功能分支中的提交:
git log master..feature_branch