如何处理未提交的更改

Posted

技术标签:

【中文标题】如何处理未提交的更改【英文标题】:What to do about uncommitted changes 【发布时间】:2021-08-09 12:56:25 【问题描述】:

我刚刚将我的文件从旧 PC 迁移到了新 PC。这包括一些开发 git 存储库。

但我猜是因为文件被复制,日期戳不同,所以 git 现在将它们视为未提交的更改,即使文件没有其他更改。

对此最好的做法是什么,只需提交文件还是有一些 git 魔法(命令)告诉 git 一切正常?

【问题讨论】:

Git 不关心时间戳。 Git 比较内容。 然后我想知道为什么它说有未提交的更改。查看它们,它显示所有文件之间的更改为 0。 您可以使用突出显示空白更改的差异查看器检查其中一个已修改文件的差异吗? 是的,零改动 我猜你的新机器有一个不同的默认换行设置。 【参考方案1】:

git 查看文件的内容

修改日期是指示应重新计算索引的触发器,但如果文件在同一位置具有完全相同的内容,则不会显示为“已修改”。


为了确认文件有不同的内容,你可以查看git计算的hash:

# get the hash for the file in the current commit :
git ls-tree HEAD path/to/file

# compute the hash for the file on disk :
git hash-object path/to/file

如果哈希值相等,您可能遇到了索引未正确刷新的问题,请尝试运行:

git update-index --refresh

让 git 重新检查所有文件(注意:如果之后文件仍然显示为已修改,请添加评论或更新您的问题,确实会发生一些奇怪的事情)

如果哈希不同,内容肯定不同。您必须仔细查看该文件的两个版本之间的变化,例如通过比较每个版本的十六进制转储。

【讨论】:

感谢@LeGEC 的回复和建议。在阅读您的回复之前,我找到了解决方案。问题是我将 repo 从 Linux 文件系统复制到了 Windows,因此在此过程中丢失了一些文件信息。当我将 repo 从 Linux 系统克隆到 Linux 时,没有任何问题。【参考方案2】:

TLDR:文件复制 repos 而不是 git 将它们克隆到不同的文件系统(EXT4 与 NTFS/FAT32)会使 git 抱怨。

完整答案

在与一位精通 Git 的朋友交谈时,他发现了问题所在。

在将我的数据(包括 repo)从具有 Linux 文件系统的旧 PC 迁移到新的 Linux PC 时,由于我没有网络连接,我将所有内容复制到 USB HD 上,该 USB HD 使用 Window 的文件系统格式化,因此丢失了一些文件信息,并且 Git 报告所有内容都必须重新签入。

因此解决方案是仅将 repo 移动到 Linux 文件系统上。

我在 Linux 文件服务器上设置了一个远程 repo,将本地工作 repo 从旧 PC 推送到远程 git 服务器,然后将远程克隆到新 PC。

加分

克隆并未拉取所有远程分支。我找到了这个拉所有远程分支的解决方案。

git-pull-all https://gist.github.com/grimzy/a1d3aae40412634df29cf86bb74a6f72

#!/usr/bin/env bash

git branch -r | grep -v '\->' | while read remote; do git branch --track "$remote#origin/" "$remote"; done
git fetch --all
git pull --all

感谢大家的帮助、时间和建议。

【讨论】:

以上是关于如何处理未提交的更改的主要内容,如果未能解决你的问题,请参考以下文章

swift - 如何处理未捕获的异常

如何处理未捕获的错误:对象作为 React 子错误无效

如何处理未打开的推送通知(iOS、Swift)

如何处理未满足的对等依赖?

Angular 如何处理未可知异常错误

Angular 如何处理未可知异常错误