git添加后git checkout?

时间:2019-05-30 15:12:51

标签: git git-checkout git-add

我想知道是否有办法回到git文件中的上一个更改。如果我创建一个.txt文件,则可以对其进行编辑,但是我不执行“ git add”操作,是否可以运行“ git checkout-file.txt”并返回,但是在执行“ git add”操作后是否有办法呢?

2 个答案:

答案 0 :(得分:2)

  

我想知道是否有办法回到git文件中的上一个更改。如果我创建一个.txt文件,则可以对其进行编辑,但是我不执行“ git add”操作,是否可以运行“ git checkout-file.txt”并返回,但是在执行“ git add”操作后是否有办法呢?

提供文件在Git中,答案是肯定的。

在这里重要的是要认识到,某些已经提交的文件不是一个,而是两个 个可修改的副本,以及不能许多个副本。被改变。只读副本位于每个提交中,因为您进行的每个提交都会保存每个文件的完整快照。 1 但这会使该快照不来自副本 you 查看并使用。它代替了 second 的可修改副本制作快照,Git将其保存在Git有时称为 index 有时称为 staging area 的地方。 / p>

名称​​ index 暂存区指的是同一件事。有时也称为缓存The gitglossary cache 定义为“索引已过时”。考虑索引的一种好方法是它是建议的下一次提交。当您检出一些现有提交时,Git会从该现有提交中填充索引。当您运行git add file时,Git会将 file 的当前版本复制到索引中,替换索引中曾经的副本。也就是说,git add只是更新了建议的新提交。

(如果Git直接从工作树进行提交,则根本不需要索引。但是Git不需要从工作树进行提交,并且索引在发生冲突的合并期间承担扩展角色,因此您有点想了解索引。)

通常,您使用git checkout branchname切换到分支,但也可以编写git checkout [--] filenamegit checkout branchname [--] filename 2 与{{ 1}}:

  • git checkout branchname表示开关分支
  • git checkout branchname意味着从命名分支尖端的提交中获取给定文件 3
  • git checkout branchname [--] filename意味着从索引/暂存区中获取给定文件

我想考虑的方式是,当您进行新提交时,该文件有三个个活动副本。一个是您当前(git checkout [--] filenameHEAD)提交中的冻结文件,一个是索引中建议的下一个提交中的可修改副本,第三个是您可以查看和使用的普通文件。使用@进入工作树,您可以在其中使用中间副本(索引副本),该副本已被您先前的git checkout -- file.txt覆盖。因此,您需要git add:这将获得只读的提交副本。此时,它会在您的工作树中的索引中结束,因此这两个可修改的副本已被此命令覆盖。 4 您建议的新提交当前提交中的旧版本是 git checkout HEAD -- file.txt ,而工作树中当前提交中的旧版本是 file.txt 。所有三个副本(file.txt,索引和工作树)再次匹配。


1 这是正确的,即使HEADgit log -p向您显示了提交的父级与提交之间的差异。这是因为git showgit log -p发现差异的方式是,它提取了文件的父提交的副本和提交的副本,然后将它们进行比较以查看有什么不同。

因为提交的副本 是只读的,所以重新使用文件的旧版本的每次提交都不会产生新的 复制,它只是指回已冻结的现有复制。因此,例如git show在一千次提交中,而所有README.md副本都完全相同,这实际上意味着存在一个一个副本,在千次提交中共享

2 README.md中的方括号表示[--]是可选的。当您指的是下一部分是文件名时,这是一个好习惯。假设您创建一个名为--文件。稍后,您运行:

master

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

master

Git知道您的意思是请给我一个名为git checkout -- master 的文件。假定master之后的所有内容都是文件名。如果您键入时不带--,则Git认为您的意思是切换到分支--

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

4 Git就是它的存在,还有另一种方法可以完成所有这些操作。其实有很多方法,但是还有另外一种 main 方法:您可以使用mastergit reset [--] filename复制到索引,然后使用HEAD复制索引到工作树。但是git checkout [--] filename更短,更快。

答案 1 :(得分:1)

这个很难找到,所以就在这里。如果您有一个未提交的更改(仅在您的工作副本中)想要在最近一次提交中还原(以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