我想知道您如何在Git中处理这样的情况:

  • 从主
  • 创建分支task001
  • master:修改foo.c并将其重命名为bar.c
  • task001:修改foo.c并将其重命名为moo.c
  • merge task001以掌握

  • Git告诉我的是:
    CONFLICT (rename/rename): Rename "foo.c"->"bar.c" in branch "HEAD" rename "foo.c"->"moo.c" in "task001"
    Automatic merge failed; fix conflicts and then commit the result.
    

    我该怎么解决?我的意思是,名称冲突解决后,我仍然想 merge 两个文件。

    谢谢。

    最佳答案

    最初,我理解您的问题的含义与您在注释中澄清的含义有所不同,但是原始答案可能会有用,因此我将其作为第一部分,但在下面添加一个替代方案:

    1.只是解决了冲突,所以只有moo.c和bar.c不同

    在这里,我假设您想要的结果是在 merge 版本中具有bar.cmoo.c,以及每个分支的更改。我将通过解决索引中的冲突并提交来解决这个问题。您描述的情况如下所示:

    $ git log --pretty=oneline --graph --decorate master task001
    * fce127471ab5d1ef55b1d16412a75a7129782517 (task001) Rename to a different file on task001
    * 8edbc1357a3c0484dc077f6f7ce43de91d21e794 A small change on the task001 branch
    | * d10e9020d147a4bbd3688744823380322bf37718 (HEAD, master) Rename on master to bar.c
    | * f952617645456a551df07f219bfdc95e00c8ac9b Added a small change in master
    |/
    * e8602eef46af744defd4fb4073ecdb6a7afbfd28 Initial version of foo.c
    

    如果然后将task001 merge 为master,则会产生与您看到的相同的错误:
    $ git merge task001
    CONFLICT (rename/rename): Rename "foo.c"->"bar.c" in branch "HEAD" rename "foo.c"->"moo.c" in "task001"
    Automatic merge failed; fix conflicts and then commit the result.
    

    然后git status将向您显示问题的摘要:
    $ git status
    # On branch master
    # Unmerged paths:
    #   (use "git add/rm <file>..." as appropriate to mark resolution)
    #
    #   added by us:        bar.c
    #   both deleted:       foo.c
    #   added by them:      moo.c
    #
    no changes added to commit (use "git add" and/or "git commit -a")
    

    现在,您只需要使用git addgit rm即可解决冲突:
    $ git add bar.c
    $ git rm --cached foo.c
    foo.c: needs merge
    moo.c: needs merge
    rm 'foo.c'
    $ git add moo.c
    $ git status
    # On branch master
    # Changes to be committed:
    #
    #   new file:   moo.c
    #
    

    (我使用--cached删除了foo.c,因为它不再存在于工作副本中,并且--cached意味着该命令仅查看索引-否则您会收到关于foo.c不存在的错误。)

    然后,您只需提交结果:
    $ git commit
    [ save the prepopulated commit message ]
    

    您已经解决了冲突,并在 merge 版本中包含了bar.cmoo.c

    (我注意到,在这里描述的简单示例情况下,git merge -s resolve对我有用,但我希望这在总体上更有用。)

    2.将bar.c和moo.c merge 回一个文件

    从下面的评论看来,您真正想要的是将这些文件再次 merge 为一个, merge 两个分支中文件的更改。如果您希望git的 merge 策略来帮助您解决此问题,则在 merge 之前,每个分支上的文件必须具有相同的路径,因此在 merge 之前,您需要至少重命名其中的一个。假设您希望将 merge 后的文件称为quux.c,尽管当然也可以再次将其命名为foo.c。然后,您可以执行以下步骤,在 merge 之前重命名每个分支上的文件:
    # Rename the file on master:
    
    $ git checkout master
    Already on 'master'
    $ git mv bar.c quux.c
    $ git commit -m "Rename bar.c to quux.c on branch master"
    [master f9b3f49] Rename bar.c to quux.c on branch master
     1 files changed, 0 insertions(+), 0 deletions(-)
     rename bar.c => quux.c (100%)
    
    # Rename the file on task001:
    
    $ git checkout task001
    Switched to branch 'task001'
    $ git mv moo.c quux.c
    $ git commit -m "Rename moo.c to quux.c as well on branch task001"
    [task001 c71ad89] Rename moo.c to quux.c as well on branch task001
     1 files changed, 0 insertions(+), 0 deletions(-)
     rename moo.c => quux.c (100%)
    
    # Switch back to master, and merge in task001:
    
    $ git checkout master
    Switched to branch 'master'
    $ git merge task001
    

    如果更改没有冲突,则此时 merge 应该可以正常工作。在示例中,我尝试了它们确实存在冲突,因此我需要编辑文件,对文件进行git add并提交结果:
    Renaming foo.c->quux.c
    Auto-merging quux.c
    CONFLICT (content): merge conflict in quux.c
    Automatic merge failed; fix conflicts and then commit the result.
    $ emacs -nw quux.c
    $ git add quux.c
    $ git commit
    [master 8baa7cb] Merge branch 'task001'
    $ ls
    quux.c
    

    关于git divergent重命名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4679901/

    10-14 16:02
    查看更多