Git Checkout、Reset、Revert 简介

在提交代码更改时,我们经常会遇到一些奇怪的情况(尤其是我的团队)。他们之中有一些是,

  • 如何将文件带到工作区,我错误地添加到暂存区?

  • 天哪!我在代码中使用生产密钥进行了提交,但尚未推送代码。是否可以删除该提交? (同时,我的技术主管就像😡)

  • 谁能告诉我如何删除我已经推送的更改?

  • 我登录生产机器并更改文件并立即修复生产问题👏(也可以在生产中调试😜)。现在,我想使用 git cli 删除该更改以使 CI/CD 通过。任何可用于此目的的 Git 命令?

如果您需要这些场景的盲目答案,请前往本页底部。对于那些需要了解更多的人,从这里继续。

让我们用 3 个命令找到所有此类查询的答案。

  1. 结帐

  2. 重置

3.还原

什么是 Git Checkout?

git checkout删除项目工作目录中的更改。请记住,暂存或已提交的更改都不会被删除。

我在 File1 和 File2 上添加了一些随机文本。我们可以通过git statusgit diff命令看到变化。

对文件所做的更改

假设我们需要从 File1 文件中删除所有更改并将其恢复到原始状态。让我们在 File1 上运行git checkout命令并查看更改。

Git 签出文件

“好的。这很酷。从 1 个文件中删除更改很好。如何在我们的仓库中删除所有文件中所做的所有更改? ”,我团队的 Naras 提出了这个问题。

哦!这很简单。只需在checkout命令后添加一个.(点)即可从我们的 repo 中的所有文件中删除更改。

Git 在最近的版本中发布了restore命令作为checkout命令的替代

什么是 Git 重置?

git reset命令将更改从暂存区移动到工作区。

我对 File2 进行了更改并暂存了它。

暂存文件2.txt

在 File2 上运行git reset会将更改带到工作目录

File2.txt 上的 Git 重置

reset是 git 中一个强大的命令,它可以根据传递的参数执行令人难以置信的动作。强大的功能之一是它能够在某些条件下从存储库中删除提交。

让我们在下面探索它们

Git 重置的类型

Git Reset 分为 3 种类型。他们是,

  1. 混合(默认)

2.软

混合复位

混合重置命令将提交的更改带回工作目录阶段。

混合复位命令的语法是,

git重置头~n

n表示要删除的提交数(从末尾开始)。

让我们从我们的代码中删除最后 1 次提交。

Git 混合重置

当我运行git reset HEAD~1时,repo 上的最后一个提交已被删除,这些更改被带到工作目录。

软复位

软复位命令类似于混合复位。此命令将已提交的更改带回暂存区域。

软复位命令的语法是,

git reset HEAD~n --soft

n表示要删除的提交数(从末尾开始)。

让我们从我们的代码中删除最后 1 次提交。

! zoz100037](https://devpress-image.s3.cn-north-1.jdcloud-oss.com/a/f7adcd85fe_1*hTv6EsSdC6RuBZDObn1NDQ.jpg)

Git 软重置

当我运行git reset HEAD~1 --soft时,repo 上的最后一个提交已被删除,这些更改被带到暂存区域。

硬复位

硬复位命令有点危险命令。此命令从 git 中删除提交。

硬重置命令的语法是,

git reset HEAD~n --hard

n表示要删除的提交数(从末尾开始)。

让我们从我们的代码中删除最后 1 次提交。

Git 硬重置

当我运行git reset HEAD~1 --hard时,repo 上的最后一个提交已从 repo 中完全删除。

“为什么要在这里强调危险这个词。与其他重置命令相比,这个命令有多危险? ”,聪明的库马尔被这个问题打断了。

出色地。这是一个有趣的问题。

我强调它如此危险的原因是,这个提交有权删除我们所有的更改。请记住,这不会将更改带回暂存区或工作区。运行此命令不会要求用户进行任何确认。

想象一个场景,你犯了一个小错误,在上述命令中的“~1”旁边添加了一个“0”,然后在没有查看和确认命令的情况下按“Enter”。所以,你运行的命令是,

git reset HEAD~10 --hard

你能想象现在有多危险吗?你丢失了 10 个最有价值的提交。除非您将代码推送到服务器,否则无法逆转此过程。因此,您必须重新从头开始进行所有更改。

我可以用我和 Aadhithyanath(我的一位同事)之间发生的真实场景来更好地解释这一点。

有一天,Aadhi 找到我的帮助来解决一个错误。我看到 10 多个文件(大约 14 个文件)发生了变化。我要求他在继续之前提交这些更改。他在一次提交中将所有更改压缩在一起。我们开始修复错误。我们修复了发生错误的一种情况。但是,我们还需要处理其他情况。我们做出了承诺。在修复其他场景时,我们发现包含第一个场景修复的最后一次提交以错误的方式实现。因此,我们计划删除该提交并继续进行正确的实施。我运行了以下提交,

git reset HEAD~2 --hard

Aadhi 突然喊道:“我的天啊!!!!”

“发生了什么? “, 我问他(过去式。

“你删除了我所有的更改😠”,Aadhi 回答。

“你在说什么? ”,我通过查看终端问他我执行了什么。你注意到~2了吗?

是的。我删除了最后 2 个提交。不幸的是,我们删除了 Aadhi 在一次提交中完全压缩了他的更改的提交。这是他辛勤工作的4个小时。再加上我们的运气不好,我们还没有将该代码推送到远程仓库。这种情况经常发生在打字速度较快的人身上。我就是其中之一😜。

你知道它有多危险吗?

这就是原因,我在这里强调了危险这个词。除非你 200% 确定它的结果是什么,否则不要执行这个命令。

我记得你说过,

强大的功能之一是它能够在某些条件下从存储库中删除提交。

“上面的那些条件是什么?”我们团队的开发人员兼营销人员 Udhaya 问道。

哦!我忘了提到那个重要的条件。感谢您提醒乌达亚。

您需要记住的唯一一个条件是,reset命令不应与推送到远程仓库的提交一起运行。

“为什么?”,我希望这能引起你的注意。

重置命令的主要目的是更改您的提交。因此,当您对提交进行更改/删除已推送到远程存储库的提交时,该提交的哈希将更改。除非您强制推送,否则这不会让您将更改进一步推送到远程仓库。

注意:除非是不可避免的情况,否则不推荐在 repo 中强制推送

因为,git 通过比较它的 tip 将更改推送到远程(tip 被称为 repo 中分支的最后/最新提交)

什么是 Git Revert?

Revert 命令通过创建新的提交来删除对提交所做的更改。新提交将包含与旧提交相反的更改。

每当您必须对已推送的提交进行更改时,git revert是首选命令。

revert 命令的语法是,

git revert <commit_hash>

commit_hash是我们要恢复的提交的哈希值。

Git 还原

我们已经从我们的 repo 中恢复了顶部提交,您可以看到,在旧提交之上创建了一个新提交,表示它是该提交的恢复。

您能否为上述每个概念解释一个实时场景?”,我们公司的主要开发人员之一 Krish 问道。

当然。

  1. 你做了一些改动,弄乱了代码,你需要恢复旧代码。使用git checkout恢复该文件

2.当你做了一个commit,但是你觉得你需要在同一个commit中包含那些文件中更多的变化,使用git reset HEAD~1 --mixed把commit带到工作目录

3.当你做了一个提交,但是你需要在同一个提交中添加更多的文件时,使用git reset HEAD~1 --soft它将把所有的更改带到暂存区

4.当您在代码中进行包含生产密钥的提交时,使用git reset HEAD~1 --hard完全删除该提交

5.当你做了一个commit并push了代码,后来你觉得那个commit中所做的更改无效/不需要,使用git revert <commit_hash>来反转更改

我团队的拉曼(小淘气)问了我以下问题,

“提出一个问题很简单,但返回令人满意的答案是最艰巨的工作。你能说出你在开始提到的场景中使用的适当命令吗?”。

“那是你懂事的人的评价。你们能说出每个场景的命令吗?”,我回答道。

令我惊讶的是,每个人都为每个场景投票了正确的命令。实时看到我教学的成功,我感到很高兴。谢谢各位。

给我宝贵的读者和追随者的答案,

  • 如何将文件带到工作区,我错误地添加到暂存区? —git reset <path_to_file>

  • 天哪!我在代码中使用生产密钥进行了提交,但尚未推送代码。是否可以删除该提交? (同时,我的技术主管就像😡) —git reset HEAD~1 --hard

  • 谁能告诉我如何删除我已经推送的更改? —git revert <commit_hash>

  • 我登录生产机器并更改文件并立即修复生产问题👏(也可以在生产中调试😜)。现在,我想使用 git cli 删除该更改以使 CI/CD 通过。任何可用于此目的的 Git 命令? —git checkout <file_name>

如果您喜欢这篇文章,请鼓掌👏。如需更多此类文章发送到您的收件箱,请关注并订阅我的作品。

Logo

更多推荐