如何回滚 Git 存储库以首次提交并删除所有历史记录

问题描述 投票:0回答:7

这些天我正在学习如何使用 git,我不得不做很多偶然的事情。因此我需要删除并重新创建我的远程和本地存储库。有没有办法回滚到存储库的第一次提交并删除此后的所有历史记录?基本上是一个干净的石板来进行实验。

git repository git-revert
7个回答
53
投票

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

如果我是你,我只会删除远程存储库和本地存储库的

.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


13
投票

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

如何通过‘git log’显示第一个提交?”描述了如何查找第一个提交:

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

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

git reset --hard yourFirstCommitSHA1

请注意,重置后,要真正获得干净的状态,您可以简单地

git init
一个新的存储库并复制您刚刚重置的第一个提交的内容(并在该新存储库中添加并提交)


12
投票

签出第一个提交后,只需清除

.git
目录即可。因此:

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

4
投票

要进行干净的重置,您想要消除日志和任何配置更改以及所有内容,我会通过仅将主根提取到新的存储库中来完成此操作:

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

(即几乎就是VonC所说的

(添加

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


4
投票

结账给师傅:

$ git checkout master

显示日志:

$ git log

重置为第一次提交:

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

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

$ git push --force origin

1
投票

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

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

0
投票

或者通过 shell 脚本:)

#!/bin/bash

variable=`git rev-list --max-parents=0 --abbrev-commit HEAD`

git reset --hard $variable
git push -f

如果您将此发送给其他人,请不要忘记添加

echo "Ja pie***** cos Ty odje***..."
© www.soinside.com 2019 - 2024. All rights reserved.