使用 Git 和 Github 理解分支

Posted

技术标签:

【中文标题】使用 Git 和 Github 理解分支【英文标题】:Understanding Branching with Git and Github 【发布时间】:2018-03-06 16:40:29 【问题描述】:

我有一个问题。我有 2 个分支,分别是 mastermy-destinations。我在my-destinations 分支上做了一些不在master 上的更改。我从my-destinations 分支提交并将更改推送到我的 git 存储库中。

当我切换回 master 时,我提交并推送到 repo 的更改不存在,这是我所期望的。但是,当我切换回master 并运行git status 时,它说master 是最新的。我原以为它会说masterorigin 后面的一个提交。

谁能帮我理解为什么masterorigin/master 是最新的,但没有提交的更改?

【问题讨论】:

您从未将更改合并到master,那为什么会落后呢?您需要 git checkout master && git merge my-destinations 才能使更改位于 master 当我尝试 git merge 时,git 的响应是“我们不能合并的东西”这个响应指的是什么? ***.com/questions/16862933/… 太棒了,谢谢。 【参考方案1】:

您在本地仓库中向my-destinations 添加了提交,而不是master

a              <-- master ref is (a)
 \
  b - c - d    <-- my-destinations ref is (d)

当您推送到远程仓库origin 时,它只需要您现有的本地master 分支,并使远程仓库master 保持不变。换句话说,远程master 已更新为引用(a),就像您的本地master。如果它已经在 (a) 处,那么遥控器就不会发生任何变化。

您的遥控器被命名为origin,这是标准命名约定。因此,如果您为远程 master 添加本地跟踪分支,它将被称为 origin/master,并且在该分支发生推送后它将引用相同的提交:

a            <-- master (a)*  <-- origin/master (a)
 \
  b - c - d  <-- my-destinations (d)

(*) - Indicates branch that is checked out

请注意,如果您在签出my-destinations 时没有推送,那么origin 不会有您的新提交 b、c 和 d,除非您使用命令行标志或其他方法推送所有分支到origin。如果您确实在签出 my-destinations 的情况下进行推送,那么远程也会有 b-c-d 提交,而 origin/my-destinations 本地跟踪引用也将指向 (d)。

但最大的问题是如何将您的新提交返回到master。要从my-destinations 获得对master 的新提交,您只需在签出主控的情况下git merge my-destinations,在这种情况下,它只会“快进”主控到(d)提交,因为@987654342 @ 引用 my-destinations 的父级(即它们没有分歧——您可以将 abcd 视为一条直线而不是一个分支)。合并后,您将拥有:

a            <-- origin/master (a)
 \
  b - c - d   <-- master (d)*  <-- my-destinations (d)

然后,在推送到远程之后,origin/master 将更新,以便在提交 (d) 时匹配 master - 即所有三个 ref 都将指向 (d)。


注意:如果mastermy-destinations 发生分歧,您可以合并或变基以将它们重新组合在一起。在 Google 中查找“visual git tutorial”,您应该会看到几个很好的教程,这些教程将引导您完成这些。

另请注意:我推荐 Git Extensions 作为一种开源 GUI 工具,它可以帮助您通过 GUI 更轻松地准确了解分支、提交、本地和远程的情况。它帮助我更轻松地学习 Git,我总是在后台打开它,同时在前台使用 Visual Studio 或其他工具。对于您打开的任何 repo,它基本上都会向您显示类似于上图的内容,因为所做的更改。

【讨论】:

【参考方案2】:

有人可以帮我理解为什么 master 与 origin/master 是最新的,但没有提交的更改吗?

您的local master 分支与github remote master 分支具有相同的文件。这就是为什么您的(本地)master 分支不在您的(远程)master 分支之后的原因。

如果其他人(或来自任何其他远程计算机的您)已将新更改提交到(远程)master 分支,您的(本地)master 分支将落后(任何数量的提交)。

【讨论】:

以上是关于使用 Git 和 Github 理解分支的主要内容,如果未能解决你的问题,请参考以下文章

GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流(转载)

Github操作与git分支管理

使用git和github进行协同开发流程

Git的分支管理

监视Jenkins中的存储库,但不要拉

Github Windows '无法同步这个分支'