ChatGPT解决这个技术问题 Extra ChatGPT

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

赏金将在 6 天后到期。此问题的答案有资格获得 +50 声望赏金。 maxkoryukov 想要奖励一个现有的答案:有一个突出的被低估的答案 stackoverflow.com/a/51177844/1115187 没有潜在的危险操作

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

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

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

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

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

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

这是最佳答案,因为它只会删除阻止您合并的文件:stackoverflow.com/a/52255219/551045
git 在强迫你处理你不关心的事情方面做得很好

u
userFog

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

尝试运行

git add * 
git stash
git pull

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


git add -A .; git stash 为我工作。 git add * 变体抱怨路径被忽略。
我试过 git add .、git stash、git pull。它有效,但我仍然不明白为什么?
对我来说,我有一个被跟踪的远程文件,而我的本地 repo 中有一个同名的文件,但没有被跟踪。因此,如果您添加本地文件存储更改然后拉,远程文件应该覆盖本地文件。
如果有人感兴趣,这里有一个很好的链接来了解它是如何工作的。 git-scm.com/book/en/v1/Git-Tools-Stashing
// ,这并没有真正深入到这个错误的目的。
d
double-beep

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

Git 2.11 和更新版本:

git clean  -d  -f .

旧版本的 Git:

git clean  -d  -f ""

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

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

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

-f 是强制它运行所必需的。

这也是可以提供帮助的 link


我会为交互模式添加 -i。除了删除不需要的目录外,我还删除了项目的用户设置:-(
值得浏览对 a similar answer 的评论,因为 -x 可能会造成伤害。
但这是非常危险且不可撤销的任务!!你可能会丢失很多文件!当心!!
这删除了我在 Slim Framework 上的所有供应商目录。对这个命令要非常小心
您应该从答案中删除“x”。这是非常危险的!
u
user3303020

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

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

应该注意的是,如果您已删除子模块并将它们作为库读取到原始存储库中,则需要此答案。我需要一个答案,这就是全部。
它也对我有用。你能解释一下发生了什么吗?我不明白。
这删除了我的两个本地提交,在使用它之前要小心!
在使用 --hard 之前,请三思。默认行为旨在保护您免受错误的影响
这应该是公认的答案:D 没有什么对我有用,但这个解决方案效果很好。谢了哥们!!
E
Esteis

仅安全删除/覆盖烦人的文件

当您想要 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 跟踪 + 删除烦人的文件,然后您的合并可以正常进行。

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

git checkout -f donor-branch

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

git checkout receiving-branch

第 3 步。现在不存在麻烦的文件,在供体分支中合并不会覆盖任何未跟踪的文件,因此我们不会出错。

git merge donor-branch

这太干净了,不能成为第 7 个或第 8 个答案!
这是最好的答案。因为它无需重置或冒丢失东西的风险即可将所有内容拉入,只需覆盖需要覆盖的内容。完美。
唉,在我的情况下不起作用。
l
leeCoder

删除所有未跟踪的文件:

git clean  -d  -fx .

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


删除项目中可能使用的文件不应该是真正的解决方案
哎呀,也清理了IDE文件:(
这清理了我在 python 项目中的 anaconda 文件
请非常小心地使用此命令。它删除了我代码中的很多文件。从过去 2 天开始,我无法再次执行我的代码。
为什么这甚至被赞成?这应该被删除
A
Amr Mohammed

你可以试试那个命令

git clean -df

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


删除未跟踪的目录有什么用?...它们可能很有价值,你知道的。
你能解释一下它的作用吗?
这显然也删除了我的框架供应商/核心文件夹..
C
Community

如果这是一次性操作,您可以在拉取之前从工作目录中删除所有未跟踪的文件。有关如何删除所有未跟踪文件的信息,请阅读 How to remove local (untracked) files from the current Git working tree?

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


m
matt

更新 - 更好的版本

该工具 (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 "{}"

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

这是它的作用的细分:

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

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


谢谢,我的工作目录中经常有我不想删除或提交的未跟踪文件。在我的情况下,我需要用 git checkout <branch_name> 替换 git pull
这非常完美,尤其是当有很多文件不必一个一个地做的时候,谢谢!
M
Michał Szkudlarek

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

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

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

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


这是最好/最简单的答案。疯狂的是 git merge 中没有自动执行此操作的选项。
Z
Zahin

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

git clean -dxf
git pull origin master

好吧,这也清理了我的本地 bazel 缓存:)
对于那些考虑这一点的人,请参阅有关 x 标志的许多警告,删除所有未跟踪的内容....您可以使用此删除一堆文件
M
Maarten

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

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

M
MMM

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

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

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


F
Forhadul Islam

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

git add -A
git stash
git pull

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


A
A. Davidson

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

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

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

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


没有为我工作。我删除了文件夹中的所有文件。然后是 git pull -f,然后是 git checkout .。什么样的恶梦。
真的吗?就在几周前,它对我来说还不错。您是否尝试编辑您的 gitconfig 文件以开始/停止忽略大小写?
谢谢你。在文件夹路径中修复外壳后,我需要从 master 合并。我能够将它与 git ignore case on 合并,之后我只是重新启用区分大小写。
T
Tom Bush

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

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

因为在本地没有它的实例,所以在我对 old 文件名执行 git rm 之前,我无法执行 git pull(起初这并不明显,因为我重命名它的愚蠢想法) .


u
uko akanowo

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


V
VonC

Git 2.23 (Q3 2019) 后的答案不会像 Esteisanswer 那样使用 old and confusing git checkout command

你会使用:

git switch 切换分支

git restore 来恢复文件(如图所示)

所以:

仅安全删除/覆盖烦人的文件

当你想合并时:

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 --track /。这意味着一个简单的 git pull 就足够了。


A
Ammar Mujeeb

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

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

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

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

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

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