代码之家  ›  专栏  ›  技术社区  ›  Otto

是否有git合并--干运行选项?

  •  622
  • Otto  · 技术社区  · 17 年前

    我正在合并一个可能有很多冲突的远程分支。我如何判断它是否会有冲突?

    我看不出有什么像 --dry-run 在…上 git-merge .

    13 回复  |  直到 10 年前
        1
  •  947
  •   Community Mohan Dere    8 年前

    如前所述,传入 --no-commit 标记,但为了避免快进提交,也要传入 --no-ff ,例如:

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

    要检查阶段性更改,请执行以下操作:

    $ git diff --cached
    

    即使是快进合并,也可以撤消合并:

    $ git merge --abort
    
        2
  •  263
  •   Trevor Hickey    11 年前

    我只需要实现一个方法,自动查找存储库和远程存储库之间的冲突。此解决方案在内存中进行合并,因此不会触及索引或工作树。我认为这是解决这个问题最安全的方法。下面是它的工作原理:

    1. git fetch origin master
    2. 运行git合并库: git merge-base FETCH_HEAD master
    3. 运行git合并树: git merge-tree mergebase master FETCH_HEAD ( 合并基地 是在上一步中打印的合并基的十六进制id)

    git merge-tree 将在内存中执行合并并将结果打印到标准输出。格雷普的模式 << >> . 或者,您可以将输出打印到一个文件并进行检查。如果你发现一行以'changed in tware'开头,那么很可能会发生冲突。

        3
  •  113
  •   Ian Robinson    15 年前

    我假设您只是想在实际尝试合并之前了解自己会遇到多少麻烦……并且在失败的合并之后重置到最后一次提交相对容易,因此如果这是预期的方法,我不会感到惊讶。

    git checkout -b mycrazybranch
    [change some stuff...]
    git add .
    git commit -m "changed some stuff"
    git format-patch master --stdout > crazy.patch
    git checkout master
    git apply crazy.patch --check
    [all good! cleanup...]
    rm crazy.patch
    

    如您所见,这将创建一个修补程序文件,然后您可以使用测试它--检查并查看是否有任何错误,然后删除修补程序文件。

        4
  •  83
  •   manojlds    15 年前

    git merge --abort 在看到冲突之后。

        5
  •  69
  •   Will Beason    7 年前

    作为现有答案的总结,有两种方法可以检查是否存在合并冲突

    git format-patch $(git merge-base branch1 branch2)..branch2 --stdout | git apply --3way --check -

    注意,您当前的分支应该是 branch1

    另一种方式:

    git merge --no-commit branch2
    # check the return code here
    git merge --abort
    
        6
  •  60
  •   Michael come lately PhiLho    7 年前

    我的简单暴力解决方案是:

    1. 创建“硕士预科”分支(当然来自硕士)


    2. 然后,您可以看到合并是如何发生的,而不必触碰master。

      • 将预母版合并到母版或
      • 将所有想要发布的分支合并到主分支中

    无论如何,我会听从@orange80的建议。

        7
  •  48
  •   Okonomiyaki3000    12 年前

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

    现在我只要打电话

    git mergetest <branchname>
    

    以了解是否存在任何冲突。

        8
  •  48
  •   Brian Phillips    11 年前

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

    编辑:如下面的注释所述,如果您的工作目录或临时区域中有更改,您可能希望在执行上述操作之前将其隐藏起来(否则,它们将在以下操作之后消失) git reset (上图)

        9
  •  28
  •   timh    15 年前

    只需将当前分支与远程分支进行区分,这将告诉您在执行拉/合并时将要更改的内容。

    #see diff between current master and remote branch
    git diff master origin/master
    
        10
  •  24
  •   Alexandre    15 年前

    不是那样的。但是您可以使用--no commit选项,因此它不会在合并后自动提交结果。通过这种方式,您可以检查并根据需要撤消合并,而不会弄乱提交树。

        11
  •  22
  •   ArnaudR    11 年前

    我使用 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一样。

        12
  •  22
  •   Christoph Böhmwalder    8 年前

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

    假设您想测试来自的合并 your_branch 进入 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".
    

        13
  •  11
  •   Jason McKindly    6 年前

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

    发件人: http://git-scm.com/docs/git-merge


    --仅限ff

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

    执行此操作将尝试合并和快进,如果无法合并和快进,则会中止并提示您无法执行快进,但不会影响您的工作分支。如果它可以快进,那么它将在您的工作分支上执行合并。此选项也可在上使用 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
    
        14
  •  9
  •   user1985657 user1985657    12 年前

    如果您尝试了导致复杂冲突的合并,并希望 重新开始,你可以用 git合并--中止 .

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

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

        15
  •  8
  •   nelsonenzo    13 年前

    我使用git日志查看主分支的功能分支上发生了什么变化

    git log does_this_branch..contain_this_branch_changes
    

    git log master..feature_branch
    
        16
  •  4
  •   Ubeogesh    6 年前

    我的解决方案是向后合并。

    不要将您的分支合并到远程“目标”分支中,而是将该分支合并到您的分支中。

    git checkout my-branch
    git merge origin/target-branch
    

    您将看到是否存在任何冲突,并可以计划如何解决这些冲突。

    之后,您可以通过git中止合并 merge --abort ,或(如果没有任何冲突且发生了合并)通过回滚到上一次提交 git reset --hard HEAD~1

        17
  •  3
  •   Erik Kaplun    13 年前

    如果您想从B快进到A,那么必须确保git日志B..A没有显示任何内容,即A没有B没有的内容。但是即使B..A有一些东西,你可能仍然能够合并而没有冲突,因此上面显示了两件事:会有一个快进,因此你不会得到冲突。

        18
  •  0
  •   Mentor    5 年前

    当有疑问时,您可以始终使用Github接口创建一个pull请求,并检查它是否指示可以进行干净的合并。

        19
  •  -1
  •   vanboom    11 年前

    为您的工作副本制作一个临时副本,然后合并到该副本中,并将两者区分开来。

    推荐文章