想学习 Git?看看这个最重要的术语和命令的快速总结。

• 来源:linux.cn • 作者:Matthew Broberg • 译者:Xingyu.Wang •

(本文字数:4793,阅读时长大约:7 分钟)

如今,对于任何希望跟踪他们的变化的人来说,版本控制是一个重要的工具。它对程序员、系统管理员和 网站可靠性工程师(site reliability engineers)(SRE)都特别有用。确保可以从错误中恢复到已知的良好状态是一个巨大的胜利,比以前给复制的文件添加 .old 后缀的策略更友好。

但学习 Git 这件事往往被告诉大家“投身开源”的好心同行们过度简化了。在你还不明白之前,就有人要你给一个从 上游(upstream) 变基(rebase)拉取请求(pull request)(PR)或 合并请求(merge request)(MR),然后他们才能从你的 远程版本库(remote)合并 —— 而且一定会删除 合并提交(merge commits)。无论你想给开源项目做出什么好的贡献,当你看到这些你不认识的单词时,都会觉得难以融入。

Git 速查表封面图

下载 我们的 Git 速查表。

如果你有一两个月的时间和足够的好奇心, Git SCM 是你需要学习所有术语的权威来源。但如果你正在寻找来自实践的总结,请继续阅读。

提交就是提醒

对我来说,Git 最难理解的部分是 Git 最简单的概念:一个 提交(commit)就是一个内容的集合,包括一个关于描述的信息,以及之前的提交。没有固有的代码发布策略,甚至没有内置的明确建议。这个内容甚至不一定是代码 —— 可以是任何你想添加到版本库的东西。 提交消息(commit message)会对这些内容进行注释。

我喜欢把提交信息看作是给未来的自己的礼物:它可能会提到你编辑的文件,但更重要的是它提醒你修改这些文件的意图。添加更多关于你为什么编辑这些内容的信息,可以帮助任何使用你的版本库的人,即使那个人是你。

origin/master 在哪里?

要知道自己在 Git 项目中的位置,首先把它想成一棵树。所有 Git 项目都有一个根目录,类似于文件系统的根目录。所有的提交都是这个根目录下的分支。这样一来,分支只是一个提交的指针。按照惯例,master 是根目录下默认的分支名称。(LCTT 译注:世界变得快,原文发表于 2019 年,而现在有些地方开始用 main 替代这个名字。)

由于 Git 是一个分布式的版本控制系统,同一个代码库分布在多个地方,所以人们经常用 版本库(repository)这个词来表示同一个项目的所有副本。(LCTT 译注:“repository” 英文原意是仓库、存储库,在计算机环境中,常用于版本控制、软件分发等方面,有时候会统一译作“仓库”、“存储库”。但我们认为,应该根据不同语境采用更有指向性的译法。在 Git 等版本控制语境中,采用“版本库”;在软件分发方面,采用“软件库”;其它泛指或不确定的语境中,可采用“仓库”、“存储库”译法。)有 本地版本库(local repository),这是你编辑代码的地方(稍后会有更多的介绍),还有 远程版本库(remote repository),这是你完成后想把代码发送到的地方。远程版本库可以在任何地方,甚至在你的本地版本库所在的同一台计算机上,但它们通常托管在 GitLab 或 GitHub 等版本库服务上。

我在哪里?

虽然不是官方的卖点,但迷路也是 Git 仓库的“乐趣”之一。你可以通过这套可靠的命令来找到自己的方向:

git branch —— 找到你所在的分支。git log —— 查看你正在进行的提交。git status —— 查看自上次提交以来你所做的编辑。git remote —— 查看你正在跟踪的远程仓库。

用这些命令来定位自己的方向,当你被卡住的时候,会让你有一种方向感。

我是否已将我的提交暂存或缓存起来?

你电脑上的代码俗称为你的 工作空间(workspace)。但不是很明显的是,当你在 Git 仓库中时,你还有两个(是的,两个!)其他位置: 索引(index)暂存(stash)。当你写了一些内容,然后添加时,你是把它添加到索引中,也就是准备提交的缓存内容。有的时候,你的索引中的文件还没有准备好提交,但你想查看另一个分支。这时,暂存就派上用场了。你可以使用 git stash 将索引了但尚未提交的文件存储到暂存区中。当你准备好取回文件时,运行 git stash pop 将更改带回索引中。

下面是一些你需要使用暂存区和缓存区的命令:

git diff ...origin/master —— 显示最近的本地提交和远程的 origin 版本库的 master 分支之间的差异。git diff --cached —— 显示最近的本地提交与添加到本地索引的内容之间的任何差异。git stash —— 将索引的(已添加但未提交的)文件放在暂存区堆栈中。git stash list —— 显示暂存区堆栈中的变化。git stash pop —— 将最近的变化从暂存库中删除。

无头骑士

Git 里面有各种比喻。当我想到 HEAD 是哪里的时候,我就会想到火车线路。如果你最终处于 脱离的 HEAD(detached HEAD)模式,就意味着你已经脱离了这个隐喻的轨道。

HEAD 是指向当前签出分支中最近一次提交的指针。默认的“签出checkout”是指当你创建一个 Git 仓库并进入到 master 分支的时候。每次创建或修改到另一个分支时,你都会切换到该分支行。如果你在当前分支的某处进行 git checkout ,HEAD 就会移动到该提交。如果没有提交历史记录将你的当前提交连接到已签出的提交,那么你将处于脱离的 HEAD 状态。如果你找不到 HEAD 的位置,你可以随时用 git reset --hard origin/master 来删除修改,回到已知状态。警告:这将删除你上次推送到 master 后的任何改动。

你是上游还是下游?

你的项目的本地副本被认为是你的本地版本库,它可能有也可能没有远程版本库 —— 远程版本库的副本是用于协作或保存的。也可能还有一个 上游(upstream)版本库,在那里,项目的第三个副本由不同的贡献者托管和维护。

例如,假设我想为 Kubernetes 做贡献。我会首先将 kubernetes/kubernetes 项目 复刻(fork)到我的账户下 mbbroberg/kubernetes。然后我会将我的项目克隆到我的本地工作区。在这种情况下,我的本地克隆是我的本地仓库,mbbroberg/kubernetes 是我的远程仓库,kubernetes/kubernetes 是上游。

合并的隐喻

当你深入 Git 分支时,根系统的视觉效果就会和火车轨道的形象合二为一。分支通常被用作开发一个新功能的方式,最终你想把它 合并(merge)到主分支中。当这样做时,Git 会按顺序保留共同的提交历史,然后将你的分支的新提交追加到历史中。这个过程有一大堆的细节:是否 变基(rebase),是否添加一个 合并提交(merge commit), Brent Laster 在《 如何在 Git 中重置、恢复和返回之前的状态 》中会有更详细的探讨。

我想现在就去 Git

要掌握 Git 命令的世界,有大量的术语和需要探索的地方。我希望这篇关于日常使用术语的第一人称探索能帮助你适应这一切。如果你觉得自己被卡住了或者遇到了挫折,欢迎在 Twitter @mbbroberg 上联系我。

回顾

  • 提交(Commit) —— 将当前索引的内容保存在一个新的提交中,并附上用户描述更改的日志信息。
  • 分支(Branch) —— 指向一个提交的指针。
  • master —— 第一个分支的默认名称。
  • HEAD —— 指向当前分支上最近一次提交的指针。
  • 合并(Merge) —— 合并两个或多个提交的历史。
  • 工作空间(Workspace) —— Git 仓库本地副本的通俗名称。
  • 工作树(Working tree) —— 工作区中的当前分支;任何时候你都可以在 git status 的输出中看到这个。
  • 缓存(Cache) —— 用于临时存储未提交的变更的空间。
  • 索引(Index) —— 变更提交前存储其变化的缓存。
  • 跟踪和未跟踪的文件 —— 没有被索引缓存的文件或尚未加入其中的文件。
  • 暂存(Stash) —— 另一个缓存,作为一个堆栈,在这里可以存储更改而不需要提交它们。
  • origin —— 远程版本库的默认名称。
  • 本地仓库(Local repository) —— 也就是你在工作站上保存 Git 仓库副本的地方。
  • 远程存储库(Remote repository) —— Git 存储库的第二副本,你可以在这里推送变更以便协作或备份。
  • 上游存储库(Upstream repository) —— 你跟踪的远程存储库的通俗说法。
  • 拉取请求(Pull request) —— 这是 GitHub 的专用术语,用于让其他人知道你推送到仓库分支的变化。
  • 合并请求(Merge request) —— 这是 GitLab 的专用术语,用于让其他人知道你推送到仓库分支的变化。
  • origin/master —— 远程版本库及其主要分支的默认名称。

后记:双关语是 Git 最好的部分之一,愿你喜欢。


本地git存储库关闭_Git 入门:术语基础 | Linux 中国相关推荐

  1. git idea 本地历史版本回滚_如何为IDEA项目创建GitHub存储库和本地Git存储库

    有几种方法可以使用IntelliJ IDEA来发布我们在GitHub上编写的代码.在此博客中,我们将介绍两种方法.第一个步骤是最快的一步,您可以在其中创建本地和远程存储库.第二种方法是多步骤,当您要为 ...

  2. 2020.2idea怎么创建html项目_如何为IDEA项目创建GitHub存储库和本地Git存储库

    有几种方法可以使用IntelliJ IDEA来发布我们在GitHub上编写的代码.在此博客中,我们将介绍两种方法.第一个步骤是最快的一步,您可以在其中创建本地和远程存储库.第二种方法是多步骤,当您要为 ...

  3. 如何确定最初克隆本地Git存储库的URL?

    几天前我从GitHub上撤了一个项目. 我已经发现GitHub上有几个叉子,我忽略了我最初采用的那个. 如何确定我拉出的哪个叉子? #1楼 打印任意命名的远程提取URL: git remote -v ...

  4. git 创建本地存储库_创建您的第一个Git存储库

    git 创建本地存储库 读: 第1部分:什么是Git? 第2部分:Git入门 第3部分:创建第一个Git存储库 第4部分:如何在Git中还原旧文件版本 第5部分:3个用于Git的图形工具 第6部分:如 ...

  5. 将现有Git存储库推送到SVN

    我一直在用Git完成所有工作并推送到GitHub. 我对软件和网站都非常满意,我不想在此时改变我的工作方式. 我的博士生顾问要求所有学生将他们的工作保存在大学托管的SVN存储库中. 我已经找到大量关于 ...

  6. Xcode SCM系统 使用Git存储库机制之 学习笔记

    一.简介 1.Git是所谓的"分布式SCM" ,不需要服务器(不管是否远程)就可以操作.是Xcode目前支持和集成两个著名的SCM系统之一. 2.与SVN的差别 在大部分情况下,最 ...

  7. 尝试远程添加Git存储库时收到“致命错误:不是git存储库”

    我通过遵循本教程向自己介绍Git: 让jekyll在Nearlyfreespeech.net上运行 一切正常,直到将回购添加到本地计算机的部分为止: git remote add nfsn ssh:/ ...

  8. 如何仅从git存储库中稀疏签出单个文件?

    如何从git仓库中检出一个文件? #1楼 git checkout branch_or_version-路径/文件 示例: git checkout HEAD -- main.c #2楼 如果您已经有 ...

  9. 将子目录分离(移动)到单独的Git存储库中

    我有一个Git存储库,其中包含许多子目录. 现在,我发现一个子目录与另一个子目录无关,应该将其分离到单独的存储库中. 如何在保留子目录中文件历史记录的同时执行此操作? 我想我可以制作一个克隆并删除每个 ...

最新文章

  1. install virtualenv
  2. mxnet slice_axis
  3. python代码壁纸-一个爬取壁纸的python代码
  4. 2020-12-01 Halcon初学者知识[1] 初始界面
  5. 多字节与UTF-8、Unicode之间的转换
  6. 计算机专业带给我们的启示,一次电脑网络调查带给我的启示
  7. c语言long double位数,int long double 所占位数 和最大值
  8. easyui源码翻译1.32--SearchBox(搜索框)
  9. 深度学习入门:Day-11_CNN
  10. 内温的整体优先效应实验_[心理学复习.doc
  11. ACM 学习笔记(四) 数据结构之树、二叉树、完全二叉树、二叉查找树、AVL树、红黑树、B树、B+树
  12. java为什么要连接Mysql_为什么要启动mysql workbech,java才能连接mysql数据库呢?
  13. 十年Smartbi项目经理:BI应用在银行业的发展历程和展望
  14. OSEK/VDX网络管理
  15. 最小二乘法计算CCM
  16. 千里追踪“假疫苗”产销链
  17. python--控制窗体
  18. word 插入脚注尾注和删除页眉页脚
  19. Spring Data JPA 之 理解 Persistence Context 的核心概念
  20. 影响未来十年的2020十大科技趋势,除了AI与区块链,还有哪些?

热门文章

  1. conda环境下如何升级python?
  2. 点云网络的论文理解(一)-点云网络的提出 PointNet : Deep Learning on Point Sets for 3D Classification and Segmentation
  3. DQN笔记:MC TD
  4. Python入门100题 | 第023题
  5. LeetCode-二分查找-374. 猜数字大小
  6. MatLab基础操作
  7. Python处理大数据量文本数据思路
  8. 第二周 数据分析之展示 Matplotlib库入门
  9. 京东网络接入体系解密之高性能四层网关DLVS
  10. MySQL——MySQL的数据查询功能