有没有一个混合 – 干运行选项?

我正在合并在一个可能有很多冲突的远程分支。 我怎么知道它是否会有冲突呢?

git-merge上我没有看到任何像--dry-run东西。

如前所述,传入--no-commit标志,但是为了避免快进提交,还要传入--no-ff ,如下所示:

 $ git merge --no-commit --no-ff $BRANCH 

这将允许您检查/撤消合并,即使它是一个快进合并:

 $ git merge --abort 

我只需要实现一个方法,自动发现存储库和它的远程之间的冲突。 这个解决scheme在内存中进行合并,所以它不会碰到索引,也不会碰到工作树。 我认为这是可以解决这个问题的最安全的方法。 这是如何工作的:

  1. 将远程存储到您的存储库。 例如: git fetch origin master
  2. 运行git merge-base: git merge-base FETCH_HEAD master
  3. 运行git merge-tree: git merge-tree mergebase master FETCH_HEADmergebase是在上一步打印的merge-base的hexid)

现在假设你想合并远程主服务器和你的本地主服务器,但是你可以使用任何分支。 git merge-tree会在内存中执行合并,并将结果打印到标准输出中。 grep为模式<<>> 。 或者你可以打印输出到一个文件,并检查。 如果你发现一行以'两个都改变'开头,那么很可能会有冲突。

用git取消合并是非常容易的,你甚至不用担心干运行:

 $ git pull $REMOTE $BRANCH # uh oh, that wasn't right $ git reset --hard ORIG_HEAD # all is right with the world 

编辑:正如在下面的评论中指出的,如果你在工作目录或登台区域有变化,你可能会想要把它们藏在上面(否则它们会在上面的git reset消失)

我的蛮力简单的解决scheme是:

1:创build一个预主分支(从当然主)
2:将所有你想做的事情合并到这个预先的主人
那么你可以看到如何合并发生而不触摸主人。
3a:将预主人合并成主人或
3b:将所有想要发布的分支合并到master中

无论如何,我会按照@ orange80build议。

我做了这个别名,像一个魅力,我这样做:

  git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f ' 

现在我只是打电话

 git mergetest <branchname> 

要找出是否有任何冲突。

只需将您当前的分支与远程分支进行比较,就会告诉您在执行pull / merge时将会发生什么变化。

 #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一样。

这可能是有趣的:从文档:

如果您尝试了导致复杂冲突的合并,并希望重新开始,可以使用git merge –abort进行恢复。

但是,你也可以做到这一点天真(但速度慢)的方式:

 rm -Rf /tmp/repository cp -r repository /tmp/ cd /tmp/repository git merge ... ...if successful, do the real merge. :) 

(注意:仅仅克隆到/ tmp是不行的,你需要一个副本,以确保未提交的更改不会发生冲突)。

我知道这是一个老问题,但它是第一个出现在Googlesearch上的。

Git在合并时引入了一个–ff-only选项。

来自: http : //git-scm.com/docs/git-merge


–ff只

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

这样做会尝试合并和快速前进,如果不能中止并提示你快进不能执行,但是保持工作分支不变。 如果它可以快进,那么它将在您的工作分支上执行合并。 这个选项也可以在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 

我很惊讶没有人build议使用补丁。

假设你想testing从你的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 

这意味着补丁不成功,合并会产生冲突。 没有输出意味着补丁是干净的,你可以很容易地合并分支


请注意,这实际上不会改变你的工作树(除了创build补丁文件,当然,但你可以安全地删除之后)。 从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". 

请注意任何比git更聪明/更有经验的人:请让我知道,如果我在这里是错误的,这种方法确实显示不同于常规合并的行为。 这似乎很奇怪,在8年以上这个问题已经存在,没有人会提出这个看似明显的解决scheme。

我使用git log来查看master分支的function分支上发生了什么变化

 git log does_this_branch..contain_this_branch_changes 

例如 – 查看已经/尚未合并到主机的function分支中的提交内容:

 git log master..feature_branch 

如果你想从B快速前进到A,那么你必须确保git log B..A什么都不显示,即A没有B没有的东西。 但是即使B..A有东西,你也可以不冲突地合并,所以上面显示了两件事情:快速前进,所以你不会发生冲突。

把你的工作副本做一个临时副本,然后合并成这个副本,然后区分这两个副本。