我正在合并一个可能有很多冲突的远程分支。我怎么知道它是否会有冲突?
我在--dry-run
上看不到git-merge
之类的内容。
答案 0 :(得分:717)
如前所述,传入--no-commit
标志,但为了避免快进提交,也要传递--no-ff
,如下所示:
$ git merge --no-commit --no-ff $BRANCH
检查分阶段的变化:
$ git diff --cached
您可以撤消合并,即使它是快进合并:
$ git merge --abort
答案 1 :(得分:212)
我只需要实现一个自动查找存储库与其远程资源之间冲突的方法。此解决方案在内存中进行合并,因此它不会触及索引,也不会触及工作树。我认为这是解决这个问题最安全的方法。以下是它的工作原理:
git fetch origin master
git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
( mergebase 是上一步中打印的合并基础的十六进制ID)现在假设您要将远程主服务器与本地主服务器合并,但您可以使用任何分支。 git merge-tree
将在内存中执行合并,并将结果打印到标准输出。 Grep表示模式<<
或>>
。或者您可以将输出打印到文件并检查。如果你找到一条以“两者都改变”开头的行,那么很可能会发生冲突。
答案 2 :(得分:49)
我对此的简单蛮力解决方案是:
创建一个“pre-master”分支(当然是硕士)
将您想要的所有内容合并到此预制大师中 然后你可以看到合并是如何发生而不触及主人。
无论如何,我会按照@ orange80的建议。
答案 3 :(得分:46)
使用git撤消合并是非常容易的,你甚至不用担心干运行:
$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world
编辑:如下面的评论中所述,如果您的工作目录或临时区域有变化,您可能希望在执行上述操作之前隐藏它们(否则它们将在上面git reset
之后消失)< / p>
答案 4 :(得分:34)
我为这样做了一个别名并且像魅力一样,我这样做:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
现在我打电话给
git mergetest <branchname>
查明是否存在任何冲突。
答案 5 :(得分:27)
只需将当前分支与远程分支区分开来,这将告诉您在执行拉/合并时会发生什么变化。
#see diff between current master and remote branch
git diff master origin/master
答案 6 :(得分:19)
I use the request-pull git command to do so. It allows you to see every change that would happen when merging, but without doing anything on your local or remote repositories.
For instance, imagine you want to merge a branch named "feature-x" into your master branch
git request-pull master origin feature-x
will show you a summary of what would happen (without doing anything):
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
If you add the -p
parameter, you will also get the full patch text, exactly like if you were doing a git diff on every changed file.
答案 7 :(得分:17)
我很惊讶没有人建议使用补丁。
假设您要测试从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年多时间里,没有人会提出这个看似明显的解决方案。
答案 8 :(得分:8)
这可能很有趣:来自文档:
如果您尝试合并导致复杂的冲突并且想要 重新开始,您可以使用 git merge --abort 恢复。
但你也可以采用天真(但很慢)的方式:
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(注意:克隆到/ tmp不起作用,你需要一个副本,以确保未提交的更改不会发生冲突)。
答案 9 :(得分:8)
我知道这是一个老问题,但它是第一个出现在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
答案 10 :(得分:7)
我使用git log查看主分支
的功能分支上发生的变化git log does_this_branch..contain_this_branch_changes
e.g。 - 查看已合并/未合并到主控的功能分支中的提交:
git log master..feature_branch
答案 11 :(得分:3)
如果你想从B快进到A,那么你必须确保git log B..A没有显示任何内容,即A没有B没有的东西。但即使B..A有某些东西,你仍然可以在没有冲突的情况下合并,所以上面显示了两件事:会有一个快进,因此你不会发生冲突。
答案 12 :(得分:0)
我的解决方案是向后合并。
将分支合并到您的分支中,而不是将分支合并到远程“目标”分支中。
git checkout my-branch
git merge origin/target-branch
您将看到是否存在任何冲突,并可以计划如何解决它们。
此后,您可以通过git merge --abort
中止合并,或者(如果没有任何冲突并且发生了合并)通过git reset --hard HEAD~1
答案 13 :(得分:0)
我知道这在理论上是题外话,但对于从 Google 搜索到这里的人来说,这实际上非常切题。
如有疑问,您可以随时使用 Github 界面创建拉取请求并检查它是否表明可以进行干净的合并。
答案 14 :(得分:-3)
制作工作副本的临时副本,然后合并到其中,并将两者区分开来。