我试图找出使用 Git 将远程分支 ( origin/develop
)合并到我的远程主分支 ( origin/master
)的标准方法。我看过这个:
这表明我执行以下操作:
1)在我的本地develop
分支上进行更改
2) 提交更改 develop
3)develop
将本地合并到本地master
4)推送本地master
到origin/master
这是我的问题:我永远不需要将一个远程分支合并到另一个分支中吗?标准方法只是不断更新远程分支origin/develop
来保存进度,最终将这些更改合并到本地master
并推送到origin/master
?
我认为这会弄乱我的远程提交日志,因为我最终会删除我用来跟踪本地develop
进度的远程分支......
谢谢!
我永远不需要将一个远程分支合并到另一个分支中吗?
事实上,你不能那样做。嗯,你可以,有点,但是——好吧,这很令人困惑。让我们备份。:-)
Git 在这里有一些相当糟糕的术语。分支这个词有歧义。一旦你习惯了它的所有不同含义,它就不是一个糟糕的名字:有人说“在分支 X 上工作”或“结帐分支 Y”,我们都知道我们的意思,但要达到这一点很难。有关更多信息,请参阅“分支”究竟是什么意思?但从这里开始:Git 主要是关于commits 的。分支名称稍后出现。
Git(和您)可以找到提交的最基本方法是通过其哈希 ID,它保证对于该特定提交是唯一的。但是,这些哈希标识似乎是随机的:26e47e261
来之前8b026edac
,但1f1cddd55
谈到以后这类原因,比如(这些都是在Git仓库为实际的Git提交)。名称,如分支名称和远程跟踪名称,可以让 Git 和您找到提交。每个这样的名字准确地记住一个哈希ID。
几乎每一次提交都会记住一两个哈希 ID。这些是该提交的父提交。Git 可以将这些不同的散列 ID 串起来,从存储在名称中的散列 ID 开始,然后向后工作,将它们串成提交链:
A <-B <-C <--master
namemaster
记住commitC
的hash ID,commitB
的hash ID记住commit的hash ID,commit的hash ID记住commit的hash ID A
。A
是第一个提交(在这个只有三个提交的小存储库中),因此它没有父级,因此结束了链。
添加新提交的过程包括写出新提交,使用当前分支链末端哈希 ID 作为其父项,然后将名称指向新提交:
A--B--C--D <-- master
(不绘制内部箭头更容易,根据定义,它总是向后指向,并且——与分支名称不同——一旦创建就永远不会改变,所以我通常不绘制它们。)
当您使用 Git 存储库时,您通常首先从某个其他现有 Git 存储库获取所有提交。在其他Git是使用它的分支名称找到这些提交。你的 Git 收集这些提交,但你的 Git 会给你你的分支名称,独立于他们的。因此,您的 Git 需要一些其他名称(不是分支名称的名称)才能找到它们的提交。您克隆他们的存储库,并且您的 Git将其重命名master
为您的origin/master
—远程跟踪名称或远程跟踪分支名称,有些人称之为远程分支名称。1
在创建 的初始克隆之后origin/*
, agit fetch origin
将调用相同的 URL(从您执行克隆时保存的)与同一个 Git 对话,从中收集它可能具有的任何新提交,并将所有远程跟踪名称更新为匹配他们的分支名称。因此,您的远程跟踪名称会自动跟随其分支名称。这是他们的主要目的:记住他们的分支名称正在记住哪些提交。
1 “远程分支名称”可能是所有这些短语中最糟糕的,并不是说它们中的任何一个都很棒,因为 Git 使用远程一词来指代一个名称origin
,您可以用它来识别其他Git 存储库。因此,如果您转到位于您的 下列出的 URL 上的 Git remote.origin.url
,并询问它的分支,您将得到他们的 master
、他们的 develop
等等。这些是遥控器上的分支名称:遥控器的分支名称。每个都必须是远程分支名称。但是它们不在您的Git 中,而是具有像origin/master
和这样的名称origin/develop
。我想调用origin/master
一个远程跟踪名字是最好的,这些模棱两可的用语:这是你的名字为他们的( origin
's) master
。
最后一步git clone
一般是git checkout master
。2您的Git不会有一个master
呢,所以你的Git巡游通过所有它(它只是让他们)远程跟踪的名字-origin/develop
和origin/master
等,并找到他们的origin/master
。这指向某个特定的提交,因此您的 Git 现在创建您的master
,指向相同的提交:
A--B--C--D <-- master (HEAD), origin/master
\
E <-- origin/develop
如果您现在运行git checkout develop
,则会创建您自己的develop
,指向与以下相同的提交origin/develop
:
A--B--C--D <-- master, origin/master
\
E <-- develop (HEAD), origin/develop
请注意,HEAD
附加到您的分支名称之一——这就是当您进行新提交时 Git 知道您在哪个分支上的方式。
假设您master
通过做git checkout master
和做一些工作将自己的提交添加到自己的。这将创建一个新的唯一哈希 ID 提交,并使您master
指向这个新提交:
F <-- master (HEAD)
/
A--B--C--D <-- origin/master
\
E <-- develop, origin/develop
这个特殊的例子没有使用git merge
,它有自己的一套复杂性(我不想在这里详细介绍),但重点很简单:你总是在自己的分支上做所有的工作。完成这项工作后,您可以运行git push
到:
因此,你现在可以git push origin master
送你新的提交F
给他们,并要求他们,使他们 master
点提交F
。如果他们同意这一点,您的 Git 会记录此更新,以便您现在拥有:
F <-- master (HEAD), origin/master
/
A--B--C--D
\
E <-- develop, origin/develop
2您可以告诉您的 Git 使用另一个名称,如果您不这样做,另一个 Git 会告诉您的 Git 使用哪个名称,但通常是master
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句