git 结帐后 git 添加?

git checkout after a git add?

我想知道是否有办法返回到 git 上文件中的先前更改。如果我创建一个 .txt 文件,我会编辑它,但我不会 "git add" 我可以 运行 "git checkout - file.txt" 然后返回,但是有没有办法在完成 "git add"?

这个很难在那里找到,所以就在这里。如果你有一个未提交的更改(它只在你的工作副本中)你希望恢复(以 SVN 术语)到你最近提交的副本,请执行以下操作:

git checkout filename

这将从 HEAD 签出文件,覆盖您的更改。此命令也用于检查分支,您可能碰巧有一个与分支同名的文件。一切都没有丢失,您只需要输入:

git checkout -- filename

您也可以对来自其他分支的文件执行此操作,等等。 man git-checkout 有详细信息。

Internet 的其余部分会告诉您使用 git reset --hard,但这会重置您在工作副本中所做的所有未提交的更改。请小心输入。

来自 https://www.norbauer.com/rails-consulting/notes/git-revert-reset-a-single-file

I wanted to know if there is a way to go back to the previous change in a file on git. If I create a .txt file, I edit it but I don't "git add" can I run "git checkout - file.txt" and go back, but is there a way to do it after doing "git add"?

前提是文件是Git中的,答案是肯定的

这里重要的是要认识到,某些 already-committed 文件的可修改副本不是一个而是 两个,另外还有 许多 无法 更改的副本。 read-only 副本在每个提交中,因为您所做的每个提交都会保存每个文件的完整快照。1 但它使此快照不是来自副本 you 查看并使用。它从 second 可修改副本制作快照,Git 保存在 Git 有时称为 index 的内容中,并且有时调用集结区

名字indexstaging area指的是同一个东西。它有时也称为 缓存 The gitglossarycache 定义为 "obsolete for index"。考虑索引的一种好方法是它是提议的下一次提交。当您签出一些现有的提交时,Git 会从该现有提交中填充索引 以及 work-tree。当你运行git添加<em>文件</em>时,Git复制的当前版本file 到索引中,替换索引中 的副本。也就是说,git add 只是更新提议的新提交。

(如果 Git 直接从 work-tree 提交,您根本不需要索引。但是 Git 不会从 work-tree 提交,并且索引在合并冲突期间发挥了更大的作用,因此您有点难以了解索引。)

一般情况下,你使用git checkout <em>branchname</em>切换到一个分支,但你也可以写git checkout [--] <em>filename</em>git checkout <em>branchname</em> [--] <em>filename</em>.2 这些都不同于 git checkout <em>分行名称</em>:

  • git checkout <em>branchname</em>表示切换分支.
  • git checkout <em>branchname</em> [--] <em>filename</em> 意思是从指定分支顶端的提交中获取给定文件.3
  • git checkout [--] <em>filename</em> 表示从索引中获取给定的文件 /暂存区.

我喜欢考虑的方式是,当您进行新提交时,文件有 三个 个活动副本。一个是当前(HEAD@)提交中的冻结文件,一个是索引中建议的下一次提交中的可修改副本,第三个是您可以查看和使用的普通文件.使用 git checkout -- file.txt 进入 work-tree 可以使用它的 middle 副本——索引副本——你已经用之前的 [=13] 覆盖了它=].因此,您需要 git checkout HEAD -- file.txt:这会得到 read-only,已提交的副本。它在您的 work-tree 中的索引 中结束,因此两个可修改的副本都已被该命令覆盖。4 您提议的新提交在当前提交中包含 file.txt 的旧版本,而您的 work-tree 包含旧版本的 file.txt 在当前提交之外。所有三个副本——HEAD、索引和 work-tree——再次匹配。


1即使 git log -pgit show 向您显示了提交父项之间的 差异 也是如此和提交。这是因为 git log -pgit show 发现差异的方式是提取文件的父提交副本和提交副本,然后比较它们以查看不同之处。

因为提交的副本read-only,每次提交re-uses都是文件的旧版本, 不会创建 new 副本,它只是引用现有的 already-frozen 副本。所以事实上,比如说,README.md 在一千次提交中,所有 README.md 副本完全相同,真的意味着有 一个 副本,共享一千次提交。

2[--]中的方括号表示--是可选的。当你的意思是下一部分是文件名时,开始使用它是一个好习惯。假设您创建了一个名为 master 文件。后来,你运行:

git checkout master

您的意思是:给我获取名为 master 的文件,还是:*切换到分支 master `?如果您输入:

git checkout -- master

Git 知道你的意思 给我一个名为 master. 的文件 -- 之后的任何内容都被假定为文件名。如果您在没有 -- 的情况下键入此内容,Git 认为您的意思是 切换到分支 master.

3您可以输入提交哈希 ID,或任何其他名称或字符串在此处解析为提交。

4Git 事实上,还有另一种方法可以做到这一切。其实有很多方法,但是还有一种main方法:你可以使用git reset [--] <em>filename</em>HEAD 复制到索引,然后 git checkout [--] <em>filename</em> 从索引复制到 work-tree。但是 git checkout <em>commit-ish</em> -- <em>filename</em> 更短更快。