ChatGPT解决这个技术问题 Extra ChatGPT

.gitignore 和“以下未跟踪的工作树文件将被结帐覆盖”

所以我在我的 .gitignore 文件中添加了一个文件夹。

一旦我做了git status,它就会告诉我

# On branch latest
nothing to commit (working directory clean)

但是,当我尝试更改分支时,我得到以下信息:

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

这是我的 .gitignore 文件的样子:

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

我怎样才能让它工作,这样我就可以在不删除这些文件的情况下切换分支?

如果我进行更改,会影响这些文件吗?换句话说,如果我之后回到这个分支,直到我最近的提交,一切都会完美吗?

我不想丢失这些文件,我只是不想跟踪它们。

如果您真的不关心这些文件: git checkout -f 在我的情况下,文件是在构建过程中生成的,所以我不在乎
如果您执行“git checkout”(没有分支名称),有时会发生。要修复,请执行“git checkout branchname”
单独但至关重要的问题:为什么会发生此错误?为什么git不能在分支之间切换?
@ahnbizcad 因为如果您正在处理一个新文件,而另一个分支上的某个人碰巧提交了一个同名文件,那么如果您在切换分支时 git 破坏了您的版本,您会很生气。这就是存在 -f 标志的原因。

B
Black

警告:它会删除未跟踪的文件,所以它不是一个很好的答案。

我也点击了这条消息。就我而言,我不想保留文件,所以这对我有用:

git 2.11 及更新版本

git clean  -d  -f .

较旧的 git

git clean  -d  -f ""

如果您还想删除被 git 忽略的文件,请执行以下命令。

被警告!!!这很可能会破坏您的项目,只有在您 100% 知道自己在做什么的情况下才使用

git 2.11 及更新版本

git clean  -d  -fx .

较旧的 git

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

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

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

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


谢谢,在那次清洁之后,我能够重新定位;
运行 git clean 时要小心!
为避免打脸,首先使用空运行选项运行它,看看它会做什么:git clean -dfxngit clean -dfx --dry-run
哇靠。这会删除我的 xcode 上的所有配置文件,现在项目正在变成 mac 项目。运行此命令时要非常小心。我以为它只会从 git 中删除它。
-x 选项伤害了我
a
aerin

警告:这将删除未编入索引的本地文件

强制它:git checkout -f another-branch


警告:这将删除未编入索引的本地文件。
git clean 对我不起作用,但力量正是我所需要的。它卡在那个分支上,我只需要它来改变分支。
我不想要没有索引的文件!为你 +1
我收到了这个错误,,, :( error: pathspec 'mybranch' did not match any file(s) known to git.
这是真正的答案。
F
Fry

似乎您希望忽略这些文件,但它们已经被提交。 .gitignore 对已在 repo 中的文件没有影响,因此需要使用 git rm --cached 删除它们。 --cached 将阻止它对您的工作副本产生任何影响,并且它只会在您下次提交时标记为已删除。从存储库中删除文件后,.gitignore 将阻止再次添加它们。

但是您的 .gitignore 存在另一个问题,您过度使用通配符并导致它的匹配程度低于您的预期。相反,让我们更改 .gitignore 并尝试一下。

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/

谢谢....我从当前分支中删除了所有文件并备份了它们。然后换树枝放回去。那行得通。另外,感谢 .gitignore 的提示
我遇到了不需要跟踪的 /build 文件夹的问题。所以我删除了本地文件夹,提交了我的 .gitignore 文件,然后检查了另一个分支。这终于对我有用。
我认为第一部分与此特定错误消息相反。此错误表明用户当前位于没有跟踪这些 JPG 文件的分支中,并且用户正试图移动到有跟踪的分支。所以做 git rm --cached 不会有什么不同,这些文件在当前分支中不存在。对于这个错误,我认为用户需要遵循@Greg Hewgill 的回答 - “将它们移出工作副本,切换分支,然后将它们移回”。
当我做 git rm -r --cache test/node_modules 时,如何用 fatal: pathspec 'test/node_modules' did not match any files 解决 your files would be overwritten?由于被覆盖的消息,我无法提取并且无法删除,因为 git 找不到它们(它们在那里)
@rocksNwaves 您尝试更改的分支是否也将这些文件提交给它?如果是这样并且您不希望在任何分支中跟踪这些文件,则应首先将文件备份到 git 存储库之外。然后您可以切换到每个分支并使用 git rm 删除该分支中的文件并提交。最后,您可以将文件移回,它们将不再被覆盖。
m
mattbasta

如果您使用的是 OS X,可能是因为文件名的某些字符大小写发生了变化。尝试设置以下配置选项:

git config core.ignorecase true

它也适用于 Windows,看起来这种情况首先是由于 GIT 无法确定的大小写变化而发生的
这正是我遇到的问题,文件路径由一个字母大小写不同 - Windows 将其视为相同,但 GIT 没有,这是问题所在。
我的问题发生在结帐 Windows 10 中的另一个分支时,只有这对我有用,谢谢
惊人的!这解决了我在标签之间移动时的问题
如果您也尝试 git rebase,它也可以工作。谢谢。
u
user7294900

这对我有用。

 1. git fetch --all
 2. git reset --hard origin/{branch_name}

请在您的解决方案中添加说明。见stackoverflow.com/help/how-to-answer
这是我的看法。不知何故,您的远程分支的本地副本实际上包含所有未跟踪的文件。您正在检查它以恢复它最初抱怨的未跟踪文件。现在您可以切换到其他分支
出于某种原因,这对我来说是唯一可行的解决方案。谢了哥们。
解决了我的问题。谢谢
非常感谢,很简单! git reset --soft origin/develop 。我多么讨厌这些合并冲突编辑。这个命令很好很简单。
G
Greg Hewgill

Git 告诉您它想要创建文件(名为 public/system/images/9/... 等),但您在该目录中已经有现有的文件,没有被 Git 跟踪。也许其他人将这些文件添加到 Git 存储库,这是您第一次切换到该分支?

您的 develop 分支中的这些文件而不是当前分支中的这些文件可能是有原因的。您可能需要询问您的合作者为什么会这样。

我怎样才能让它工作,这样我就可以在不删除这些文件的情况下切换分支?

如果不使文件以某种方式消失,您将无法做到这一点。您现在可以将 public 重命名为 my_public 或其他名称。

如果我之后回到这个分支,直到我最近的提交,一切都会完美吗?

如果您提交更改,Git 不会丢失它们。如果您不提交更改,那么 Git 会非常努力地不覆盖您所做的工作。这就是 Git 在第一个实例中警告您的内容(当您尝试切换分支时)。


感谢您的解释。我备份了文件,切换了分支并合并了它们,然后替换了公共文件夹中的文件。那行得通。
正如我对@Arrowmaster 的回答所评论的那样。这是错误消息的正确答案。对于这个特别发问的人来说,这可能不是正确的答案,因为他真正的问题似乎是他的 gitignore。
A
Abhishek Goel

这个微妙的任务有一个命令(永久删除未跟踪的文件)

git clean -i

然后 git pull 就可以了。


W
Wolfson

这两个功能

git rm --cached git checkout -f 另一个分支

对我不起作用。

相反,我按照 Git 告诉您的方式实际删除了该文件(在 Eclipse 中);

Please move or remove them before you can switch branches.

然后我添加/提交它。

然后我拉了它,它起作用了!


R
Rory O'Kane

对于那些需要比 Scott Schafer’s answer 更深远的东西的人,

git clean -f

可能会起作用。我强烈建议跑步

git clean --dry-run

第一的。如果您运行 git clean -f,该命令将输出 Git 将删除的文件列表,并且可能会为您免去无意中删除您不想删除的内容的痛苦。

有关 git clean 的更多信息,请参阅 this Stack Oveflow answerthe docs


K
Kyle Clegg

不幸的是,git rm --cachedgit clean -d -fx "" 都没有为我做这件事。

我的解决方案最终是将我的分支推送到远程,克隆一个新的 repo,然后在新的 repo 中进行合并。其他访问 repo 的人也必须这样做。

故事的寓意:从一开始就使用 .gitignore 文件。


N
Nakilon

如果你想快速解决这个问题,你可以使用这个命令:

git checkout -f dev

当我的问题与 .gitignore afaik 无关时,这对我有帮助。
错误:pathspec 'dev' 与 git 已知的任何文件都不匹配。
@Black 'dev' 是分支名称,请改为使用您的分支
W
Wolfson

在根据早期提交签出分支时,我遇到了同样的问题。由于未跟踪的文件,Git 拒绝签出。

我找到了一个解决方案,我希望它也能帮助你。

将受影响的目录添加到 .gitignore 并对其发出 $ git rm -r --cached 显然是不够的。

假设您想基于较早的提交 K 创建一个分支来测试一些东西并返回到当前版本。我会按照以下步骤进行:

设置未跟踪的文件:编辑 .gitignore 并在您希望 git 忽略的文件和目录上应用 $ git rm -r --cached。还将文件 .gitignore 本身添加到 .gitignore 中,不要忘记发出 $ git rm -r --cached .gitignore。这将确保 git 的忽略行为在早期提交中保持不变。提交您刚刚所做的更改: $ git add -A $ git commit 保存当前日志,否则返回当前版本可能会遇到问题 $ git log > ../git.log 硬重置到提交 K $ git reset --hard version_k 根据提交 K 创建一个分支 $ git branch commit_k_branch 签出到该分支 $ git checkout commit_k_branch 做你的事情并提交它 再次签出到 master $ git checkout master 再次重置到当前版本 $ git reset current_version 或$ git reset ORIG_HEAD 现在你可以硬重置为 HEAD git reset --hard HEAD

注意! 不要跳过倒数第二个步骤(例如 $ git reset --hard ORIG_HEAD ),否则上面 git 抱怨的未跟踪文件将丢失。

我还确保 git 抱怨的文件没有被删除。我将它们复制到文本文件并发出命令 $ for i in $(cat ../test.txt); do ls -ahl $i; done

如果您再次结帐到上述分支,请不要忘记发出 $ git status 以确保不会出现不需要的更改。


R
Ryan Lundy

这发生在我的 Windows 8 系统上,在命令提示符下使用 Git。我团队的其他成员使用 TFS,我使用 Microsoft 的 git-tf 在 TFS 和我的本地 Git 存储库之间推/拉。

问题的出现是由于一些文件被重命名只是为了改变它们的大小写。似乎发生的事情是这样的:

这些文件在其名称中使用混合大小写签入。

在后来的提交中,文件名全部更改为小写。

git-tf 最初得到混合大小写的文件。

当文件重命名为小写时, git-tf 没有获取文件,因为对于 Windows 8,这些文件名是等效的。

由于 Git 区分大小写,它抱怨我有不在源代码控制中的混合大小写文件。但是使用 git status,我看不到任何更改,因为在 Windows 命令提示符下,这些文件名是等效的。

对我来说最简单的解决方案是:

git checkout 项目的早期版本,在这些文件被添加之前。

然后 git checkout 项目的最新版本,文件大小写正确。


+1 我能够在当前分支和分支上使用 git log 来变基以查看何时发生更改案例的提交;然后我绕过它......
w
wisbucky

就我而言,问题出在子模块上。 master 与向项目添加新子模块的另一个分支合并。我试图签出的分支没有它,这就是为什么 git 抱怨未跟踪的文件,而其他建议的解决方案都不适合我。我强迫结帐到我的新分支,然后拉了主人。

git checkout -f my_branch

git pull 起源大师

git子模块更新--init


s
saber tabatabaee yazdi

这个命令解决了我的问题:

git add * 
git stash
git pull

a
applesnort

在我的情况下,git rm --cached 不起作用。但我得到了一个git rebase


S
Sheraz Ahmad Khilji

我也面临类似的问题,我尝试了上面发布的所有解决方案,但没有奏效

问题是我在 develop 分支中重命名我的 onMusicUpdateListener.javaOnMusicUpdateListener.java 时引起的。

现在 master 拥有 onMusicUpdateListener.java,而 develop 拥有与 OnMusicUpdateListener.java 相同的文件

现在,每当我切换到 master 时,它都会给我一个错误

The following untracked working tree files would be overwritten by checkout

然后是 aborted

为了解决这个问题,我强行checked out master 分支,然后将我的 onMusicUpdateListener.java 重命名为 OnMusicUpdateListener.javacommitted 然后将 mergeddevelop 分支重命名。

然后我通过 merging 将我的 develop 分支更新为 master,现在一切恢复正常,问题已解决。


我以前也遇到过类似的问题。据我了解,区分大小写问题似乎只是 Windows 上的问题。我猜你是在windows上开发的?
W
Wolfson

这很容易解决,git 说你在两个分支中都有相同的文件,因此你必须从 master 分支中删除特定文件,然后你才能合并:

git merge "your branch"

我希望它对你有用,我刚刚解决了我的错误。我的错误是:

error: The following untracked working tree files would be overwritten by merge:
        .vs/slnx.sqlite
Please move or remove them before you merge.
Aborting

现在它正在工作!在我的情况下,.vs/slnx.sqlite 是由 Visual Studio 生成的,我需要在删除它之前关闭它。


我对 xcode 和 swiftpm/Package.resolved 有同样的问题,这对我有用。
W
Won Jun Bae

这可能是权限问题,

改变所有权,

sudo chown -v -R usr-name:group-name folder-name

我也遇到了和 Won 一样的问题。我将 .gitignore 添加到已被跟踪的文件夹中。我删除了该文件,然后能够进行 git checkout。
S
Skatox

2 个同名但大小写不同的文件可能是问题所在。

您可以删除这些文件上的一个或重命名它。前任:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

g
gmatht

移动文件,而不是删除

避免删除文件的一种方法是移动它们。例如:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done

L
Lyuboslav

如果您已在本地重命名文件然后执行 pull,它将显示该错误消息。


在这种情况下如何克服这个错误?在更改文件名 (MyFile => myfile) 后切换分支时也会出现此消息。
M
Markosaurus

就我而言,我看到此错误是因为我使用的是流行的开源 CMS,而导致问题的目录是 CMS 写入的上传目录。

所以它的意思是有些文件你没有,但你不能从版本控制中得到。

我正在将所有文件从实时站点抓取到我的本地,然后我会将其签入 repo,希望这可以解决问题。


v
vishnuc156

从 appname/gen/ 中删除 .gitignore 文件以解决此问题。


P
Phil Carter

我只是去了文件系统并直接删除了文件,然后继续使用 git checkout 并且它起作用了。

我已经多次出现该问题,这可能与开发人员进行删除、推送、重新添加、推送或类似的事情有关。


E
Erdinç Çorbacı

大多数答案都考虑删除或删除文件,这是最简单的方法。但有时您不想摆脱本地文件。但是与策略合并,所以 git 也有解决方案;

git merge --strategy=ours master 

B
Black

只需删除文件或重命名它们。

例如

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

我不得不重命名/删除 ajax/product.php 和 ajax/produtPrice.php。

别担心, git pull 会把它们带回来。我建议您重命名它们而不是删除它们,因为您可能会丢失一些更改。

如果这没有帮助,那么您必须删除整个分支并重新创建它,然后执行 git pull origin remotebranch


M
MöĦämëđ ÏbŗäĦïm

为了保存修改后的文件,以便以后使用修改后的内容。我在尝试检查分支和尝试变基时发现了这个错误。尝试 Git 存储

git stash


C
Codemaker

检查是否有任何文件夹名称包含“/”或任何特殊符号,然后重命名该文件夹。然后,您只需将存储库克隆到另一个位置。


m
mZed

一个简单的解决方案可能是:只需确保您位于 GitBash 中的正确工作目录中。如果用户尝试在其文件夹层次结构中合并太高的目录,则几乎每次都会出现该消息。

例子:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

场景:用户在 git-folder 中克隆了 repo 他在 Eclipse 中创建了一个新的 Java 项目,导入了克隆的 repo。 Eclipse 在他的本地项目中将 myProjectSourceFolder 设置为源文件夹。因此用户在 git bash 中输入它并从那里推送、拉取和提交他的项目。因此 git 同步 myProjectSourceFolder -但在他的历史记录中没有关于 myBashSourceFolder 的记录。因此,如果用户下次尝试从那里同步,而不是他之前工作的文件夹,来自 myBashSourceFolder 的推/拉/合并将产生给定的输出。

解决方案:输入正确的文件夹并再次尝试拉取。在我遇到的几乎每次,这个解决方案都很好:)