我想知道是否有办法回到git文件中的上一个更改。如果我创建一个.txt文件,则可以对其进行编辑,但是我不执行“ git add”操作,是否可以运行“ git checkout-file.txt”并返回,但是在执行“ git add”操作后是否有办法呢?
答案 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 [--] filename
或git checkout branchname [--] filename
。 2 与{{ 1}}:
git checkout branchname
表示开关分支。git checkout branchname
意味着从命名分支尖端的提交中获取给定文件。 3 git checkout branchname [--] filename
意味着从索引/暂存区中获取给定文件。我想考虑的方式是,当您进行新提交时,该文件有三个个活动副本。一个是您当前(git checkout [--] filename
或HEAD
)提交中的冻结文件,一个是索引中建议的下一个提交中的可修改副本,第三个是您可以查看和使用的普通文件。使用@
进入工作树,您可以在其中使用中间副本(索引副本),该副本已被您先前的git checkout -- file.txt
覆盖。因此,您需要git add
:这将获得只读的提交副本。此时,它会在您的工作树中的索引和中结束,因此这两个可修改的副本已被此命令覆盖。 4 您建议的新提交当前提交中的旧版本是 git checkout HEAD -- file.txt
,而工作树中当前提交中的旧版本是 file.txt
。所有三个副本(file.txt
,索引和工作树)再次匹配。
1 这是正确的,即使HEAD
或git log -p
向您显示了提交的父级与提交之间的差异。这是因为git show
或git 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 方法:您可以使用master
从git 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