013_清空历史commit - llj2kh/studynote GitHub Wiki

如何清空所有的commit记录

原文出处
##前言
为什么要清空 git 中的 commit 记录?

大多数开发者喜欢在 github 创建自己的 Repository,而后进行持续开发,然后就是不断的 add、commit、push 等,中间难免会把自己比较重要的隐私信息 push 到远端 origin,如果你删除了再 push 远端 origin, 提交 commit 记录里面也是存在的,并且大多是开发者创建的都是 Public Repository,免费的,所有人通过该仓库的独有链接可以直接 clone 到本地。那么就会造成隐式信息的直接暴露。

先通过git checkout --help了解一下--orphan,因为我们要用到它。

--orphan的说明
对于--orphan < new_branch > 的解释就是:

// 创建一个独立的new_branch分支,HEAD指向当前分支,并自动切换到该分支;  
// 分支没有父级结点,它是一个新的根记录,不与其他任何分支和提交记录有连接。  
  
// 它会基于你之前执行"git checkout <start_point>"的 start_point 分支,调整新的索引和分支树  
// 你可以通过"git commit -a"提交一个新commit记录作为根提交记录,这样的话你就有个一个新的历史记录,  
// 类似于 start_point 分支的一系列提交记录痕迹;  
  
// 如果你想把你的分支树变成只有一个commit记录,不想暴露他所有提交历史,那么它就很有用。  
// 如果你想通过这样做发布一个开源分支工程,当前所有包含专利记录分支树就会被清空,否则就是一堆冗余的代码;  
  
// 如果你想开始一个全新的提交记录,完全与start_point分支不同,在你创建这个独立分支后,  
// 通过 'git rm -rf',从根工作空间删除所有工作空间和索引里面的文件。  
// 随后,你可以通过从别处复制准备你的新文件来从新填充你的工作空间。  

解决方案

那么如何解决这个问题?

思路如下:

  • 使用 git checkout --orphan new_branch ,基于当前分支创建一个独立的分支new_branch;
    git checkout --orphan new_branch

  • 添加所有文件变化至暂存空间
    git add -A

  • 提交并添加提交记录
    git commit -am "commit message"

  • 删除当前分支
    (我的当前分支是master,切记master谨慎删除😁)
    git branch -D master

  • 重新命名当前独立分支为 master
    git branch -m master

  • 推送到远端分支
    -f 是 --force 的缩写, 一定要谨慎使用,好多项目中你或者是别人的代码被覆盖都是这么操作的,除非只有你一个人在开发;
    git push -f origin master

  • 推送当前分支并建立与远程上游的跟踪
    git push --set-upstream origin master

好了,没了!

PS:

一定要记住,切记谨慎删除本地 master分支;
-D 是--delete的缩写;
-f是 --force 强制操作;
git rm -rf 谨慎使用;
以上不要随意使用,切记!切记!切记!
不然你可能会被人砍死😁😁😁