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

如何回滚Git repo以首先提交并删除所有历史记录,git,repository,git-revert,Git,Repository,Git Revert,这几天我在学习如何使用git,我不得不做很多错事。因此,我需要删除并重新创建我的远程和本地回购协议。有没有办法回滚到回购协议的第一次提交,并删除之后的所有历史记录?基本上是一个干净的实验板。您可以重置为第一次提交: git log --pretty=format:%H | tail -1 $ git reset --hard <you first commit number> “”描述如何查找第一次提交: git log --pretty=format:%H | tail -1

这几天我在学习如何使用git,我不得不做很多错事。因此,我需要删除并重新创建我的远程和本地回购协议。有没有办法回滚到回购协议的第一次提交,并删除之后的所有历史记录?基本上是一个干净的实验板。

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

git log --pretty=format:%H | tail -1
$ git reset --hard <you first commit number>
“”描述如何查找第一次提交:

git log --pretty=format:%H | tail -1
$ git reset --hard <you first commit number>
(仅当没有多个根分支时有效)


请注意,在重置之后,要想真正获得一个新的记录,您只需
git init
一个新的repo,然后复制您刚刚重置的第一次提交的内容(并在新的repo中添加和提交)

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

如果我是你,我会删除远程repo和本地repo的
.git
目录,然后从
git init
开始

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

% git rev-list --max-parents=0 --abbrev-commit HEAD
aa8119f
…然后运行任何一个

% git reset aa8119f
…或

…这取决于您是否要保留或放弃自首次提交以来所做的所有更改。(以上假设您只有一个分支。如果没有,您还必须使用
git branch-d
)删除所有其他分支)

最后,你跑了

% git push -f
(我希望您认识到,无论何时,只要您推动与他人共享的回购,git push-f都是一个禁忌。)

不幸的是,如前所述,这种方法并没有删除所有历史记录

如果这是您经常想做的事情,我建议您在
git init
之后立即运行

% git commit --allow-empty --allow-empty-message -m ''
% git tag -a -m '' ROOT
% git reset ROOT
这将在历史记录的根目录下放置一个空提交,并使用名为root的标记对其进行标记

% git commit --allow-empty --allow-empty-message -m ''
% git tag -a -m '' ROOT
% git reset ROOT

让你回到第一个空的承诺


要很好地处理git reset的功能,我建议阅读。

要进行干净的重置,您需要删除日志和任何配置更改以及所有内容,我只需将主根目录提取到新的repo中即可:

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
(即)


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

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

git reset --hard <commit_id>
对于大多数意图和目的来说,这与第一个变体是相同的,但如果需要,您可以切换回第一个变体

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

git branch -m master backup
git branch master
git checkout master
如果要取消
备份
分支,只需执行以下操作:

git branch -D backup

签出第一次提交后,只需吹走
.git
目录即可。因此:

git checkout <first-commit-sha>
rm -rf .git
git init
git add -A
git commit -m 'Initial Commit'
git签出
rm-rf.git
初始化
git添加-A
git提交-m“初始提交”
签出到主机:

$ git checkout master
显示日志:

$ git log
重置为首次提交:

git log --pretty=format:%H | tail -1
$ git reset --hard <you first commit number>

这似乎是我下面答案的更详细版本,所以+1@VonC我现在明白了,我只注意命令的效果。我还是个新手,不想踩到你的,我的答案作为你的编辑会更好吗?一点也不。我发现你的答案更详细,如果它对op有效,它值得打绿色勾:)比我的好多了。可能会发出命令来查找主根提交的sha?请记住:1)删除您的配置(
.git/config
),2)也完全删除子模块(它们的提交和配置)。因此,请确保备份您关心的配置文件设置,并确保子模块中没有任何未推送的提交。可能还有其他问题,所以一般来说,我不同意这种解决方案。re:“这种方法不会删除所有历史记录”的确,您无法摆脱初始提交,但在重置为第一次提交后,您可以使用
git rm*
完成文件清理(如果您修改了文件,请小心)然后
git commit--amend--allow empty--reset author--date=-m“Erased history”
来清理第一次提交的信息。Git开发人员应该在SDLC循环中使用堆栈溢出作为反馈。18K人应该指出Git的工作流程有严重问题。他们需要雇佣一位用户体验专家,因为他们显然无法自己正确地使用git。这对我有帮助:如果您需要删除所有历史记录,请在通过链接执行答案中的步骤后运行
git reset--hard
,出于好奇:一个人如何获得多个根分支?很高兴知道这一点。谢谢(我永远也找不到它,因为我希望这样的功能由--
git分支
,而不是
git checkout
,提供并记录在--
git分支下;我发现需要签出这样一个分支才能创建它有点反常。)还有一个简单的任务让git变得困难。Git开发人员应该在SDLC循环中使用堆栈溢出作为反馈。18K人应该指出Git的工作流程有严重问题。他们需要雇佣一位用户体验专家,因为他们显然无法自己正确地使用git。然而,git又使另一项简单的任务变得困难。Git开发人员应该在SDLC循环中使用堆栈溢出作为反馈。18K人应该指出Git的工作流程有严重问题。他们需要雇佣一位用户体验专家,因为他们显然无法靠自己的力量实现。