这些天我正在学习如何使用 git,我不得不做很多偶然的事情。因此,我需要删除并重新创建我的远程和本地存储库。有没有办法回滚到回购的第一次提交并在那之后删除所有历史记录?基本上是一张白纸进行实验。
6 回答
我不知道有什么方法可以完全按照您的要求进行操作(可以回滚到第一次提交,但不能删除所有历史记录,因为历史记录至少会包含该初始提交。)
如果我是你,我会删除远程仓库和.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
作用,我建议阅读这个。
您可以重置为第一次提交:
“如何通过 'git log' 显示第一次提交? ”描述了如何找到第一次提交:
git log --pretty=format:%H | tail -1
(仅在没有多个根分支时有效)
git reset --hard yourFirstCommitSHA1
请注意,在重置之后,要真正获得一个干净的状态,您可以简单地git init
创建一个新的存储库并复制您刚刚重置到的第一个提交的内容(并在该新存储库中添加和提交)
.git
一旦你的第一个提交被签出,就删除目录。像这样:
git checkout <first-commit-sha>
rm -rf .git
git init
git add -A
git commit -m 'Initial Commit'
要进行干净的重置,您希望消除日志和任何配置更改以及所有内容,我会通过仅将主根提取到新的存储库中来做到这一点:
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
以防止错误的时间戳)
您当然可以使用以下方法删除当前分支中的所有历史记录:
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
结帐到大师:
$ git checkout master
显示日志:
$ git log
重置为第一次提交:
$ git reset --hard <you first commit number>
然后,将更改推送到远程:
$ git push --force origin