582

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

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

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

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

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

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

4

17 回答 17

846

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

尝试运行

git add * 
git stash
git pull

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

于 2014-10-29T19:44:42.047 回答
220

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

Git 2.11 和更新版本:

git clean  -d  -f .

旧版本的 Git:

git clean  -d  -f ""

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

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

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

  • -f需要强制它运行。

这也是可以提供帮助的链接。

于 2015-11-19T12:29:08.503 回答
207

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

git fetch --all
git reset --hard origin/{{your branch name}}
于 2016-04-24T14:36:32.973 回答
68

tl;博士

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

下面的解释,包括当你想要git pull而不是git merge.


如何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同时覆盖未跟踪的文件

我们要删除的感兴趣的文件 (FOI):

  • 存在于上游存储库中,
  • 在当前分支中不存在,
  • 并阻止合并,因为它们在您的工作目录中存在且未被跟踪。

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. We have pulled by fetching + merging.

详细解释

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

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

第 1 步。此步骤强制将未跟踪的 FOI 替换为跟踪版本的捐助者分支(它还检查捐助者分支,并更新其余的工作目录)。

git checkout -f donor-branch

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

git checkout receiving-branch

第 3 步。现在 FOI 不存在,在捐赠者分支中合并不会覆盖任何未跟踪的文件,因此我们不会出错。

git merge donor-branch
于 2018-07-04T16:26:11.453 回答
26

删除所有未跟踪的文件:

git clean  -d  -fx .

注意:只要您不跟踪文件,这将删除 IDE 文件和任何有用的文件。小心使用此命令

于 2016-09-29T08:36:07.957 回答
23

你可以试试那个命令

git clean -df

编辑:请注意,这将删除可能有价值的未跟踪文件。感谢@zhekaus

于 2016-01-28T16:49:54.943 回答
16

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

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

于 2013-07-01T12:26:19.657 回答
14

更新 - 更好的版本

这个工具(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瓷器命令所以总是仔细检查它会做什么:

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

解释 - 因为一个班轮是可怕的:

这是它的作用的细分:

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

用瓷器命令替换步骤 1-3 会很棒,但我不知道有任何等价物。

于 2018-09-10T09:54:56.650 回答
12

clean/reset/hard checkout/rebase 都不适合我。

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

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

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

于 2019-10-14T09:25:41.267 回答
11

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

git clean -dxf
git pull origin master
于 2020-06-17T17:42:27.423 回答
7

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

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.
于 2016-08-09T13:31:20.163 回答
6

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

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

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

于 2017-03-29T02:01:20.640 回答
5

一种方法是存储本地更改并从远程存储库中提取。通过这种方式,您不会丢失本地文件,因为这些文件将进入存储区。

git add -A
git stash
git pull

您可以使用此命令检查本地隐藏文件 -git stash list

于 2019-05-07T14:06:54.743 回答
5

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

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

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

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

于 2019-07-10T04:56:59.473 回答
1

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

当尝试git pullGit 时告诉我新文件名没有被跟踪——它在远程,虽然它在本地还不存在。

因为在本地没有它的实例,所以git pull直到我git rm文件名做了(起初并不明显,因为我重命名它的愚蠢想法)。

于 2020-01-03T09:00:04.393 回答
0

如果您有在 .gitignore 下编写的文件,请删除这些文件并再次运行 git pull。这帮助了我。

于 2020-03-25T13:47:12.140 回答
-1

我遇到了同样的问题,每当我尝试在本地分支中合并 master 时,它都会说

“以下未跟踪的工作树文件将被合并 M.xcworkspace/xcshareddata/swiftpm/Package.resolved 覆盖”

但是遵循上述任何答案对我都不起作用。就像我做的时候git status没有未跟踪的文件一样,所以当我做的时候git add .没有文件被暂存,因此存储不能解决问题,也不能像上面回答的那样强制结帐。

我可以通过运行上面提到的以下命令来解决,但更重要的是我必须关闭 Xcode(甚至在运行 clean 命令之后它正在创建对我造成问题的文件。)

git clean -dfxn (检查可以删除的内容)

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

于 2021-05-20T12:36:40.733 回答