有没有一个混合 – 干运行选项?
我正在合并在一个可能有很多冲突的远程分支。 我怎么知道它是否会有冲突呢?
在git-merge
上我没有看到任何像--dry-run
东西。
如前所述,传入--no-commit
标志,但是为了避免快进提交,还要传入--no-ff
,如下所示:
$ git merge --no-commit --no-ff $BRANCH
这将允许您检查/撤消合并,即使它是一个快进合并:
$ git merge --abort
我只需要实现一个方法,自动发现存储库和它的远程之间的冲突。 这个解决scheme在内存中进行合并,所以它不会碰到索引,也不会碰到工作树。 我认为这是可以解决这个问题的最安全的方法。 这是如何工作的:
- 将远程存储到您的存储库。 例如:
git fetch origin master
- 运行git merge-base:
git merge-base FETCH_HEAD master
- 运行git merge-tree:
git merge-tree mergebase master FETCH_HEAD
( mergebase是在上一步打印的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有东西,你也可以不冲突地合并,所以上面显示了两件事情:快速前进,所以你不会发生冲突。
把你的工作副本做一个临时副本,然后合并成这个副本,然后区分这两个副本。