如何撤消我上次的git add

时间:2016-04-06 21:05:10

标签: git

只是好奇才知道。假设我有一个名为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次,该怎么办?

2 个答案:

答案 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

Screenshot

一个完整的例子:

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

Screenshot

答案 1 :(得分:1)

该阶段不保存单个操作,它只保留文件的状态。因此,如果您进行多次添加,则只能在阶段中看到结果,而不是一系列操作。

Git本身告诉你如何恢复分阶段的变化:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   blah.txt