只是好奇的想知道。假设我有一个名为git add的文件,我将Hello World\n添加到该文件并测试它。
现在,在登台区域中,应该有一个名为test with content Hello World\n的文件。
现在我添加另一行Hello World 2\n,然后git add它。
现在我的中转区将是文件测试,其内容为"Hello World\n Hello World2\n“。
现在,我有什么方法可以撤销我的第二个git-add,使登台区域返回到内容为"Hello World\n“的文件测试。
假设:此时可能会有任何提交,也可能没有。请考虑两个条件。
Additions:如果有多个git-add,我想要撤销它们的最后n次怎么办。
发布于 2016-04-07 05:22:06
一旦你做了git add,Git就会开始跟踪文件,并在每次你向登台区域添加文件时创建一个-1。
只要git gc没有压缩和清理存储库,您就可以恢复和恢复登台区域中的任何版本。
假设您没有运行git gc,那么您只需要知道文件的SHA-1即可。
当我再次将同一文件添加到临时区域时会发生什么情况?
一旦您添加了相同的文件来存储新的内容,Git就会为该文件计算新的SHA-1,并使用新的SHA-1更新树。旧的SHA-1仍然存储在.git/objects下。
如何恢复“旧的”暂存文件?
首先,您需要找到所需文件的SHA-1。
# print the list of all the dangling files in the repo
git fsck
# now you need to manually search the files to find the desired
# "old file" and then restore it using git cat-file -p

一个完整的例子:
cd tmp
mkdir repo1
cd repo1
git init
echo 'line1' > a.txt
git add .
echo 'line2' >> a.txt
git add .
git fsck
git cat-file -p a29bdeb434d874c9b1d8969c40c42161b03fafdc
git cat-file -p c0d0fb45c382919737f8d0c20aaf57cf89b74af8

发布于 2016-04-07 05:09:58
stage不保存单个操作,它只保存文件的状态。因此,如果您进行多次添加,您只会在阶段中看到结果,而不是一系列操作。
Git本身告诉您如何恢复分段更改:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: blah.txthttps://stackoverflow.com/questions/36462328
复制相似问题