如何在没有实际合并的情况下测试合并

dol*_*oug 157 git merge

有没有办法模拟git merge两个分支,当前工作分支和主分支,但没有做任何更改?

当我不得不做一个时,我经常会有冲突git merge.有没有办法先模拟合并?

Amb*_*ber 129

您可以使用git merge --no-commit以防止实际提交合并,如果您不喜欢合并的工作方式,只需重置为原始头.

如果你肯定不想完成合并,即使它是快进的(因此根据定义没有冲突),你也可以添加--no-ff.

  • 我也会扔掉`--no-ff`.保持ff合并不发生. (7认同)
  • @Andy 的 `--no-ff` 在这里几乎是强制性的,因为 `--no-commit` 不会停止快进更改。 (2认同)
  • @Anant Anand Gupta - 这是一个好技巧,但应该是: git config --global alias.tm "merge --no-commit --no-ff" (2认同)

Mar*_*air 124

我认为有一种方法可以模拟在尝试合并之前会发生什么.但是,如果git status在进行合并之前确保输出为空,那么继续尝试它是非常安全的.如果您遇到冲突,您可以立即回到以前的状态:

git reset --merge
Run Code Online (Sandbox Code Playgroud)

从git 1.7.4开始,您还可以通过执行以下操作来中止合并:

git merge --abort
Run Code Online (Sandbox Code Playgroud)

(正如添加该选项的提交消息所解释的那样,为了与一致性等添加了此消息git rebase --abort.)

  • @samirahmed:@Amber更确切地回答了这个问题,当然,虽然使用`--no-commit`你仍然在改变索引和工作树,这不完全是"没有做任何改动":)我的观点是当人们提出这样的问题时,通常是因为他们并不知道看到合并的最佳方式就是只计算合并,通常是因为他们不知道回归是多么容易如果结果出现问题,他们之前所处的状态. (12认同)
  • @ Amber的答案正在回答"如何模拟合并"的问题.在我看来,使用`--no-commit`要容易得多 (4认同)
  • 我不知道这是否是在更新版本的git中添加的,但在文档(1.8.4)中它声明"`git merge --abort`相当于`git reset --merge`当`MERGE_HEAD`存在",所以更容易记住:) (2认同)

Ian*_*Ian 99

如果我想将主题分支上的更改与主数据库进行比较,我发现执行以下操作最简单,最安全:

git checkout master
git checkout -b trial_merge
git merge topic_branch
Run Code Online (Sandbox Code Playgroud)

完成合并后,很容易看到来自master的合并更改

git diff master
Run Code Online (Sandbox Code Playgroud)

完成后,只需删除trial_merge分支即可

git checkout master
git branch -D trial_merge
Run Code Online (Sandbox Code Playgroud)

这样,主分支永远不会改变.

  • 你也可以做`git checkout --detach`并测试你想要的任何东西.之后,如果你想保留你的更改,请执行`git checkout -b new_branch`.如果你想抛弃你的变化,请检查你想要的任何分支(`git checkout master`). (2认同)

Moh*_*aka 7

为什么不直接创建一个一次性分支(git checkout -b),并在那里进行测试合并?

  • 你的建议实际上是伊恩简洁表达的答案:) (3认同)

kol*_*pto 7

这是我找到的解决方案:git merge-tree在“内存中”合并并打印差异而不触及您的工作目录。您甚至可以在不检查分支的情况下对其进行测试。

获取合并差异

首先,这样做以确保您的存储库知道所有远程分支:

$ git fetch --all
Run Code Online (Sandbox Code Playgroud)

现在用这个bash的片段,看看怎么分公司$branch 合并到$master

$ branch='feature'
$ git merge-tree $(git merge-base $branch master) master $branch
Run Code Online (Sandbox Code Playgroud)

不会对您的工作目录或索引进行任何更改。这是一个试运行合并

从输出中选择信息

输出是一个差异。如果分支已合并,它将为空。

要查找是否存在冲突,请对其进行 grep <<<

$ git merge-tree $(git merge-base $branch master) master $branch | fgrep '<<<'
Run Code Online (Sandbox Code Playgroud)

要提取冲突差异,请使用sed提取<<<和之间的>>>

$ git merge-tree $(git merge-base $branch master) master $branch | \
  sed -ne '/^\+<<</,/^\+>>>/ p'
Run Code Online (Sandbox Code Playgroud)

特征

  • 如果分支已经合并,则差异将为空
  • 使用grep/sed提取冲突信息
  • 使用origin/feature一个你从没合作过的测试分支
  • 可用于查看 2 个分支如何分叉

将其添加到您的收藏夹

获取合并的差异:

git config --global alias.mergediff '!f(){ branch="$1" ; 进入=“$2”;git merge-tree $(git merge-base "$branch" "$into") "$into" "$branch" ; };F '

用法:

$ git mergediff <feature-branch> <merge-into>
$ git mergediff feature master
Run Code Online (Sandbox Code Playgroud)

获取合并冲突:

git config --global alias.mergetest '!f(){ git mergediff $@ | sed -ne "/^+<<</,/^+>>>/ p" ; };F '

用法:

$ git mergetest <feature-branch> <merge-into>
$ git mergetest feature master
Run Code Online (Sandbox Code Playgroud)


Ort*_*kni 5

我用 :

git merge --ff-only
Run Code Online (Sandbox Code Playgroud)

根据文档

拒绝合并并以非零状态退出,除非当前 HEAD 已经是最新的或者合并可以解决为快进。

这不是真正的模拟,因为在两个分支之间没有冲突的情况下会进行快进合并。但如果发生冲突,您会收到通知,并且不会发生任何事情。