创建新分支时,基础分支是什么?

2024-04-20

创建分支时我需要确认/纠正我的假设。如果我在主分支中,执行以下操作后:

git checkout -b some_branch

这意味着我已经从 master 开始了一个新分支。

另一方面,如果我签出另一个分支,并在那里创建一个分支:

git checkout some_branch
git checkout -b other_branch

这意味着我已经使用从 some_branch 提交的所有当前代码创建了 other_branch,对吗?

并且,无论当前分支如何,如果完成此操作:

git branch branch_2 branch_1

然后将以branch_1为基础创建branch_2。 这些假设正确吗?


Git 中没有这样的东西基础分支的一个分支。相反,只有一个当前提交,Git 称之为树枝的尖端.

绘制图表

为了直观地理解这一点,您应该从绘制(至少部分)Git 开始提交图。这是一个小型存储库的示例,其中只有三个提交:

A <-B <-C   <--master

任何给定提交的“真实名称”都是那些丑陋的大哈希 ID 之一,c0ffeeface1deadbead...等等。这个哈希 ID 唯一标识了特定的提交,实际上是made通过散列(因此称为“散列 ID”)contents该提交的。它们看起来很随意,很难记住,所以这里我只使用单个大写字母。

Git“看到”图表的方式是它首先读取分支名称,例如master。该分支名称包含hash ID像这样的提交C。我们这么说master 指着 commit C.

同时,承诺C本身包含其前一个(或parent) 犯罪B。所以我们说C指着B, 一样的方法master指着C.

同样,提交B指向回A. A是有史以来的第一次提交,所以它没有地方可以指向……所以它就没有。我们称之为A a root提交,它让我们(和 Git)停止向后工作。

这些内部箭头绘制起来有点烦人,请注意,B实际上是part of C本身,所以它永远不会改变(如果我们尝试改变这部分C,我们得到一个新的,不同的犯罪)。所以我们可以不再费心画它们,而是写:

A--B--C   <-- master

箭头从 a 出来分店名称,不过,是not恒定,这就是整个想法的所在提示提交来自。

假设我们想添加一个新的提交master。我们进行 Git 所需的所有常规设置(添加或修改一些文件并使用git add)然后运行git commit. Git:

  • 写出一个新的提交D(它获得一个新的、唯一的哈希 ID)。这个新的提交指向C:

     A--B--C     <-- master
            \
             D
    
  • Then, changes master(或者更准确地说,它存储的哈希 ID),以便它指向我们刚刚进行的新提交:

     A--B--C
            \
             D   <-- master
    

当然,没有理由再在图中保留这种扭结:

    A--B--C--D   <-- master

这就是 Git 中分支的生长方式。

做一个new分支,Git 只是创建分支名称指向一些现有的提交:

A
 \
  B
   \
    C
     \
      D   <-- master

我们可以选择这些提交中的任何一个,并在其中创建一个新的分支名称。我们来选一下B和做newbr点那里:

A
 \
  B   <-- newbr
   \
    C
     \
      D   <-- master

我们会这样做git branch newbr <thing-that-finds-B>.

但是我们如何找到提交呢?

我们如何找到B?好吧,一种方法是跑步git log并剪切并粘贴哈希 ID。但另一种方法是使用分支名称。名字newbr现在指向B。如果我们想再提交一个分支点B too:

git branch thirdbr newbr

这使得 Git 查找newbr,这指向B,并创建新名称thirdbr,这...也指向B:

A--B   <-- newbr, thirdbr
    \
     C--D  <-- master

这就是为什么在 Git 中创建分支如此之快:它几乎什么都不做!它只是创建一个指向某些现有提交的标签。

某些分支名称指向的提交称为提示提交那个分支的。请注意,一次提交可以同时成为多个分支的尖端。这是关于 Git 的一个更大的事情的一部分:一些提交正在进行many分支,全部同时进行。例如,提交A—根提交—已开启every分支。 (一个存储库中可以有多个根提交,尽管这有点棘手,但我们现在不需要担心这一点。您无法使用到目前为止显示的命令来做到这一点。)

是什么让分支名称如此特别

然而,分支标签的特殊属性是它们move。他们不仅会动,还会动自动地.

当我们做出新的提交时我们已经看到了这一点D。 Git 将新提交的 ID 写入master. But: Git 如何知道使用master?就此而言,Git 如何知道使用C当 Git 提交时作为父提交D?

好吧,当然我们当时只有一个分支,但是让我们进行一个新的提交now,现在我们有了三个标签master, newbr, and thirdbr。首先,让我们做git checkout thirdbr,并绘制结果:

A--B   <-- newbr, thirdbr (HEAD)
    \
     C--D  <-- master

Nothing really changed in the drawing,1 except that I added the word HEAD here. HEAD is how Git knows which branch-and-commit are the current branch and commit.

现在我们进行通常的修改一些文件,git add, and git commit。 Git 写出新的提交,并将其父级设置为提交B。 Git 看到current分支是thirdbr and thirdbr指着B,所以当前的commit is B。让我们绘制新的提交E:

     E
    /
A--B   <-- newbr
    \
     C--D  <-- master

唯一剩下的就是移动当前分支name thirdbr这样它就指向新的提交E:

     E   <-- thirdbr (HEAD)
    /
A--B   <-- newbr
    \
     C--D  <-- master

我们都完成了:我们已经向分支添加了一个新的提交thirdbr(仍然是 HEAD,因此仍然是当前分支,但现在E是当前提交)。

当您向当前分支添加提交时,HEAD 会告诉您当前提交是什么以及新提交的位置。HEAD 通常包含分支的名称,这就是git checkout作用:它检查特定的提交(通常是现有分支的提示提交),然后设置文件HEAD记住name的分支机构。这是分支名称本身记住的提示提交.

Using git checkout -b newname commit意思是:“检查指定的commit,然后创建一个新的分支名称newname指向该提交,然后将 HEAD 设置为该新名称。”如果省略commit部分,默认是使用HEAD。自从头is(总是)当前提交,Git 会跳过“签出”部分,只创建新的分支名称并将其存储到HEAD file.


1While nothing changed in the graph, Git did have to update our work-tree, and the index, so that we could have the files as of the way they were at commit B.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建新分支时,基础分支是什么? 的相关文章

  • 如何在 Windows 上向 git 存储库添加符号链接?

    我使用 GitHub 的电子环境编译 OS X 的二进制文件 并希望将输出添加到 git 存储库 我试过 git add error readlink sulu app Contents Frameworks Electron Framew
  • 如何使用 .gitattributes 避免在 git root 中包含文件夹,但在 zip 的 dist 文件夹中包含同名文件夹

    我有一个名为lib在存储库的根目录和另一个名为lib在 dist 文件夹中 我正在尝试使用 gitattributes文件排除除 dist 之外的所有文件夹和文件 以便任何下载为 zip 或 tarball 的人都只会 git 分发文件 我
  • 使用 TFS 个人访问令牌克隆 Git 存储库

    我正在尝试以编程方式克隆 git 存储库 我的 ASP NET MVC 应用程序正在创建并启动一个进程 处理进程的代码工作正常 但是当尝试使用本地 TFS PAT 克隆 git 存储库时 身份验证失败 我无法使用 NTLM 或要求用户输入凭
  • DVCS命令的统一

    当处理多个 开源 项目时 多个版本控制系统开始出现问题 虽然它们共享共同的操作 但我经常在输入时犯错误hg add反而git add 我记得前段时间看到过一个项目 通过提供基本命令以统一的方式访问不同的源代码控制软件提交 ci add等在外
  • refname 不明确且拉取失败

    我运行了以下命令 因为我想将生产分支移回而不必先签出 git branch f production HEAD 1 现在 当我检查生产时 我收到以下警告 warning refname production is ambiguous 然后我
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • IntelliJ:查看本地和 git 提交/分支之间所有已更改文件的差异

    使用 IntelliJ 的 diff 查看器是检查代码的一种非常好的方法 因为您可以使用 IntelliJ 代码编辑器的所有功能 重构 完成等 在本地版本中进行更改 不幸的是 我还没有弄清楚当你在 IntelliJ 中进行代码审查时如何做最
  • 部署在github中的Jekyll显示index.html文件的原始文本

    我正在尝试使用来自的分叉存储库来部署 Jekyll 网站https github com cotes2020 jekyll theme chirpy https github com cotes2020 jekyll theme chirp
  • 如何从 android.googlesource.com 或 github.com 下载单个目录?

    我想下载 https android googlesource com platform frameworks base git master tools aapt https android googlesource com platfo
  • Git:显示分支之间的差异,忽略合并的提交

    我的存储库历史记录看起来像这样 x y z branch a b c d e master 我想获得 branch 完整历史记录的单个差异 即 像 git diff 输出 我不想要像 git log p 产生的一大堆差异 而不包括任何从 m
  • 获取 GitHub 问题的管道价值?

    我使用 ZenHub 来管理 GitHub 上的问题 当我查看问题的详细信息时 我可以在 GitHub 中看到属性 pipeline 这正是保存问题的列 Now I want to get the pipeline information
  • 有谁知道类似于 SVN Time-Lapse View 的 Git 工具 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 SVN Time Lapse View 是一个跨平台查看器 可以下载文件的所有修订版本 并允许您通过拖
  • 哪个是更智能的 git 协议,ssh 或 git(通过 ssh)或 https 协议?

    哪个高效 SSH 或 Git 文件压缩 我对 Git 的理解是 git 协议很智能 因为通信两端都有一个协议代理来压缩文件传输 从而通过有效地使用网络带宽来实现更快的克隆 From 我发现了以下说法 For secure authentic
  • git 显示已添加到 gitignore 的文件中的更改?

    我已经将 log2 文件夹和 main js 文件添加到 gitignore 如屏幕截图所示 但即使执行后git rm cached r我仍然可以看到 git 正在检测 main js 和 log2 文件夹内文件的更改 怎么会 这些的常见问
  • 默认情况下 git merge -Xignore-space-change

    我该如何设置该选项ignore space change对于所有合并使用git config 我也许可以使用别名merge 但因为我希望该设置应用于git stash pop git stash apply git pull and git
  • Jenkins 和 Github 不使用 SSH 密钥

    我已将 Jenkins 设置为从 Github 上的私有存储库中提取特定作业 尽管我已经生成了私钥 公钥并将其作为部署密钥添加到 github 但 Jenkins 似乎并未使用 SSH 密钥 当我从 Jenkins 用户进行 git clo
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • 我可以直接从我的谷歌云端硬盘在线推送/拉取吗?

    有一些方法可以通过谷歌驱动器同步 Windows 应用程序将我的本地 git 存储库同步到我的谷歌驱动器 但我想知道我是否可以完全绕过它的需要 Fro eg git remote add origin https drive google
  • Netbeans 和 Git,.obj 文件被忽略

    我正在开发一个涉及 obj 文件的小型 git 项目 当我查看 项目选项卡 时 我发现它们被忽略了 但如果我查看我的 gitignore 我无法理解为什么 DepthPeeling nbproject private DepthPeelin
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My

随机推荐

  • 如何使用 Apache PDFBox 将 .png 图像添加到 pdf

    当我尝试使用 pdfBox 绘制 png 图像时 页面保持空白 有没有办法使用pdfBox插入png图像 public void createPDFFromImage String inputFile String image String
  • 如何从复合泛型类型中检索值?

    如何从泛型中检索值 具体来说 我正在尝试以下操作 Test let result Validate goodInput How to access record let request getRequest result 这是代码 type
  • 长文本微调器无法正常工作

    我的旋转器有一些问题 根据我的日期 我必须添加到TableRow a TextView与EditText or a Spinner 我必须在 Spinner 中显示的数组有点长 我用带有短文本的数组测试了我的代码 它看起来像这样 这里唯一的
  • Rails - 具有空数组的强参数

    我正在发送一组关联 ID 例如foo ids到我的控制器 为了允许值数组 我使用 params permit foo ids 现在的问题是 如果我发送一个空数组foo ids 该参数被忽略 而不是清除所有foos正如空数组应该做的那样 关联
  • 如何在响应拦截器中再次发送请求?

    我在我的应用程序中创建了一个拦截器来检测会话丢失 服务器发送 HTTP 419 在这种情况下 我需要从服务器请求一个新会话 然后我想自动再次发送原始请求 也许我可以将请求保存在请求拦截器中 然后再次发送 但可能有更简单的解决方案 请注意 我
  • Android 新的 CallLog.Calls.NUMBER_PRESENTATION 字段有什么用?

    我注意到 API 级别 19 Kitkat 中添加了一个名为 CallLog Calls NUMBER PRESENTATION 的新字段 The 文档 http developer android com reference androi
  • 在Java中,是否可以执行一个方法一段时间,并在达到时间限制后停止?

    我有下载网页的代码 HttpURLConnection connection private String downloadContent InputStream content Source parser try content conn
  • 在 MVC 框架中将 noSQL 和 ORM 结合起来用于实际案例应用程序

    一段时间以来 我一直在尝试将过去几年中读到的一些有关 noSQL couchDB mongoDB Redis 的 酷 东西投入实际使用 我非常习惯使用 Django 编写应用程序 并开始使用 Play 当 Java 是唯一可接受的部署选项
  • 如何以编程方式获取 vmmap 中显示的信息?

    任何看过 Mark Russovich 演讲 揭示内存管理之谜 的人都知道 vmmap 工具可以向您显示与进程限制 普通 32 位 Windows 上为 2GB 相关的内容 而其他工具似乎很少了解这些内容 我希望能够以编程方式监控我的rea
  • WPF 无法从 MouseDown 事件获取触摸位置

    我有一个 WPF 项目是在 NET v 4 0 添加触摸支持之前编写的 因此仅处理鼠标事件 我在用手指在触摸屏上测试项目时遇到了这个问题 问题是 位置 X Y 在第一次触摸中被正确检索 但 X Y 值在后续触摸中保持不变 无论我触摸哪里 即
  • 无效的 PHP JSON 编码

    我正在 PHP 5 3 1 中的一个项目中工作 我需要将 JSON 字符串发送到 web 服务 在 python 中 但是从 json encode 获得的结果不会作为有效的 JSON 传递 我正在使用 JSLint检查有效性 我应该补充一
  • 在 Windows powershell 中使用 svn 缺少参数 -m

    我正在尝试在 Windows PowerShell 上运行它 svn ci m directory name 但它返回 svn E205005 日志消息是一个路径名 F 是故意的吗 使用 force log 覆盖 我尝试 cd 该目录并在没
  • Django持久数据库连接

    我将 django 与 apache mod wsgi 和 PostgreSQL 都在同一主机上 一起使用 并且我需要处理大量简单的动态页面请求 每秒数百个 我面临的问题是 瓶颈是 django 没有持久的数据库连接 并且在每个请求上重新连
  • lapply 和 mutate_all/for 循环

    我在列表中有几个数据框 我必须通过标准化所有列中的所有数据来修改这些数据框 基本上 将每行 列除以该列数的总和 使用 lapply 加载所有原始数据帧后 我想迭代所有列以执行此类操作 即 mutate df df my column df
  • 如何正确解析这种日期?

    我无法为我的日期找到正确且干净的工作解决方案 其格式如下 201406082159 6月8日 21 59 此处 我上次尝试的是这样的 SimpleDateFormat format2 new SimpleDateFormat YYYYMMD
  • 将宽变长,但重复特定列

    我有一个数据框 如下所示 df2 pd DataFrame pid 1 2 3 4 BP1Date 12 11 2016 12 21 2016 12 31 2026 np nan BP1di 21 24 25 np nan BP1sy 12
  • SIM900 GSM/GPRS 未获得正确的 AT+CREG?回答

    我使用的是带有 IComsat SIM900 GSM GPRS 扩展板的 Arduino UNO 使用以下教程 Arduino 实时 GPS 追踪器 http www samaria me uk 2011 12 arduino live g
  • org.xml.sax.SAXParseException;cvc-complex-type.2.4.c:匹配通配符严格,但找不到声明

    我在这里要做的就是让邮件发送器通过我的 Java 代码工作 我查看了类似的问题 并按照此处的建议删除了 spring 版本号cvc complex type 2 4 c 匹配通配符严格 但找不到元素 mvc annotation drive
  • Play框架2.5.0 Websockets示例[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 播放框架 2 5 0 Websockets 示例 在 play 2 5 0 websockets 代码
  • 创建新分支时,基础分支是什么?

    创建分支时我需要确认 纠正我的假设 如果我在主分支中 执行以下操作后 git checkout b some branch 这意味着我已经从 master 开始了一个新分支 另一方面 如果我签出另一个分支 并在那里创建一个分支 git ch