关于git:以下未跟踪的工作树文件将被合并覆盖,但我不在乎

The following untracked working tree files would be overwritten by merge, but I don't care

在我的分支上,我在.gitignore中有一些文件

在另一个分支上,这些文件不是。

我想将不同的分支合并到我的分支中,我不在乎这些文件是否不再被忽略。

不幸的是,我得到了:

The following untracked working tree files would be overwritten by merge

如何修改pull命令以覆盖这些文件,而不必自己查找、移动或删除这些文件?


问题是,您没有在本地跟踪文件,但相同的文件是在远程跟踪的,因此为了"拉"您的系统将被迫覆盖不受版本控制的本地文件。

尝试跑步

1
2
3
git add *
git stash
git pull

这将跟踪所有文件,删除对这些文件的所有本地更改,然后从服务器获取这些文件。


您可以尝试命令从本地清除未跟踪的文件

Git 2.11及更高版本

1
git clean  -d  -f .

号旧版Git

1
git clean  -d  -f""

其中-d可以替换为以下内容:

  • -X表示忽略的文件也会被删除,以及Git不知道的文件。

  • -d意味着除了未跟踪的文件之外,还要删除未跟踪的目录。

  • -F必须强制运行。

这是一个有帮助的链接。


唯一对我有用的命令是:

1
2
git fetch --all
git reset --hard origin/{{your branch name}}


如果这是一次性操作,您可以在执行拉操作之前从工作目录中删除所有未跟踪的文件。已阅读"如何从当前Git工作树中删除本地(未跟踪)文件"?有关如何删除所有未跟踪文件的信息。

确保不要意外地删除您仍然需要的未跟踪文件;)


你可以试试这个命令

1
git clean -df


删除所有未跟踪的文件:

1
git clean  -d  -fx .


这个答案与其他答案有什么不同?

这里介绍的方法只删除将被合并覆盖的文件。如果目录中还有其他未跟踪(可能被忽略)的文件,此方法将不会删除它们。

解决方案

此代码段将提取将被git pull覆盖的所有未跟踪文件并将其删除。

1
git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf"{}"

然后就这么做:

1
git pull

这不是git-chinace命令,因此请始终仔细检查它将如何处理:

1
git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo"{}"

解释-因为一句话很吓人:

下面是它所做工作的细目:

  • git pull 2>&1—捕获git pull输出,并将其全部重定向到stdout,这样我们就可以很容易地用grep捕获它。
  • grep -E '^\s—目的是捕获将被git pull覆盖的未跟踪文件的列表。文件名前面有许多空白字符,所以我们使用它来获取它们。
  • cut -f2-—从2中捕获的每行开头删除空白。
  • xargs -I {} rm -rf"{}"-us xargs迭代所有文件,将其名称保存在""中,并为每个文件调用rm。我们使用-rf强制删除和删除未跟踪的目录。
  • 用瓷质命令替换步骤1-3是很好的,但我不知道有什么等效的。


    除了接受的答案之外,如果不再需要这些文件,您当然可以通过指定文件来删除它们:

    1
    git clean -f '/path/to/file/'

    如果您想查看哪些文件将被git clean删除,请记住首先使用-n标志运行它。请注意,这些文件将被删除。在我的情况下,我不管怎样都不在乎他们,所以这对我来说是一个更好的解决方案。


    如果考虑使用-f标志,可以先将其作为一个空运行运行。你只需提前知道下一步你会遇到什么样的有趣情况;-p

    1
    2
    3
    -n
    --dry-run
        Don’t actually remove anything, just show what would be done.


    git merge -f不存在,但git checkout -f存在。在下面的示例中,foi的意思是"感兴趣的文件":存在于捐助分支中的文件,不存在于接收分支中,并且由于它们在您的工作目录中存在且未跟踪而阻止合并。以下是删除这些感兴趣的文件的步骤,以便合并正常进行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # FOI is the 'files of interest', the untracked files blocking the merge.

    # 1. This forcibly replaces untracked FOI with tracked versions of
    # the donor branch (as well as updating the rest of the working dir).
    git checkout -f donor-branch

    # 2. This removes the FOI because they they are tracked in our current
    # (donor) branch, and absent in the `receiving-branch` we switch to.
    git checkout receiving-branch

    # 3. Now that the FOI are absent, merging in the donor branch will not
    # overwrite any untracked files, so we get no errors.
    git merge donor-branch

    在您的问题中,您会问"我如何修改我的pull命令来覆盖这些文件"?

    pull只不过是git fetch(获取远程历史记录)+自动合并上游分支。因此,您将修改pull命令,使其成为(a)获取远程历史记录,(b)使用checkout-f技巧覆盖文件,(c)合并远程历史记录。步骤如下:

    1
    2
    3
    4
    git fetch origin
    git checkout -f origin/mybranch
    git checkout mybranch
    git merge origin/mybranch


    实现这一点的一种方法是将本地更改存储起来,并从远程回购中提取。这样,您就不会丢失本地文件,因为这些文件将被存放。

    1
    2
    3
    git add -A
    git stash
    git pull

    您可以使用这个命令-git stash list检查本地存储的文件。