只是好奇才知道。假设我有一个名为test的文件,我将Hello World\n
添加到文件中并git add
。
现在在暂存区域中,应该有一个名为test且内容为Hello World\n
的文件。
现在我添加另一行Hello World 2\n
,然后添加git add
。
现在我的暂存区域将是文件测试,其内容为“Hello World \ nHello World2 \ n”。
现在有什么方法可以撤消我的第二个git-add,使暂存区域回到文件测试,内容为“Hello World \ n”。
假设:此时可能会或可能不会有任何提交。请考虑两个条件。
添加:如果有多个git-add并且我想撤消它们的最后n次,该怎么办?
答案 0 :(得分:3)
执行git add
后,Git会开始跟踪该文件并在每次创建一个SHA-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
答案 1 :(得分:1)
该阶段不保存单个操作,它只保留文件的状态。因此,如果您进行多次添加,则只能在阶段中看到结果,而不是一系列操作。
Git本身告诉你如何恢复分阶段的变化:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: blah.txt