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

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

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

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

不幸的是,我得到了这个:

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

我如何修改我的pull命令来覆盖这些文件,而不需要我自己找到、移动或删除这些文件?

1034540 次浏览

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

请确保不要意外删除未跟踪的文件,你仍然需要;)

问题是你没有在本地跟踪文件,但是相同的文件被远程跟踪,所以为了“拉”你的系统将被迫覆盖不受版本控制的本地文件。

尝试运行

git add *
git stash
git pull

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

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

Git 2.11及更新版本:

git clean  -d  -f .

Git的旧版本:

git clean  -d  -f ""

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

  • -x被忽略的文件以及Git不知道的文件也会被删除。

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

  • 需要-f来强制它运行。

下面是链接,它也很有用。

您可以试试这个命令

git clean -df
< p >编辑: 请注意,这将删除可能有价值的未跟踪文件。 感谢@zhekaus

唯一对我有用的命令是: (请注意,这会删除所有本地文件)

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

如果你考虑使用-f标志,你可以先把它作为一个试运行。你只需要提前知道你接下来会遇到什么样有趣的情况;-P

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

删除所有未跟踪的文件:

git clean  -d  -fx .

警告:这将删除IDE文件和任何有用的文件,只要你不跟踪这些文件。请谨慎使用此命令

除了接受的答案,你当然可以删除文件,如果他们不再需要通过指定文件:

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

如果你想知道git clean会删除哪些文件,记得先用-n标志运行它。注意,这些文件将被删除。对我来说,我并不关心他们,所以这对我来说是一个更好的解决方案。

安全地删除/覆盖麻烦的文件

当你想merge:

git checkout -f donor-branch   # replace bothersome files with tracked versions
git checkout receiving-branch  # tracked bothersome files disappear
git merge donor-branch         # merge works

当你想pull:

git fetch
git checkout -f origin/mybranch   # replace bothersome files with tracked versions
git checkout mybranch             # tracked bothersome files disappear
git pull origin/mybranch          # pull works

这就是你使用它所需要知道的。下面是一个解释。


详细解释

我们要删除的烦人文件:

  • 存在于捐赠分支(对于git pull:上游分支),
  • 在接收分支中不存在,
  • 并且正在阻止合并,因为它们在你的工作目录中存在并且未被跟踪。

git merge -fgit pull -f不存在,但git checkout -f存在。

我们将使用git checkout -f + git checkout来跟踪+删除麻烦的文件,然后您的合并可以正常进行。

这一步强制将未跟踪的麻烦文件替换为跟踪版本的捐赠分支(它还检出捐赠分支,并更新工作目录的其余部分)。

git checkout -f donor-branch

这一步删除了烦人的文件,因为它们在我们当前(捐赠)分支中被跟踪,而在我们切换到的receiving-branch中不存在。

git checkout receiving-branch

现在麻烦的文件不存在了,在捐赠分支中合并将不会覆盖任何未跟踪的文件,所以我们不会得到错误。

git merge donor-branch

更新-一个更好的版本

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

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

旧版本

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

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

解决方案

这个代码片段将提取所有将被git pull覆盖的未跟踪文件并删除它们。

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

然后就这样做:

git pull

这不是git瓷器命令,所以总是仔细检查它会做什么:

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 add -A
git stash
git pull

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

对于那些不知道的人,git忽略了文件和文件夹中的大写/小写名称差异。当您用不同的情况将它们重命名为完全相同的名称时,结果是一场噩梦。

当我将文件夹从“Petstore”重命名为“Petstore”(大写到小写)时遇到了这个问题。我已经编辑了我的.git/config文件以停止忽略大小写,进行了更改,压缩了我的提交,并保存了我的更改以移动到不同的分支。我不能将我所存储的更改应用到另一个分支。

修复,我发现,工作是临时编辑我的.git/配置文件暂时忽略大小写再次。这使得git stash apply成功了。然后,我把ignoreCase改回false。然后我添加了所有东西,除了petstore文件夹中的新文件,git奇怪地声称这些文件被删除了,无论出于什么原因。我提交了更改,然后运行git reset --hard HEAD来删除那些未跟踪的新文件。我的提交和预期的完全一样:文件夹中的文件被重命名了。

我希望这能帮助你避免我同样的噩梦。

清洁/重置/硬签出/重基都不适合我。

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

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

*我检查了这个文件是否可以通过在一个单独的文件夹中签出一个全新的回购来删除(文件不在那里)

以我为例,当我遇到这个问题时。我在遥控器上重命名了一个本地文件。

当尝试git pull Git告诉我新的文件名没有跟踪-它是在远程上,虽然它还不存在于本地。

因为没有本地实例,我不能做git pull,直到我在文件名上做了git rm(这在一开始并不明显,因为我愚蠢的重命名它的想法)。

如果文件写在.gitignore下,删除这些文件并再次运行git pull。这帮了我大忙。

问题是,当我们有传入的更改,将合并未跟踪的文件,git抱怨。这些命令帮助了我:

git clean -dxf
git pull origin master

我有同样的问题,每当我尝试合并主在我的本地分支它说

以下未跟踪的工作树文件将被M.xcworkspace/xcshareddata/swiftpm/Package.resolved"

但以上任何一个答案对我都不起作用。当我做git status时没有未跟踪的文件,所以当我做git add .时没有文件得到阶段性,因此存储不能解决问题,也不能强制签出如上所述。

我能够通过运行上面提到的命令来解决问题,但更重要的是我不得不关闭Xcode(即使在运行clean命令后,它也可能会创建导致我出现问题的文件)。

git clean -dfxn(检查什么可以删除)

git clean -d -fx .(删除上面列出的文件)

Git 2.23(2019年第三季度)的答案不会像Esteis回答那样使用旧的和令人困惑的git checkout命令

你可以用:

所以:

安全地删除/覆盖麻烦的文件

当你想合并时:

git switch -f receiving-branch # -f is an alias for --discard-changes.
git merge donor-branch         # merge works

当你想拉的时候:

git switch -f mybranch    # automatically track origin/mybranch
git pull

它避免了:

  • git clean危险操作
  • git checkout origin/myBranch一样的分离头部)
  • 显式的拉,因为git switch有一个猜测模式相当于git switch -c <branch> --track <remote>/<branch>。这意味着简单的git pull就足够了。

步骤1:清理工作副本

a)在Stash上保存本地更改 如果想要保存本地更改,可以安全地将它们存储在Stash上。

.

.

.
$ git stash --include-untracked

b)丢弃局部更改 如果你确定你不再需要它们,你可以完全放弃你的本地更改:

$ git reset --hard

c)如果你也有未跟踪的/新的文件,你将不得不使用“git清理”;命令也可以去掉这些:

$ git clean -fd

第二步:再次拉 当你清理了所有可能被覆盖的本地更改/未跟踪的文件后,pull将最终工作:

$ git pull