[英]Understanding Branching with Git and Github
我有一个问题。 我有 2 个分支,分别是master
和my-destinations
。 我在my-destinations
分支上做了一些不在master
上的更改。 我提交并将更改从my-destinations
分支推送到我的 git 存储库。
当我切换回 master 时,我提交并推送到 repo 的更改不在那里,这是我所期望的。 但是,当我切换回master
并运行git status
它说master
是最新的。 我原以为它会说master
是origin
后面的一个提交。
有人能帮我理解为什么master
是最新的origin/master
,但没有提交的更改吗?
有人可以帮助我理解为什么 master 与 origin/master 保持同步,但没有提交的更改吗?
您的local master
分支与github remote master
分支具有相同的文件。 这就是为什么您的(本地)主分支不在您的(远程)主分支后面。
如果其他人(或来自任何其他远程计算机的您)已将新更改提交到(远程)主分支,则您的(本地)主分支将落后(任何数量的提交)。
您在本地存储库中添加了对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
进行推送,那么远程也会有 bcd 提交,以及也指向 (d) 的origin/my-destinations
本地跟踪引用。
但最大的问题是如何让你的新提交回到master
。 为了让你从my-destinations
向master
提交新的提交,你可以git merge my-destinations
和 master 检出,在这种情况下,这只会“快进” master 到 (d) 提交,因为master
是引用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 中查找“可视化 git 教程”,您应该会看到几个很好的教程,它们将引导您完成这些教程。
另请注意:我推荐 Git Extensions 作为开源 GUI 工具,它可以帮助您使用 GUI 更轻松地准确查看分支、提交、本地和远程的情况。 它帮助我更轻松地学习 Git,在前台使用 Visual Studio 或其他工具时,我总是在后台打开它。 随着更改的进行,它基本上会针对您打开的任何存储库向您显示类似于上图的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.