使用 Git 和 Github 理解分支
Posted
技术标签:
【中文标题】使用 Git 和 Github 理解分支【英文标题】:Understanding Branching with Git and Github 【发布时间】:2018-03-06 16:40:29 【问题描述】:我有一个问题。我有 2 个分支,分别是 master
和 my-destinations
。我在my-destinations
分支上做了一些不在master
上的更改。我从my-destinations
分支提交并将更改推送到我的 git 存储库中。
当我切换回 master 时,我提交并推送到 repo 的更改不存在,这是我所期望的。但是,当我切换回master
并运行git status
时,它说master
是最新的。我原以为它会说master
是origin
后面的一个提交。
谁能帮我理解为什么master
与origin/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)。
注意:如果master
和my-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版本工作流(转载)