学习如何Git:在提交之间导航

假设您处于项目无法正常运行的状态。 也许,如果我们可以导航到之前的提交并知道我们在哪个提交处分解,该怎么办? 好吧,我们绝对可以。 可以检出已经存储在提交中的所有内容,以便我们可以再次查看文件的那些状态。

到目前为止我们所知道的

这就是我所说的git checkout命令实际上有点令人困惑的意思。 在下面的上一个故事中,我解释说git checkout命令会将当前分支更改为所需的分支。

学习如何Git:创建Git分支
Git的杀手级功能之一是分支系统的存在。 允许我们创建不同状态的分支 medium.com

事实证明,要检查文件状态并将其更改为上一次提交,我们还需要使用git checkout命令。 问题是如何?

绝对与相对参考

如果您以前不知道,Git版本控制系统实际上会使用某种指针来指向当前文件的当前状态。 这个指针就是我们通常所说的HEAD 。 使Git如此灵活的原因是,我们可以将HEAD引用移至所需的任何内容。 在Git中,有两种方法可以引用某些提交,一种是绝对的,另一种是相对的。

绝对

在Git中,使用SHA1引用提交。 要检查那些提交标识符,我们可以使用git log命令。 这些SHA1应该是唯一的,但我不知道SHA1是否会在某个时候崩溃。 但是,自从我使用Git以来,我从没有遇到任何问题。

相对的

我们也可以通过使用相对的提交来引用不同的提交。 您还记得HEAD是一个指针吗? 然后,通过使用该指针,我们可以相对地引用commit。 要在指针指向的当前提交之前引用提交,可以使用HEAD~1如果我们想在当前指针之前引用第二个提交,则可以使用HEAD~2 ,依此类推。

如何实际检查以前的提交?

现在,让我们讨论如何实际检查我们以前的提交。 我们需要做的就是使用git checkout 。 因此,让我们尝试使用git checkout HEAD~1在当前提交之前移动一个提交。

好的,现在我们的文件将回滚到之前一次提交之前的状态。 需要注意的一件事是,当我们检出上一个提交时,我们的本地HEAD指针将指向该提交。 因此,如果我们使用git log命令进行检查,您会注意到现在HEAD指针指向了我们刚刚检出的提交。 回到最新的提交(远程HEAD指向的提交),我们可以使用git checkout 。 当我们再次使用相对引用时,要记住的一件事是,它相对于当前的HEAD指针,而不是我们之前知道的最新提交。

~ (子项)的对面是^ (父项)。 一个示例是git checkout HEAD^2从当前HEAD指针快速向前移动两个提交。 您可以自己尝试。

现在,让我们尝试使用绝对值之一。 完整的SHA1需要40个字符长。 但是,如果尝试使用git log --oneline --all --graph --decorate进行检查,则可以得到由7个字符长的较短版本。 这7个字符已经足够用作参考。 因此,我们不使用全部40个字符,而是使用简短版本,假设我们要在初始提交后移至提交。 在我的情况下,命令将为git checkout 23a64781 (您应在自己的SHA1参考上进行检查)。 结果将类似于我们之前的结果,只是使用了不同的引用提交方式。

包起来

因此,今天我们讨论了使用git checkout命令导航回我们之前的提交。 对于下一故事的主题,我们将介绍如何回滚到上一个提交。 谢谢或阅读!

参考文献

Git –撤消更改| Atlassian Git教程
有关使用git checkout,git revert,git reset和git clean撤消更改的教程。 git revert和git reset撤消… www.atlassian.com