git reset --hard之后没有暂停的更改

Nor*_*wap 248 git git-reset

标题说明了一切.

之后git reset --hard,git status给我Changes not staged for commit:部分内的文件.

我也尝试了git reset .,git checkout -- .并且git checkout-index -f -a无济于事.

那么,我怎样才能摆脱那些未分阶段的变化呢?

这似乎只打击Visual Studio项目文件.奇怪的.请参阅此粘贴:http://pastebin.com/eFZwPn9Z.这些文件的特殊之处在于.gitattributes我有:

*.sln        eol=crlf
*.vcproj     eol=crlf
*.vcxproj*   eol=crlf
Run Code Online (Sandbox Code Playgroud)

此外,autocrlf在我的全局中设置为false .gitconfig.这可能是某种相关的吗?

Gam*_*ing 343

我有同样的问题,它与.gitattributes文件有关.但是,未在文件中指定导致问题的文件类型.gitattributes.

我只需运行即可解决问题

git rm .gitattributes
git add -A
git reset --hard
Run Code Online (Sandbox Code Playgroud)

  • @NLwino,`git rm .gitattributes`从索引中删除.gitattributes.`git add -A`将所有(包括删除.gitattributes)添加到索引中,**应该*只删除.gitattributes,如果这确实是问题.`git reset --hard`重置所有未提交的更改,其中包括删除.gitattributes.本质上,这会忽略一个提交的.gitattributes(以及`*text = auto`指令),删除它,然后在删除索引时重置索引,因此将其放回原处,但是在你已经重置其他文件之后,所以它们就这样了没有再修改. (18认同)
  • 它是gitattributes文件中的*text = auto指令.它会自动更改文件结尾,因此当您检查状态时,文件将自动标记为"已修改". (7认同)
  • @GameScripting,这个解决方案对我不起作用.没有`.gitattributes`这样的文件:*"致命:pathspec'.gitattributes'与任何文件都不匹配"* (4认同)
  • 我这样做,它说'致命:pathspec'.gitattributes'与任何文件都不匹配`.我究竟做错了什么? (4认同)
  • 这有效,但我不明白为什么.有人关心解释每个命令吗? (3认同)
  • @pacerier所以你可能有一个不同的问题,需要另一个解决方案:) (2认同)

小智 110

解决!!!

我已经使用以下stpes解决了这个问题

1)从Git的索引中删除每个文件.

git rm --cached -r .
Run Code Online (Sandbox Code Playgroud)

2)重写Git索引以获取所有新行结尾.

git reset --hard
Run Code Online (Sandbox Code Playgroud)

解决方案是git网站https://help.github.com/articles/dealing-with-line-endings/上描述的步骤的一部分

  • 没有别的办法,这就行了!我们已经尝试了这个和许多其他线程中的所有内容 - 它是一个很大的开发团队,因此让每个人都处于同一个角落是一场噩梦,但这解决了这个问题. (4认同)
  • 考虑您在Windows上,并且不区分大小写。如果您还与区分大小写的文件系统(例如Mac或Linux)上的开发人员一起工作,则他们可能会在不同情况下提交标签,分支甚至文件。在这种情况下,您的索引将显示操作系统拉出时覆盖的现有文件。解决该问题的唯一方法是在您的Git服务器上建立命名策略(挂钩)或预先嗅出错误。 (3认同)
  • 这对我来说没有用。我需要在 `git reset --hard` 之前执行 `git add .` (3认同)
  • 有趣的是......我使用“git rm --chached <one_specific_file>”,而不是删除所有内容。“git status”报告该文件已删除且未跟踪。然后“git reset --hard”修复该文件*和*所有其他文件被报告为“Changes not staged”的文件。(在使用 git rm 之前,我努力尝试重置,但没有效果)。我喜欢这种神秘的源代码控制系统。 (2认同)
  • 那是残酷的。您可以通过删除 repo 目录并重新克隆来做同样的事情。 (2认同)

Yur*_*que 90

Git不会重置不在存储库上的文件.所以你可以:

$ git add .
$ git reset --hard
Run Code Online (Sandbox Code Playgroud)

这将暂存所有更改,这将导致Git知道这些文件,然后重置它们.

如果这不起作用,您可以尝试存储和删除更改:

$ git stash
$ git stash drop
Run Code Online (Sandbox Code Playgroud)

  • 这些文件已被跟踪.无论如何都试过它,它也不起作用.我的回购一定有什么问题,但我不知道是什么.对于git stash thingy,请参阅我对Shahbaz的回答. (4认同)

vez*_*kov 59

如果您使用Git for Windows,这可能是您的问题

我有同样的问题,藏匿,硬重置,清洁,甚至所有这些仍然留下了变化.结果是问题的是git没有正确设置的x文件模式.这是一个使用git for windows的"已知问题".本地更改以gitk和git状态显示为旧模式100755新模式100644,没有任何实际文件差异.

修复是忽略文件模式:

git config core.filemode false
Run Code Online (Sandbox Code Playgroud)

更多信息在这里

  • 即使`rm -rf *;也可以工作 git checkout HEAD。`没有。! (2认同)
  • 为我工作,而 stash drop / hard reset / rm .attributes 都失败了。 (2认同)

Nor*_*wap 31

好的,我有点解决了这个问题.

它似乎是.gitattributes文件,包含:

*.sln        eol=crlf
*.vcproj     eol=crlf
*.vcxproj*   eol=crlf
Run Code Online (Sandbox Code Playgroud)

使项目文件显示为未分级.我不知道为什么会这样,我真的希望有人知道git的方式会给我们一个很好的解释.

我的修复是删除这些文件,并添加autocrlf = false[core].git/config.

这与前一个配置完全不同,因为它需要每个开发人员autocrlf = false.我想找一个更好的解决方案.

编辑:

我对这些有罪的线路进行了评论,对它们进行了评论并且有效.什么......我甚至不......


Ram*_*man 19

可能的原因#1 - 线路结束标准化

可能发生这种情况的一种情况是,当有问题的文件被检入存储库时,没有正确的行结尾配置(1)导致存储库中的文件具有错误的行结尾或混合行结尾.要确认,请确认git diff仅显示行结尾的更改(默认情况下可能不会显示这些更改,请尝试git diff | cat -v将回车符视为文字^M字符).

随后,有人可能添加了一个.gitattributes或修改了core.autocrlf设置以标准化行结尾(2).基于.gitattributes或全局配置,Git已对您的工作副本应用了本地更改,这些更改应用了请求的行结束规范化.不幸的是,由于某些原因git reset --hard,不会撤消这些行规范化更改.

重置本地行结尾的解决方法无法解决问题.每当git"看到"文件时,它都会尝试重新应用规范化,从而导致同样的问题.

最好的选择是让git应用它想要的规范化,通过规范化repo中的所有行结尾来匹配.gitattributes,并提交这些更改 - 请参阅尝试使用git filter-branch修复行结尾,但没有运气.

如果你真的想尝试手动恢复文件的更改,那么最简单的解决方案似乎是擦除修改后的文件,然后告诉git恢复它们,虽然我注意到这个解决方案似乎不能始终如一地工作100%时间(警告:如果修改后的文件有除行尾之外的更改,请不要运行此命令!!):

    git status --porcelain | grep "^ M" | cut -c4- | xargs rm
    git checkout -- .
Run Code Online (Sandbox Code Playgroud)

请注意,除非您在某个时刻对存储库中的行结尾进行规范化,否则您将继续遇到此问题.

可能的原因#2 - 案例不敏感

第二个可能的原因是Windows或Mac OS/X上的不区分大小写.例如,假设存储库中存在以下路径:

/foo/bar

现在有人在Linux上提交文件/foo/Bar(可能是由于构建工具或创建该目录的东西)并推送.在Linux上,这实际上是两个独立的目录:

/foo/bar/fileA
/foo/Bar/fileA
Run Code Online (Sandbox Code Playgroud)

在Windows或Mac上检查此repo可能会导致修改fileA无法重置,因为在每次重置时,Windows上的git都会检出/foo/bar/fileA,然后因为Windows不区分大小写,会覆盖fileAwith 的内容/foo/Bar/fileA,从而导致它们被"修改".

另一种情况可能是存在于repo中的单个文件,当在不区分大小写的文件系统上检出时,它们会重叠.例如:

/foo/bar/fileA
/foo/bar/filea
Run Code Online (Sandbox Code Playgroud)

可能存在可能导致此类问题的其他类似情况.

对不区分大小写的文件系统的git应该真正检测到这种情况并显示一条有用的警告消息,但它目前没有(这可能会在未来发生变化 - 请参阅git.git邮件列表中的此讨论和相关的建议补丁).

解决方案是将git索引中的文件和Windows文件系统上的大小写对齐.这可以在Linux上完成,它将显示事物的真实状态,或者在Windows上使用非常有用的开源实用程序Git-Unite.Git-Unite会将必要的大小写更改应用于git索引,然后可以将其提交到repo.

(1)这是最有可能使用Windows的人,没有任何.gitattributes有问题的文件定义,并使用默认的全局设置为core.autocrlffalse(见(2)).

(2)http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/


jos*_*ell 12

如果其他答案不起作用,请尝试添加文件,然后重设

$ git add -A
$ git reset --hard
Run Code Online (Sandbox Code Playgroud)

就我而言,这在git跟踪大量空文件时很有帮助。

  • 这有效。我只是使用了 `$ git add .` 而不是 `$ git add -A` (2认同)

Oha*_*der 9

造成这种情况的另一个原因可能是不区分大小写的文件系统.如果您的仓库中的多个文件夹位于同一级别,其名称仅因大小写而异,则会受到此影响.使用其Web界面(例如GitHub或VSTS)浏览源存储库以确保.

有关更多信息,请访问:https://stackoverflow.com/a/2016426/67824


Sha*_*baz 7

您可以stash删除您的更改,然后删除存储:

git stash
git stash drop
Run Code Online (Sandbox Code Playgroud)


Joh*_*unt 5

这些方法都不适合我,唯一的解决方案是取消整个 repo 并重新克隆它。这包括隐藏、重置、添加然后重置、clrf 设置、区分大小写等。 叹..


mrk*_*rks 5

运行清理命令:

# Remove all untracked files and directories. (`-f` is `force`, `-d` is `remove directories`)

git clean -fd
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这并不能解决与行尾相关的问题。 (4认同)

mrf*_*lis 5

我相信 Windows 版 git 存在一个问题,即 git 在签出时随机写入错误的行结尾,唯一的解决方法是签出其他一些分支并强制 git 忽略更改。然后检查您真正想要工作的分支。

git checkout master -f
git checkout <your branch>
Run Code Online (Sandbox Code Playgroud)

请注意,这将放弃您可能有意进行的任何更改,因此仅当您在结帐后立即遇到此问题时才执行此操作。

编辑:我第一次可能真的很幸运。结果换了分支后又被咬了。事实证明,更改分支后 git 报告为已修改的文件正在更改。(显然是因为 git 没有一致地正确地将 CRLF 行结尾应用于文件。)

我更新到了 Windows 的最新 git,希望问题已经消失。


归档时间:

查看次数:

115270 次

最近记录:

5 年,12 月 前