Git 术语中的易混淆术语
Git和GitHub是当今编程世界中开源的核心。然而,也存在许多令人困惑的术语,它们看似相似,但含义和用法却可能相互冲突。让我们来解密这些令人困惑的术语,解读它们背后的含义。
注意: 本文需要对 Git 和 GitHub 有一定的了解。

起源和上游
来自Git 文档:
当你 fork 一个仓库并将其克隆到本地时,会有一个名为origin的默认远程仓库,它指向你在 GitHub 上的 fork 分支,而不是它 fork 出来的原始仓库。
为了跟踪原始仓库,你需要添加另一个名为upstream的远程仓库。
这种困惑在你处理一个 fork 仓库的克隆版本时会遇到。Upstream是你用来从原始仓库获取代码的,目的是让你的本地副本与你想要贡献的项目保持同步。而origin是你用来将代码拉取并推送到你的 fork 仓库,之后你可以通过发起拉取请求来回馈上游仓库。
记住:像upstream
和origin
这样的远程仓库仅仅是存储仓库 URL 的别名。它们可以任意命名,但惯例是将原始仓库的远程仓库设置为上游。
获取并拉取
来自Git 文档:
git fetch
可以从单个命名存储库或 URL 中获取,也可以同时从多个存储库中获取。git pull
将远程存储库中的更改合并到当前分支中。
git fetch
是告诉本地 git 从原始仓库检索最新元数据信息的命令,但不进行任何文件传输。它更像是检查是否有可用的更改。git pull
另一方面,git fetch 会将远程仓库中的更改应用到本地仓库。
记住:是“followed by”git pull
的简写。git fetch
git merge FETCH_HEAD
简单来说,它git fetch
可以用来查看自上次拉取以来远程仓库/分支的变更。这在执行 git pull 操作之前进行检查非常有用,因为 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
:
HEAD~ 和 HEAD^
波浪号~
(tilde) 和^
插入符号 (caret) 用于指向相对于特定提交的位置。这些符号通常与提交引用一起使用,提交引用通常为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 revert
撤消更改。同时,如果你将提交完全保留在本地且不公开,则可以直接使用git reset
撤消更改。
合并和变基
来自Git 文档:
git merge
将命名提交的更改(自其历史记录与当前分支分叉以来)合并到当前分支中。git rebase
在另一个基本提示之上重新应用提交。
这两个命令都旨在将一个分支的更改集成到另一个分支,区别在于执行方式。变基是将一系列提交移动或合并到一个新的基准提交的过程,而合并则将两个分支的历史记录绑定在一起,并且始终是向前移动的更改记录,因此不会以任何方式更改现有分支。
变基的主要好处是,由于它消除了 git merge 所需的不必要的合并提交,因此可以获得更清晰的项目历史记录。
变基操作的工作原理是将每个本地提交逐个迁移到更新的主分支。这意味着您可以逐个提交地捕获合并冲突,而不是在一次大规模合并提交中解决所有冲突。
此外,变基操作可以更轻松地找出引入错误的位置,并在必要时回滚更改,同时最大程度地减少对项目的影响。
使用这个方便的git 备忘单指南来增强您的工作流程。
本文就到这里。希望它能帮助你理解一些与 git 和 GitHub 相关的令人困惑的术语。欢迎在评论区提出你宝贵的建议和反馈。
如果你想联系我,请点击以下链接:
LinkedIn | GitHub | Twitter | Medium
鏂囩珷鏉ユ簮锛�https://dev.to/pragativerma18/confusing-terms-in-the-git-terminology-1578