GitGitHub是当今编程世界中开源的核心。但是,有许多令人困惑的术语,它们通常看起来相似,但含义和用途却相互矛盾。让我们通过解码它们的潜在含义来揭开这些令人困惑的术语的神秘面纱。

注意: 本文要求对 Git 和 GitHub 有所了解。

八角猫 gif

起源和上游

来自Git 文档:

当你 fork 一个 repo 并在本地克隆它时,会有一个名为 origin 的默认远程指向你在 GitHub 上的 fork,而不是它被 fork 的原始 repo。要跟踪原始存储库,您需要添加另一个名为 upstream 的远程。

当您处理分叉存储库的克隆时,就会出现这种混淆。 Upstream 是您用来从原始存储库中获取的内容,以使您的本地副本与您想要贡献的项目保持同步。同时,origin 是你用来拉取和推送代码到你的 fork 的东西,之后你可以通过提出拉取请求来回馈上游 repo。

起源与上游

记住:像upstreamorigin这样的遥控器只是存储存储库 URL 的别名。它们可以命名为任何名称,但将原始 repo 的远程设置为上游是惯例。

获取和拉取

来自Git 文档:

git fetch可以从单个命名存储库或 URL 或一次从多个存储库中获取。git pull将来自远程存储库的更改合并到当前分支中。

获取与拉取

git fetch是告诉本地 git 从原始文件中检索最新元数据信息但不进行任何文件传输的命令。这更像是检查是否有任何可用的更改。另一方面,git pullgit fetch 并将更改从远程存储库应用到本地存储库。

记住:git pullgit fetch后跟git merge FETCH_HEAD的简写。

简单地说,git fetch可用于了解自上次拉取以来远程仓库/分支中所做的更改。这对于允许在执行 git pull 之前进行检查很有用,这可能会更改当前分支和工作副本中的文件,并可能丢失您的更改等。

获取与拉取

git fetch在多种情况下可能会有所帮助,其中之一是稍微优化您的工作流程以减少网络命中。每个 git pull 都涉及一个git fetch,所以如果你想拉取五个不同的分支,你有四个多余的额外git fetch调用。此外,git fetch通常可以在您离线工作或在旅途中工作(可能是在火车上)的情况下为您节省开支,但您希望确保在远程工作时拥有每个可用分支的所有更改。您可以在网络上简单地 git fetch 一次,然后离开。以后在没有网络连接的情况下,可以手动git checkout branch;git merge origin/branch合并您之前获取的更改。

切换和结帐

来自Git 文档:

git switch切换到指定分支。更新工作树和索引以匹配分支。git checkout更新工作树中的文件以匹配索引或指定树中的版本。

git switch不是一个新功能,而是一个额外的命令来切换/更改分支功能,这在重载的 git checkout 命令中已经可用。因此,为了分离功能,Git 2.23 引入了新的git switch branch命令,它试图在不破坏向后兼容性的情况下开始缩减职责。

结帐与切换

git checkout命令对三个不同的实体进行操作:文件、提交和分支。简而言之,如果你修改了一个文件但没有暂存更改,那么git checkout <filename>将丢弃修改并保留在同一个分支上,而git checkout <commit hash>可以让你回滚到较旧的提交,而git checkout <branch>会切换分支,因此,为了避免这种混淆,引入了git switch

以下是git checkout最常见的三个用例:

git checkout 提交

git checkout 分支

git 结帐文件

HEAD~和HEAD^

~(波浪号)和^(插入符号)符号用于指向相对于特定提交的位置。这些符号与提交引用一起使用,通常是HEAD(表示分支的当前快照)或提交哈希。

头部术语

  • ~n指第n个祖父母。HEAD~1指的是提交的第一个父级。HEAD~2指的是提交的第一个父级的第一个父级。

-^n指的是第 n 个父母。HEAD¹指的是提交的第一个父级。HEAD²指的是提交的第二个父级。一个提交可以在一个合并提交中有两个父级。

恢复和重置

来自Git 文档:

git revert用于记录一些新的提交,以扭转一些较早的提交的影响(通常只是一个错误的提交)。git reset将当前HEAD重置为指定状态。

git revert命令用于撤消对存储库提交历史的更改。它用于反转特定提交引入的更改,并使用生成的反向内容附加新提交。这对于跟踪由单个提交引入的错误非常有用,以便可以通过git revert命令自动修复它。

重置与恢复

git reset是另一个用于撤销更改的复杂且通用的 git 命令,然而,git reset将移动HEAD引用指针和当前分支引用指针,而git revert命令不会移动HEAD引用指针。

git 重置

简而言之,如果您已经将分支推送到某个地方或有人从您的分支中拉出,那么您唯一的选择是git revert撤消更改。同时,如果您将提交完全保持在本地和私有,您可以简单地使用git reset撤消更改。

重置与恢复

合并和变基

来自Git 文档:

git merge将来自命名提交的更改(从它们的历史与当前分支分歧的时间开始)合并到当前分支中。git rebase在另一个基本提示之上重新应用提交。

变基与合并

这两个命令都旨在将更改从一个分支集成到另一个分支,不同之处在于它们执行此操作的方式。 变基是将一系列提交移动或组合到新的基本提交的过程,同时合并将两个分支的历史记录联系起来,并且始终是向前移动的更改记录,因此不会更改任何现有分支方法。变基的主要好处是您可以获得更清晰的项目历史记录,因为它消除了 git merge 所需的不必要的合并提交。

变基与合并

变基通过一次将每个本地提交转移到更新的主分支来工作。这意味着您在逐个提交的基础上捕获合并冲突,而不是在一次大规模合并提交中解决所有这些冲突。此外,变基可以更容易地找出引入错误的位置,并在必要时回滚更改,而对项目的影响最小。

使用这个方便的git 备忘单指南来增强您的工作流程。

这就是本文的全部内容。我希望它可以帮助您揭开与 git 和 GitHub 相关的一些令人困惑的术语的神秘面纱。请评论您的宝贵建议和反馈。如果您想与我联系,请点击以下链接:

领英|GitHub|Twitter|中型

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐