我正在合并一个可能有很多冲突的远程分支。我怎么知道它是否会发生冲突?
我看不到像--dry-run
on 那样的东西git-merge
。
我正在合并一个可能有很多冲突的远程分支。我怎么知道它是否会发生冲突?
我看不到像--dry-run
on 那样的东西git-merge
。
Answers:
如前所述,传递--no-commit
标志,但是为了避免快速提交,也传递--no-ff
,如下所示:
$ git merge --no-commit --no-ff $BRANCH
要检查分阶段的更改:
$ git diff --cached
您可以撤消合并,即使它是快速合并:
$ git merge --abort
git merge --only-if-there-wont-be-any-conflicts
或git diff --show-conflicts <commit>
会非常方便。可惜还不可能,还是我错过了什么?
git pull --ff-only
!
我只需要实现一种方法,该方法可以自动查找存储库与其远程数据库之间的冲突。该解决方案在内存中进行合并,因此不会触及索引或工作树。我认为这是解决此问题的最安全的方法。运作方式如下:
git fetch origin master
git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
(mergebase是上一步中merge-base打印的十六进制ID)现在假设您想将远程主服务器与本地主服务器合并,但是可以使用任何分支。git merge-tree
将在内存中执行合并并将结果打印到标准输出。模式<<
或的Grep >>
。或者,您可以将输出打印到文件中并进行检查。如果您发现以“两个都更改”开头的行,则很可能会发生冲突。
git merge-tree `git merge-base FETCH_HEAD master` FETCH_HEAD master
git merge-tree `git merge-base clieop master` clieop master | grep -A3 "changed in both"
太棒了!+100
+<<<<<<< .our
,所以我使用grep表达式,例如grep -q '^+<* \.our$'
我对此的简单暴力解决方案是:
创建一个“ pre-master”分支(当然是来自master的)
将您想要的所有内容合并到该预掌握者中。
然后,您可以看到合并过程是如何发生的,而无需接触master。
无论如何,我会遵循@ orange80的建议。
git merge --abort
如果发生冲突,git reset --hard HEAD~1
合并或,您可以随时进行操作git reset --hard origin/master
。创建另一个分支给您带来安全感,但是如果您了解git的工作原理,您将会了解它是放错了地方的恐惧。如果担心不更改工作副本,则不会提供任何解决方案。
git merge --no-commit
如果可以快速转发合并,则不会中止合并。 git merge --abort
如果合并,则不起作用。如果您想将其编写为脚本,那会很尴尬,因为git merge
它没有足够好的错误代码来解释不同类型的冲突。使用新的分支可以防止损坏的脚本使您的存储库处于需要手动干预的状态。确保您不会失去任何东西。但是,以其他方式进行构建更容易。
取消与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 branch --contains HEAD
甚至更直接,只需使用git merge --ff-only
--dry-run
不会“仅检查合并是否会快速进行”。它会返回合并的确切输出:文件,冲突等。ff是否不是很有趣,不是吗?
git stash; git reset --hard
?@BrianPhillips
我为此做了一个别名,并且像一个吊饰一样工作,我这样做:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
现在我打电话
git mergetest <branchname>
找出是否有任何冲突。
只需将当前分支与远程分支进行比较,这将告诉您进行拉/合并时将要更改的内容。
#see diff between current master and remote branch
git diff master origin/master
我使用request-pull git命令这样做。它使您可以查看合并时可能发生的所有更改,但无需在本地或远程存储库上进行任何操作。
例如,假设您想将一个名为“ feature-x”的分支合并到您的master分支中
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一样。
master
和origin
操作,可以使这一点更加清晰,例如,如果我在本地,branch1
并且想要request-pull
在本地功能分支上进行操作branch2
呢?我还需要origin
吗?当然,人们总是可以阅读文档。
我很惊讶没有人建议使用补丁。
假设您要测试从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".
请注意比我更精通/比git经验丰富的任何人:如果在这里输入错误,请告诉我,并且此方法的行为与常规合并不同。奇怪的是,这个问题已经存在了8年以上,没有人会提出这个看似明显的解决方案。
git diff master your_branch | git apply --check
。
这可能很有趣:从文档中:
如果您尝试了导致复杂冲突的合并并想重新开始,则可以使用git merge --abort恢复。
但是,您也可以采用幼稚(但很慢)的方法:
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(注意:仅克隆到/ tmp就无法工作,您需要一个副本,以确保未提交的更改不会冲突)。
cp -r repository/.git /tmp/repository/.git
,cd /tmp/repository
,git reset --hard
,git add --all
,git reset --hard
(好措施), git status
(检查它的清洁)。
我知道这是一个古老的问题,但这是第一个出现在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