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


343

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

在不同的分支上,这些文件不是。

我想将另一个分支合并到我的分支中,并且我不在乎那些文件是否不再被忽略。

不幸的是我得到这个:

以下未跟踪的工作树文件将被合并覆盖

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





1
这是最好的答案,因为它只会删除阻止您合并的文件:stackoverflow.com/a/52255219/551045
RedX

Answers:


537

问题是您不是在本地跟踪文件,而是远程跟踪了相同的文件,因此为了“拉”您的系统,将不得不覆盖不受版本控制的本地文件。

尝试跑步

git add * 
git stash
git pull

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


59
git add -A .; git stash为我工作。该git add *变种抱怨忽略的路径。
imsky 2015年

11
我尝试了git add。,git stash,git pull。它有效,但我仍然不明白为什么?
2015年

1
对我来说,我有一个被跟踪的远程文件,而我的本地存储库中有一个同名的文件却未被跟踪。因此,如果您添加本地文件,则将更改存储起来,然后再保存,则远程文件应覆盖本地文件。
userFog 2015年

2
如果有人感兴趣,这里是一个很好的链接,以了解其工作原理。 git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay

2
//,这实际上并没有太深地说明此错误的目的。
弥敦道(Nathan Basanese)2015年

136

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

Git 2.11和更高版本:

git clean  -d  -f .

旧版本的Git:

git clean  -d  -f ""

在哪里-d可以替换为以下内容:

  • -x 被忽略的文件以及Git未知的文件也将被删除。

  • -d 除未跟踪的文件外,还删除未跟踪的目录。

  • -f 需要强制它运行。

这也是一个有用的链接


23
我将添加-i为交互模式。除了删除不需要的目录外,我还删除了该项目的用户设置:-(
dumbledad 2015年

6
这是通过意见值得扫描了类似的回答-x可以伤害。
dumbledad '16

10
但是,这是非常危险的,并且是不可撤销的任务!!您可能会丢失很多文件!小心!!
Mohamed Kawsara '16

16
这删除了我在Slim Framework上的所有供应商目录。谨防此命令
RousseauAlexandre

2
您应该从答案中删除“ x”。非常危险!
Earl3s

106

对我有用的唯一命令是:

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

5
应该注意的是,如果您已经删除了子模块并将其作为原始仓库中的库读取,则需要此答案。我需要一个答案,这就是所有的工作。
Routhinator

我没有子模块,而是按照其他答案中的建议尝试了git clean和git stash,但是只有这有所帮助。
kslstn

清除了各种子模块后,这也是对我唯一有效的方法。特别要注意的是,我在文件上也存在区分大小写的问题。例如 从我的供应商文件夹中的XML.php到Xml.php。
KazaJhodo

1
它也对我有用。你能解释一下发生了什么吗?我不明白
Dimitris Karamanis

1
这删除了我的两个本地提交,使用前请多加注意!
David Cian

27

替换git merge该文件将覆盖未跟踪的文件

以下注释将“ FOI”用于“感兴趣的文件”,即

  • 存在于捐助者分支中
  • 在接收分支中不存在,
  • 并阻止合并,因为它们在您的工作目录中存在且未跟踪。
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

替换git pull该文件将覆盖未跟踪的文件

pull = fetch + merge,因此我们采取 git fetch了上述git checkout -f, git checkout, git merge技巧。

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

详细说明

git merge -f不存在,但是git checkout -f确实存在。

我们将使用git checkout -f+ git checkout删除感兴趣的文件(请参见上文),然后您的合并即可正常进行。

步骤1.此步骤用供体分支的跟踪版本强行替换未跟踪的FOI(它还会签出供体分支,并更新其余的工作目录)。

git checkout -f donor-branch

第2步。此步骤将删除FOI,因为它们已在我们当前的(捐助者)分支中被跟踪,而在receiving-branch我们切换到的FOI中却没有。

git checkout receiving-branch

步骤3.现在不存在FOI,合并到捐助者分支中将不会覆盖任何未跟踪的文件,因此我们没有任何错误。

git merge donor-branch

3
这太干净了,无法作为第七或第八答案!
Majed DH

1
谢谢,@ MajedDH,您决定了我的一天!<3
Esteis

1
这就是我想要的instafix!谢谢
AFM-Horizo​​n

很高兴为您提供帮助,@ AFM-Horizo​​n!
Esteis




12

更新-更好的版本

该工具(https://github.com/mklepaczewski/git-clean-before-merge)将:

  • 删除与它们相同的未跟踪文件git pull
  • 将更改还原到修改后的文件,该文件的修改版本与它们的git pull等效版本相同,
  • 报告与其文件不同的已修改/未跟踪文件 git pull版本,
  • 该工具具有--pretend不会修改任何文件的选项。

旧版

这个答案与其他答案有何不同?

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

解决方案

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

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

然后执行以下操作:

git pull

这不是git Poland命令,因此请始终仔细检查其用途:

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

说明-因为一个衬里很吓人:

这是它的功能细分:

  1. git pull 2>&1-捕获git pull输出并将其全部重定向到stdout,以便我们可以轻松地捕获它grep
  2. grep -E '^\s -目的是捕获将被覆盖的未跟踪文件的列表 git pull。文件名前面有很多空白字符,因此我们利用它来获取它们。
  3. cut -f2- -从2中捕获的每一行的开头删除空格。
  4. xargs -I {} rm -rf "{}"-我们xargs遍历所有文件,将它们的名称保存在“ {}”中,并分别调用rm它们。我们-rf用来强制删除和删除未跟踪的目录。

用瓷器命令替换步骤1-3是很好的,但是我不知道有什么等效方法。


谢谢,我经常在我的工作目录中有一些我不想删除或提交的未跟踪文件。就我而言,我需要替换git pullgit checkout <branch_name>
mihow

6

如果您考虑使用-f标志,则可以先将其作为空运行。只是您预先知道接下来您会遇到哪种有趣的情况;-P

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

6

除了已接受的答案,您当然可以通过指定文件来删除不再需要的文件:

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

如果您想查看git clean将删除哪些文件,请记住首先使用-n标志运行它。请注意,这些文件将被删除。就我而言,我根本不关心它们,因此这对我来说是一个更好的解决方案。


5

一种方法是通过存储本地更改并从远程存储库中提取信息。这样,您将不会丢失本地文件,因为这些文件将被保存。

git add -A
git stash
git pull

您可以使用以下命令检查本地存放的文件- git stash list


3

对于那些不知道的人,git会忽略文件和文件夹中大写/小写名称的区别。当您使用不同的大小写将它们重命名为完全相同的名称时,这真是一场噩梦。

当我将文件夹从“ Petstore”重命名为“ petstore”(大写到小写)时,我遇到了这个问题。我已经编辑了.git / config文件,以停止忽略大小写,进行更改,压缩提交并保存更改以移至其他分支。我无法将隐藏的更改应用到该其他分支。

我发现有效的解决方法是暂时编辑.git / config文件以再次暂时忽略大小写。这导致git stash apply成功。然后,我将ignoreCase更改回false。然后我添加了所有内容,除了petstore文件夹中的新文件,git奇怪地声称,无论出于什么原因,新文件都被删除了。我提交了更改,然后执行了git reset --hard HEAD以删除那些未跟踪的新文件。我的提交与预期的完全一样:文件夹中的文件已重命名。

我希望这可以帮助您避免我的噩梦。


没为我工作。我删除了文件夹中的所有文件。然后git pull -fgit checkout .。什么样的恶梦。
m.rufca,

真?就在几周前,它对我来说还不错。您是否尝试编辑gitconfig文件以开始/停止视情况忽略大小写?
A. Davidson,

谢谢。将套管固定在文件夹路径中后,我需要从母版合并。我能够将其与gitignore大小写合并,然后重新启用大小写敏感性。
Rubenisme

3

清除/重置/硬结帐/重置对我都不起作用。

所以我刚刚删除了git抱怨的文件*

rm /path/to/files/that/git/complained/about

*我检查了是否可以通过在单独的文件夹中签出全新的存储库来删除此文件(文件不存在)


1

就我而言,当我遇到这个问题时。我有一个在远程上重命名的本地文件。

尝试git pullGit时,我没有跟踪到新文件名-尽管本地上尚不存在新文件名。

因为在本地没有它的实例,所以git pull直到我git rm文件名进行操作之前我都无法做(由于我愚蠢的重命名想法,起初这并不明显)。


0

如果您将文件写入.gitignore下,请删除这些文件并再次运行git pull。那帮助了我。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.