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

无法git合并--在git状态之前中止

git
  •  3
  • Sato  · 技术社区  · 7 年前

    首先我合并某事物,然后发生冲突,所以我 git merge --abort ,但是失败了,我不得不做 git status 首先,然后 git合并--中止 成功。

    $ git merge features/test
    Auto-merging src/cmd.c
    CONFLICT (content): Merge conflict in src/main.c
    Auto-merging src/client.c
    Automatic merge failed; fix conflicts and then commit the result.
    $ git merge --abort
    error: Entry 'src/option.h' not uptodate. Cannot merge.
    fatal: Could not reset index file to revision 'HEAD'.
    $ git merge --abort
    error: Entry 'src/option.h' not uptodate. Cannot merge.
    fatal: Could not reset index file to revision 'HEAD'.
    $ git status 
    # On branch te
    # You have unmerged paths.
    #   (fix conflicts and run "git commit")
    #
    # Changes to be committed:
    #
    **********
    #
    # Unmerged paths:
    #   (use "git add <file>..." to mark resolution)
    #
    **********
    #
    $ git merge --abort
    $ git status
    # On branch te
    nothing to commit, working directory clean
    

    我做错什么了吗?

    git版本1.8.3.1

    2 回复  |  直到 7 年前
        1
  •  3
  •   torek    7 年前

    我做错什么了吗?

    不,是的 git merge --abort 应该已经工作了,不用跑了 git status 第一报告您正在使用的任何Git版本的错误。 编辑: 1.8.3.1非常古老。如果可能,您应该升级。

        2
  •  3
  •   VonC    5 年前

    注意:即使升级Git也可能不够,直到Git 2.19(2018年第三季度),因为“ git merge --abort “当索引中存在以特定顺序出现的冲突条目涉及D/F冲突时,etc未正确清理。
    Git2.19已经纠正了这一点。

    看见 commit ad37620 , commit 25c200a (2018年7月31日)由 Elijah Newren ( newren ) .
    (由合并) Junio C Hamano -- gitster -- 在里面 commit 8ba8642 ,2018年8月17日)

    read-cache :修复中的目录/文件冲突处理 read_index_unmerged()

    读取索引未合并() 有两个预期目的:

    • 如果有任何未合并的条目,则返回1,否则返回0
    • 将任何较高的阶段条目降低到阶段0

    有好几个打电话的人 读取索引未合并() 那是退票吗 值来查看它是否为非零,然后 die() 如果这种情况 是的。

    对于这些调用者,将更高的阶段条目放到阶段 #0 这是对资源的浪费,在第一次未合并的进入时立即返回会更好。
    但这可能只是一个很小的区别,并不是本系列的重点。

    其余的调用者忽略返回值并调用此函数,其副作用是将更高的stage条目下降到stage#0。
    如中所述 commit e11d7b5 (“'reset--merge':修复未合并的情况”,2009-12-31,Git 1.7.0),

    这个 只有 我们希望在阶段#0的索引中保留一个以前未合并的条目的原因是,这样我们就不会忘记这样一个事实,即我们在工作树中有相应的文件,以便在重置到的树没有路径时能够将其删除。

    事实上,在 commit d1a43f2 (“重置--硬/读树--重置-u: 删除未合并的新路径”,2008-10-15,Git 1.6.0.4), 读取索引未合并() 刚刚 立即从缓存中删除未合并的条目,但这会造成不必要的影响,即在树中留下新的未跟踪文件,从而导致中止合并。

    这就是这个函数的预期目的。

    问题是,当存在目录/文件冲突时,尝试在阶段0将文件添加到索引失败(因为仍有一个目录在途中), 函数提前返回,返回代码为-1表示错误 .

    如上所述,希望执行drop-to-stage-0行为的调用方都不会检查返回状态,因此这意味着所有剩余的未合并项都保留在索引中,调用方继续执行其他操作。

    然后,用户会看到表单的错误:

    error: 'DIR-OR-FILE' appears as both a file and as a directory
    error: DIR-OR-FILE: cannot drop to stage #0
    

    还有可能是关于其他未合并条目的消息,这些未合并条目在字典上比文件和目录的路径名来得晚。谷歌在搜索这些信息时发现了一些点击率,这表明除了我之外,可能还有一些人点击了这些信息。
    幸运的是,打电话 git reset --hard 多次可以解决此错误。

    因为这里的全部目的就是把条目 暂时 为了删除工作副本中的任何相关文件,我们可以跳过DFCHECK,并允许文件和目录都显示在索引中 .
    调用方将通过调用删除索引中临时同时出现的目录和文件项 unpack_trees() ,不包括这些标记为的未合并条目 CE_CONFLICTED 在尝试将索引写入任何位置之前,从结果索引中删除标记。


    如果出现问题, git fsck 可以帮助:
    在Git 2.28(2020年第3季度)之前,签入 吉特fsck “为确保树对象已排序,但仍有未排序的条目丢失。

    看见 commit fe74704 , commit 3d71b1c , commit fc12aa7 , commit 8671559 (2020年5月21日) René Scharfe ( rscharfe ) .
    (由合并) 朱尼奥哈马诺-- 吉斯特 -- 在里面 commit 7e75aeb ,2020年6月9日)

    fsck :检测更多树中d/f冲突

    签字人:Ren Scharfe

    (D/F:目录/文件)

    如果堆栈顶部的冲突候选文件名不是当前candiate目录的前缀,那么我们可以放弃它,因为以后不会出现匹配的目录。

    但是我们还没有检查完候选目录——堆栈可能仍然包含一个匹配的文件名,所以请留在循环中并检查下一个候选文件名。

        3
  •  1
  •   Qwertie    6 年前

    就我而言, git status 没有帮助,但在提交本地更改后,它愿意中止。

    我的git版本:v2。25.0.窗户。1.

        4
  •  0
  •   Er Pkumar soni    4 年前

    第一 ,我们需要跑步

    git status
    

    然后

    git merge --abort