用 4 个友好命令重写你的 git 历史记录
我构建了很多公开的实验性演示代码库来支持我的教程,并且经常鼓励大家 fork 这些代码库并部署到Netlify上进行尝试。问题是,这些实验性代码库的Git 历史记录通常非常混乱——我不希望大家也继承这些记录。所以,在发布和推广演示项目之前,我喜欢清理 Git 历史记录✨。
首先,TL;DR:谨慎使用这四个命令(稍后会详细介绍!),并享受整洁的船。
# 1. Reset the repo to the initial commit, preserving the current state of the files on your local machine
git reset --soft {INITIAL_COMMIT_HASH}
# 2. Stage all files
git add .
# 3. Make a commit
git commit -m "Initial commit"
# 4. Force push to the origin
git push --force
让我们详细了解每个命令的作用。
软重置到初始提交
每次将更改推送到 git 时,都会根据与该提交相关的各种数据(例如提交消息、文件更改、提交作者和日期)生成一个称为提交哈希的唯一标识符。提交哈希指向提交时仓库的状态,并允许我们在仓库中前后移动。
如果您的存储库托管在 GitHub 上,您可以通过单击文件列表右上角的提交链接,从存储库主页查看提交哈希列表。
这将带您进入提交列表,并在提交消息右侧显示简短的提交哈希值。向下滚动以查找第一个提交,单击以查看提交和完整的提交哈希值,或者使用复制按钮将完整的提交哈希值复制到剪贴板,其内容可能类似于:64d52970e9b73551e7d837ec367610p
。
有多种方法可以使用终端命令获取第一个提交哈希,但该方法可能因历史记录中的根提交数量而异 - 这超出了本博文的范围。
获取初始提交哈希值后,在终端中运行以下命令。该reset
命令指示 git 将存储库重置为特定状态(在本例中为初始提交),并且该--soft
标志使所有文件保持其最新的状态。
# reset the repo to the initial commit
git reset --soft {INITIAL_COMMIT_HASH}
# check the status of your local repository
git status
现在您应该会看到一条消息,指出您的分支落后于主分支,无论您在第一次提交后进行了多少次提交,并且有一些更改需要提交。
暂存所有文件
接下来,使用git add .
暂存所有文件。考虑到你的.gitignore
文件将保持最新,并且包含你不想提交的任何敏感文件,你应该可以开始了。但此时,值得再检查一下,确保运行过程中git status
没有列出你不想添加到存储库的任何文件。
提交
接下来,是时候用简洁的提交信息覆盖之前的提交历史记录了。您可以使用Initial commit
或任何你喜欢的提交信息。
git commit -m 'I am rewriting history'
强制推回原点
现在是时候使用 来推送新的提交,重写历史记录了git push --force
。强制推送会告诉 git优先处理本地分支的更改,而不是推送到远程分支的更改。这正是我们在本例中想要做的!在终端中运行以下命令,享受它带来的强大功能。
完全免责声明:只有当您绝对清楚自己在做什么时,或者当您的项目很小并且您是唯一从事该项目的开发人员时,才应该在 git 中强制推送 - 就像我的大多数项目一样!
git push --force
就这样,您已将强制更新推送到存储库。
结果
返回 GitHub 并刷新提交列表,您将在提交列表中看到闪亮的新提交!
那些目光敏锐的完美主义者可能会注意到,我现在的提交历史记录中有两次提交,而不是一次初始提交。然而,对于我本人以及我的目的而言,这是一种快速友好地清理我的实验性 git 历史记录的方法——并且提醒我们,代码中没有任何东西是真正完美的。
如果您希望将 Git 仓库完全重置到其初始提交,则需要执行一些额外的步骤(我认为这些步骤不太友好)。一种实现方法是从主分支创建一个包含所有当前文件的孤立分支,然后对该分支进行单次提交,最后用新分支替换原来的主分支。工程经理Candost Dagdeviren写了一篇很棒的博客文章,详细介绍了这些步骤。
因此,继续前进,对你的 git 历史记录进行一点春季清理吧 —— 但请记住要谨慎操作,并且只有在你真的需要时才这样做!
文章来源:https://dev.to/whitep4nth3r/rewrite-your-git-history-in-4-friend-commands-an9