【问题标题】:How to roll back Git repo to first commit and delete all history如何回滚 Git 存储库以首先提交和删除所有历史记录
【发布时间】:2013-05-06 04:18:59
【问题描述】:

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

【问题讨论】:

  • 又一个简单的任务被 Git 搞定了。 Git 开发人员应该在他们的 SDLC 循环中使用 Stack Overflow 作为反馈。 18K 人应该指出 Git 的工作流程存在严重问题。他们需要聘请 UX 专家,因为他们显然无法独自完成。

标签: git repository git-revert


【解决方案1】:

我不知道有什么方法可以完全按照您的要求进行操作(可以回滚到第一次提交,但不能删除 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

【讨论】:

  • re: "这种方法不会删除所有历史记录" 确实无法摆脱初始提交,但是在重置为第一次提交后,您可以使用git rm * 完成清理文件(小心如果你修改了文件)然后git commit --amend --allow-empty --reset-author --date= -m "Erased history" 清理第一次提交的信息。
  • 又一个简单的任务被 Git 搞定了。 Git 开发人员应该在他们的 SDLC 循环中使用 Stack Overflow 作为反馈。 18K 人应该指出 Git 的工作流程存在严重问题。他们需要聘请 UX 专家,因为他们显然无法独自完成。
  • 这对我有帮助:stackoverflow.com/a/6637891/7741897 如果您需要删除所有历史记录 - 在通过链接执行答案中的步骤后运行 git reset --hard
【解决方案2】:

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

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

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

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

git reset --hard yourFirstCommitSHA1

请注意,重置后,真正要获得一个干净的状态,您可以简单地 git init 一个新的 repo 并复制您刚刚重置到的第一个提交的内容(并添加并提交那个新的回购)

【讨论】:

  • 出于好奇:如何获得多个根分支?
  • 很高兴知道。谢谢!!! (我永远不会找到它,因为我希望这样的功能由--并记录在--git branch 下,而不是git checkout;我觉得必需有点不合常理签出这样的分支以创建它。)
  • 又一个简单的任务被 Git 搞定了。 Git 开发人员应该在他们的 SDLC 循环中使用 Stack Overflow 作为反馈。 18K 人应该指出 Git 的工作流程存在严重问题。他们需要聘请 UX 专家,因为他们显然无法独自完成。
【解决方案3】:

一旦你的第一个提交被签出,就删除.git 目录。因此:

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

【讨论】:

  • 比我的好多了。也许给出命令来查找主根提交的 sha?
  • 请记住,这 1) 删除了您的配置 (.git/config) 和 2) 也完全清除了子模块(它们的提交和配置)。因此,请确保备份您关心的配置文件设置,并确保子模块中没有任何未推送的提交。可能还有其他问题,所以总的来说我不同意这个解决方案。
【解决方案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

(即pretty much what VonC said

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

【讨论】:

  • 这似乎是我下面答案的更详细版本,所以 +1
  • @VonC 我现在看到了,我只关注命令的效果。我还是个新手,不是故意踩你的,我的回答会不会比你的更好?
  • 一点也不。我发现你的答案更详细,如果它适用于操作,它应该得到绿色的勾号:)
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

    结帐到大师:

    $ git checkout master
    

    显示日志:

    $ git log
    

    重置为第一次提交:

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

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

    $ git push --force origin
    

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2011-05-29
      • 2012-12-14
      • 1970-01-01
      • 2012-04-06
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多