如何回滚Git repo以首先提交并删除所有历史记录

时间:2013-05-11 17:32:00

标签: git repository git-revert

这些天我正在学习如何使用git而且我不得不做很多命中与失误。因此,我需要删除并重新创建我的远程和本地存储库。有没有办法回滚到repo的第一次提交并删除之后的所有历史记录?基本上是一个干净的石板试验。

6 个答案:

答案 0 :(得分:30)

我不知道有什么方法可以完全按照您的要求进行操作(可以回滚到第一次提交,但不能删除所有历史记录,因为历史记录至少会包含该初始值提交。)

如果我是你,我只需删除远程仓库和本地仓库的.git目录,然后重新开始git init

我能得到的最接近你要求的就是回滚除了第一次提交之外的所有内容。为此,您首先要找到第一次提交的SHA1,例如:

% git rev-list --max-parents=0 --abbrev-commit HEAD
aa8119f

...然后运行

% git reset aa8119f

...或

% git reset --hard aa8119f

...取决于您是要保留还是放弃自初始提交以来所做的所有更改。 (以上假设您只有一个分支。如果没有,您还必须删除git branch -d <BRANCHNAME>所拥有的任何其他分支。)

最后,你要运行

% git push -f

(我希望您在每次推送与他人共享的回购时都意识到git push -f是禁止的。)

不幸的是,正如已经解释的那样,这种方法不会删除所有历史记录。

如果这是您经常要做的事情,我建议您在git init之后立即执行类似

的操作
% git commit --allow-empty --allow-empty-message -m ''
% git tag -a -m '' ROOT

这将在您的历史记录的根目录中放置一个空提交,并使用名为ROOT的标记对其进行标记。然后你可以做类似

的事情
% git reset ROOT

% git reset --hard ROOT

带你回到第一个空提交。

为了更好地处理git reset的内容,我建议您阅读this

答案 1 :(得分:9)

在您第一次提交签名后,只需吹走.git目录即可。就这样:

git checkout <first-commit-sha>
rm -rf .git
git init
git add -A
git commit -m 'Initial Commit'

答案 2 :(得分:8)

您可以重置为第一次提交:

How to show first commit by 'git log'?”描述了如何找到第一个提交:

git log --pretty=format:%H | tail -1

(仅在没有多个根分支时才有效)

git reset --hard yourFirstCommitSHA1

请注意,重置后,真的得到一个干净的平板,你可以简单地git init一个新的仓库并复制你刚重置的第一个提交的内容(并添加和在新的回购中提交)

答案 3 :(得分:3)

要进行干净的重置,你想要消除日志和任何配置更改以及所有内容,我只需将主根提取到一个新的仓库中即可:

git tag master-root $(git rev-list --topo-order master|sed '$!d')
git init ../reset-my-repo
cd ../reset-my-repo
git fetch $OLDPWD master-root
git checkout -B master FETCH_HEAD

(即pretty much what VonC said

(添加--topo-order以防止错误的时间戳)

答案 4 :(得分:0)

您当然可以使用以下方法删除当前分支中的所有历史记录:

git reset --hard <commit_id>

其中commit_id是某个历史提交的sha1。

但是,如果您正在学习并想要进行实验,则很少需要它。

相反,您只需为实验创建新分支,例如:

git branch experiment <commit_id>
git checkout experiment
...

对于大多数意图和目的而言,这与第一个变体相同,但如果需要,您可以切换回来。

您还可以重命名分支,以便您的实验具有原始分支名称,例如:

git branch -m master backup
git branch master
git checkout master

如果您想要核实backup分支,只需执行以下操作:

git branch -D backup

答案 5 :(得分:0)

结帐至主帐户:

$ git checkout master

显示日志:

$ git log

重置为首次提交:

$ git reset --hard <you first commit number>

然后,将更改推送到远程:

$ git push --force origin