2011-07-09 157 views
182

我第一次向git仓库提交;然后我对这个承诺感到后悔,并希望恢复它。我尝试如何恢复初始git提交?

# git reset --hard HEAD~1 

我得到这个消息:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree. 

这个提交第一次提交的存储库。任何想法如何撤消混帐的初始提交?

回答

307

你只需要删除你所在的分支。您不能使用git branch -D,因为这样做有安全检查。您可以使用update-ref来执行此操作。

git update-ref -d HEAD 

使用rm -rf .git或类似这样的,因为这将事情彻底消灭整个仓库在内的所有其他部门,以及您尝试重置分支。

+1

在rebase中尝试了这个 - 想分割第一次提交 - 然后做了'git status',令我惊讶的是,git说'致命的:不是git存储库(或任何父母直到挂载点... )'! –

+0

相同 - 解决方案? –

+1

这不适合我。使文件包括一些应该被忽略但不包含'.gitignore'的文件。 'git add .','git commit -m'initial commit'','git update-ref -D HEAD',创建一个'.gitignore',注意git仍然看到它之前添加的应该忽略的文件。换句话说'git update-ref -d HEAD'并没有把我带回初始提交之前的状态。 – gman

5

最简单的方法是:

rm -fr .git 

从那里你做git init的目录。

你什么都不想保留,所以你不会失去任何东西。但是,只有在您的存储库中没有任何东西存在时,才能做到这一点。在问题'首次提交存储库—然后后悔'的情况下,它是安全的。但是,很多时候,这并不安全。

+7

这是不好的建议。如果回购中还有其他不想丢失的东西呢? –

+4

那么它不会是最初的提交,会吗?只有一个初始提交。 –

+8

“那么它不会是最初的承诺” - 实际上,是的。你忽略了多个分支的常见情况。查看Charles的答案。 –

3

你不能。所以:

rm -rf .git/ 
git init 
git add -A 
git commit -m 'Your new commit message' 
+0

他试图说'git reset --hard',那么他为什么要'git add -A'? –

0

的git的复位 - 硬 进行更改,然后做

git add -A 
git commit --amend --no-edit 

git add -A 
git commit --amend -m "commit_message" 

然后

git push origin master --force 

--force将重写提交你所重新设置在第一步。

不要这样做,因为您将特别针对VCS系统和git的整体思路。唯一不错的方法是创建新的和删除不需要的分支。有关信息,请参阅git help branch

28

可以删除头部和你的资料库恢复到一个新的国家,在那里你可以创建一个新的初始提交:

git update-ref -d HEAD 

后您创建一个新的提交,如果你已经被推到远程的,则需要将其强制远程为了覆盖以前的初始承诺:

git push --force origin 
+0

值得注意的是...这是正确的命令,但它并不删除HEAD ...它删除了.git \ HEAD文件已经签出的ref(位于.git \ refs \ heads下)。运行此命令后,仍然可以找到指向您删除的refs/heads/文件的HEAD文件,但是如果沿着该路径行进,则会看到头ref不再存在。 – DanK

7

这个问题是从this blog post联系并提出了Git的较新版本的替代解决方案:

git branch -m master old_master 
git checkout --orphan master 
git branch -D old_master 

该解决方案假定:

  1. 你只有一次提交您master分支
  2. 没有分支称为old_master所以我可以自由地使用该名称

它将重命名现有分支到old_master并创建一个新的孤立分支master(就像它为新存储库创建的那样)之后,您可以自由删除old_master ...或不需要。由你决定。

0

所有你需要做的就是恢复提交。

git revert {commit_id}' 

然后将其推

git push origin -f