版本控制对于任何想要跟踪他们更改的人来说都是一个重要的工具。它对于程序员、系统管理员和站点可靠性工程师 (SRE) 尤其有帮助。从错误中恢复到已知良好状态的承诺是一个巨大的胜利,并且比以前将 .old
添加到复制文件的策略更友好。
但是,学习 Git 常常被善意的同行过度简化,他们告诉每个人“参与开源”。在您意识到之前,有人会要求拉取请求或合并请求,您需要在他们从您的远程仓库合并之前从上游进行变基——并且确保删除合并提交。当您看到所有这些您不认识的词时,您想要回馈给开源项目的任何运作良好的贡献都感觉遥遥无期。
如果您有一两个月的时间和足够的好奇心,Git SCM 是您需要学习的所有术语的权威来源。如果您正在寻找来自实践的总结,请继续阅读。
提醒:什么是提交 (commit)?
对我来说,Git 最难理解的部分是 Git 最简单的概念:提交 (commit) 是内容的集合,关于您如何到达那里的消息,以及之前的提交 (commit)。没有固有的代码发布策略,甚至没有内置的强烈意见。内容甚至不必是代码——它是您想要添加到仓库的任何内容。提交 (commit) 消息注释该内容。
我喜欢将提交 (commit) 消息视为送给未来自己的礼物:它可能提到您编辑的文件,但更重要的是,它提醒您更改这些文件的意图。添加更多关于您编辑内容的原因有助于任何使用您的仓库的人,即使那个人是您自己。
没有比 'origin/main' 更好的地方了
了解您在 Git 项目中的位置首先要想到一棵树。所有 Git 项目都有一个根,类似于文件系统的根目录的概念。所有提交 (commit) 都从该根分支出来。这样,分支只是指向提交 (commit) 的指针。按照惯例,main 或 master 是根目录中默认分支的默认名称。
由于 Git 是一个分布式版本控制系统,同一个代码库分布在多个位置,人们经常使用术语“仓库”来谈论同一个项目的所有副本。有本地仓库,您在其中编辑代码(稍后会详细介绍),以及远程仓库,您想要在完成后发送到的地方。远程仓库可以在任何地方,甚至在您的本地仓库所在的同一台计算机上,但它们通常托管在 GitLab 或 GitHub 等仓库服务上。
什么是pwd的 Git 命令?
虽然这不是一个官方的卖点,但迷路是 Git 仓库乐趣的一部分。您可以通过运行这组可靠的命令来找到方向
-
git branch
—查找您所在的分支 -
git log
—查看您所在的提交 (commit) -
git status
—查看自上次提交 (commit) 以来您所做的编辑 -
git remote
—查看您正在跟踪的远程仓库
当您陷入困境时,使用这些命令定位自己将给您方向感。
我是否暂存 (stash) 或缓存 (cache) 了我的提交 (commit)?
您计算机本地的代码俗称您的工作区。当您位于 Git 仓库中时,不立即显而易见的是您还有两个(是的,两个!)其他本地位置:索引 (index) 和暂存区 (stash)。当您编写一些内容然后添加它时,您正在将其添加到索引 (index),索引 (index) 是准备提交 (commit) 的缓存内容。有时,您在索引 (index) 中有文件,您还没有准备好提交 (commit),但您想查看另一个分支。这就是暂存区 (stash) 派上用场的地方。您可以使用 git stash
将已索引但尚未提交的文件存储到暂存区 (stash)。当您准备好检索文件时,运行 git stash pop
以将更改带回索引 (index)。
以下是一些您需要用来使用暂存区 (stash) 和缓存 (cache) 的命令。
-
git diff ..origin/master
—显示最近的本地提交 (commit) 与名为“origin”的远程仓库及其名为“master”的分支之间的差异 -
git diff --cached
—显示最近的本地提交 (commit) 与已添加到本地索引 (index) 的内容之间的任何差异 -
git stash
—将索引(已添加但未提交)的文件放入暂存区 (stash) 堆栈 -
git stash list
—显示暂存区 (stash) 堆栈中的更改 -
git stash pop
—从暂存区 (stash) 堆栈中取出最近的更改
无头 (HEADless) 骑士
Git 是各种隐喻的集合。当我想象 HEAD 的位置时,我会想到火车线路。如果您最终处于分离 HEAD 模式,则意味着您脱离了隐喻的轨道。
HEAD 是指向当前检出分支中最近提交 (commit) 的指针。默认的“检出 (checkout)”是在您创建 Git 仓库并停留在 master 分支时。每次您创建或更改到另一个分支时,您都在该分支线上。如果您 git checkout <commit>
在当前分支的某个位置,HEAD 将移动到该提交 (commit)。如果您的当前提交 (commit) 与您检出的提交 (commit) 之间没有提交 (commit) 历史记录连接,那么您将处于分离 HEAD 状态。如果您在查找 HEAD 的位置时迷失了方向,您可以随时 git reset --hard origin/master
删除更改并返回到已知状态。警告: 这将删除您自上次推送到 master 以来所做的任何更改。
您是上游 (upstream) 还是下游 (downstream)?
您项目的本地副本被视为您的本地仓库。它可能有一个远程仓库——您拥有仓库副本用于协作或安全保存的地方,也可能没有。也可能有一个上游 (upstream) 仓库,项目的第三个副本托管在那里并由一组不同的贡献者维护。
例如,假设我想为 Kubernetes 做出贡献。我首先将 kubernetes/kubernetes 项目 fork 到我的帐户 mbbroberg/kubernetes。然后我会将我的项目克隆到我的本地工作区。在这种情况下,我的本地克隆是我的本地仓库,mbbroberg/kubernetes 是我的远程仓库,而 kubernetes/kubernetes 是上游 (upstream)。
合并隐喻
当您深入了解 Git 分支时,根系统 (root system) 的视觉效果与火车轨道图像合并。分支通常用作开发新功能的方式,您最终希望将其合并到 master 分支中。执行此操作时,Git 会按顺序保留提交 (commit) 的共同历史记录,然后将您的分支的新提交 (commit) 附加到历史记录中。这个过程有很多细微之处——是否要变基 (rebase),是否要添加合并提交 (commit)——Brent Laster 在“如何在 Git 中重置、还原和返回到以前的状态”中更详细地探讨了这些内容。
我想我现在 Git 明白了
掌握 Git 命令的世界需要大量的术语和探索。我希望这种关于我如何在日常生活中使用这些术语的第一人称探索能够帮助您适应这一切。如果您感到困惑或沮丧,请随时在 Twitter 上与我联系 @mbbroberg。
回顾
-
提交 (Commit)——将索引 (index) 的当前内容存储在一个新的提交 (commit) 中,并附带用户描述更改的日志消息
-
分支 (Branch)——指向提交 (commit) 的指针
-
Master——第一个分支的默认名称
-
HEAD——指向当前分支上最近提交 (commit) 的指针
-
合并 (Merge)——连接两个或多个提交 (commit) 历史记录
-
工作区 (Workspace)——您的 Git 仓库本地副本的俗称
-
工作树 (Working tree)——您工作区中的当前分支;您始终在
git status
输出中看到它 -
缓存 (Cache)——旨在临时存储未提交更改的空间
-
索引 (Index)——更改在提交 (commit) 之前存储的缓存 (cache)
-
已跟踪和未跟踪文件 (Tracked and untracked files)——索引 (index) 缓存 (cache) 中或尚未添加到其中的文件
-
暂存区 (Stash)——另一个缓存 (cache),充当堆栈,可以在不提交 (commit) 的情况下存储更改
-
Origin——远程仓库的默认名称
-
本地仓库 (Local repository)——另一个术语,指您将 Git 仓库副本保存在工作站上的位置
-
远程仓库 (Remote repository)——Git 仓库的辅助副本,您在其中推送更改以进行协作或备份
-
上游仓库 (Upstream repository)——您跟踪的远程仓库的俗称
-
拉取请求 (Pull request)——GitHub 特有的术语,用于让其他人知道您已推送到仓库分支的更改
-
合并请求 (Merge request)——GitLab 特有的术语,用于让其他人知道您已推送到仓库分支的更改
-
'origin/master'——远程仓库及其主分支的默认设置
后记:双关语是 Git 最好的部分之一。玩得开心。
4 条评论