929

所以我在我的 .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/*

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

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

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

4

31 回答 31

1135

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

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

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需要强制它运行。

于 2011-12-02T20:38:33.940 回答
694

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

强迫它:git checkout -f another-branch

于 2013-01-11T17:40:41.380 回答
282

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

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

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/
于 2011-02-01T01:59:22.480 回答
174

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

git config core.ignorecase true
于 2014-05-30T17:54:00.573 回答
48

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

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

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

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

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

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

于 2011-02-01T01:47:15.070 回答
46

这对我有用。

 1. git fetch --all
 2. git reset --hard origin/{branch_name}
于 2018-01-08T12:36:18.447 回答
22

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

git clean -i

然后git pull会做。

于 2016-09-21T08:37:58.817 回答
19

这两个功能

  1. git rm --cached
  2. git checkout -f another-branch

对我不起作用。

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

Please move or remove them before you can switch branches.

然后我添加/提交它。

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

于 2017-02-08T16:46:46.707 回答
14

对于那些需要比Scott Schafer 的回答更深远的东西的人来说,

git clean -f

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

git clean --dry-run

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

有关更多信息,请参阅此 Stack Oveflow 答案文档git clean

于 2018-02-14T17:29:34.967 回答
12

不幸的是,我既没有git rm --cachedgit clean -d -fx ""没有这样做。

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

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

于 2013-01-09T05:33:41.797 回答
10

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

git checkout -f dev
于 2016-06-24T07:24:24.743 回答
9

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

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

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

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

  1. 设置未跟踪的文件:编辑.gitignore并应用$ git rm -r --cached您希望 git 忽略的文件和目录。还将文件.gitignore本身添加到.gitignore并且不要忘记发出$ git rm -r --cached .gitignore. 这将确保 git 的忽略行为在早期提交中保持不变。

  2. 提交您刚刚所做的更改:

    $ git add -A
    $ git commit
    
  3. 保存当前日志,否则返回当前版本可能会出现问题

    $ git log > ../git.log

  4. 硬重置到提交 K

    $ git reset --hard version_k

  5. 根据提交 K 创建一个分支

    $ git branch commit_k_branch

  6. 结帐到该分支

    $ git checkout commit_k_branch

  7. 做你的事情并提交它

  8. 再次结帐回到主人

    $ git checkout master

  9. 再次重置为当前版本

    $ git reset current_version或者$ git reset ORIG_HEAD

  10. 现在你可以硬重置到 HEAD

    git reset --hard HEAD

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

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

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

于 2012-02-05T17:58:00.617 回答
8

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

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

  • 这些文件在其名称中使用混合大小写签入。
  • 在后来的提交中,文件名全部更改为小写。
  • git-tf 最初得到混合大小写的文件。
  • 当文件重命名为小写时, git-tf 没有获取文件,因为对于 Windows 8,这些文件名是等效的。
  • 由于 Git 区分大小写,它抱怨我有不在源代码控制中的混合大小写文件。但是使用git status,我看不到任何更改,因为在 Windows 命令提示符下,这些文件名是等效的。

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

  • git checkout该项目的早期版本远在添加这些文件之前
  • 然后git checkout是最新版本的项目,具有正确的文件大小写。
于 2014-08-19T13:25:56.520 回答
5

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

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init
于 2018-01-23T13:08:28.793 回答
3

在我的情况下git rm --cached没有工作。但我得到了它git rebase

于 2012-06-14T13:47:27.573 回答
3

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

这个问题是我在分支中重命名onMusicUpdateListener.java的时候引起的。OnMusicUpdateListener.javadevelop

现在master拥有onMusicUpdateListener.javadevelop拥有相同的文件OnMusicUpdateListener.java

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

The following untracked working tree files would be overwritten by checkout

然后它aborted

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

然后我通过它更新了我的develop分支,现在一切都恢复正常并且问题解决了。mergingmaster

于 2015-09-01T06:47:11.700 回答
3

这很容易解决,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 生成的,我需要在删除它之前关闭它。

于 2017-12-28T18:24:48.160 回答
2

这可能是权限问题,

改变所有权,

sudo chown -v -R usr-name:group-name folder-name
于 2015-04-24T20:10:00.367 回答
2

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

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

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)
于 2016-11-10T12:12:36.677 回答
2

移动文件,而不是删除

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

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done
于 2017-03-10T06:16:38.523 回答
1

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

于 2017-10-23T08:50:37.053 回答
1

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

git add * 
git stash
git pull
于 2021-11-09T10:00:57.077 回答
0

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

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

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

于 2014-10-31T11:12:09.797 回答
0

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

于 2016-01-19T09:32:02.727 回答
0

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

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

于 2017-12-13T21:27:22.097 回答
0

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

git merge --strategy=ours master 
于 2018-08-02T14:50:05.853 回答
0

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

例如

$ 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.phpajax/produtPrice.php

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

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

于 2018-08-29T13:23:55.280 回答
0

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

git stash

于 2018-11-12T09:47:35.303 回答
0

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

于 2019-05-16T09:55:29.637 回答
0

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

例子:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

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

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

于 2019-11-15T12:36:39.473 回答
0

在我的情况下,问题是由于文件名从 更改subscribe.tsSubscribe.ts.

所以我检查了我的分支dev是否与我所在的当前分支是最新的,main.

(当前分支主要

  1. git merge dev

    >已经更新了

  2. git branch -d dev

  3. git checkout -b dev

于 2021-11-11T11:33:46.977 回答