git可以告诉我哪些未提交的文件与传入的更改冲突吗?

时间:2018-12-08 03:13:23

标签: git git-merge

请注意:

C:\Dayforce\test [master ↓2 +0 ~2 -0 !]> git pull
error: Your local changes to the following files would be overwritten by merge:
        2.txt
Please commit your changes or stash them before you merge.
Aborting
Updating 2dc8bd0..ea343f8
C:\Dayforce\test [master ↓2 +0 ~2 -0 !]>

git是否有一个命令可以告诉我哪些未提交的文件导致此错误?我可以看到它们是通过git pull显示的,但是我真的不想解析git pull的输出。

我完全了解pull.rebaserebase.autostash的配置选项,请不要提出它们。

编辑1

可以先执行git pull。实际上,由于这个原因,在git pull失败之后将完成识别有问题文件的逻辑。我在Powershell中认识它的方式是:

git pull
# Possible exit codes:
# 1 - either local changes or pull merge conflict (but the merge has not been started yet)
# 128 - a merge is in progress
if ($LASTEXITCODE)
{
    git merge HEAD 2> $null                      # Disambiguate the exit code
    if ($LASTEXITCODE -eq 128)
    {
        # Two options:
        #  - pull merge conflict
        #  - a merge is in progress
        git mergetool
    }
    else
    {
        throw "Cannot pull due to uncommitted changes"
    }
}

因此,我不想中止问题,而是要确定有问题的文件并实质上复制rebase.autostash,但没有rebase

编辑2

我曾经认为git pull在发生未提交的更改冲突时会输出如下内容:

C:\xyz\test [master ↓4 ↑1 +0 ~3 -0 !]> git pull
error: Your local changes to the following files would be overwritten by merge:
        2.txt
        a.txt
Please commit your changes or stash them before you merge.
Aborting
C:\xyz\test [master ↓4 ↑1 +0 ~3 -0 !]>

这很容易解析。但是今天,我得到了一些不同的东西:

C:\xyz\test [master ↓4 ↑1 +0 ~2 -0 | +0 ~1 -0 !]> git pull
error: Your local changes to the following files would be overwritten by merge:
  1.txt a.txt
C:\xyz\test [master ↓4 ↑1 +0 ~2 -0 | +0 ~1 -0 !]>

我不知道这与我的Powershell控制台是否以某种方式被破坏有关,还是与最近的git更新(我没有注意到的自动安装)有关。

1 个答案:

答案 0 :(得分:2)

  

我不知道这与我的Powershell控制台是否以某种方式被破坏或最近的git更新有关

Git 2.19最近通过commit 9270239 (Jul. 2018)

更改了合并报告此错误的方式

这是基于merge-recursive.c#merge_trees的,它跟踪两棵树以检测公共文件被覆盖。
问题是:

  • 一旦pull命令失败,该信息就不会保留
  • 任何Git状态解析都应通过管道not porcelain commands
  • 完成

在您的情况下,由于git pull已完成其获取的部分,但未完成其合并部分,因此您可以执行git diff -–name-only HEAD origin/yourFetchedBranch以便将工作树与获取的内容进行比较。

那应该列出不同的文件,包括您的2.txt

  

会不会给我所有将要更改的文件,而不仅仅是冲突的文件?

是的,
对于每个文件,您仍然需要检查该文件是否属于当前已修改(未暂存或暂存但未提交)文件列表的一部分:

git ls-files --other --modified --exclude-standard
git diff --name-only --cached