我被要求使用fork工作流,也就是说,我必须处理具有相同或相似名称的多个分支。为什么要使用这些不同的变体?
以下是不同命名约定的一些示例:
我的分支
来源MyBranch
来源/我的分支
远程/源/MyBranch
上游MyBranch
上游/MyBranch
最佳答案
小心背诵一系列记住的git命令。git有一个simple but powerful object model。了解git命令在对象模型中的工作方式,以及您希望做的事情如何适应命令的工作方式。根据我的经验,运行记住的命令有时会导致在同一序列的挫折中多次调用,这可能会以奇怪的方式缠绕历史。迷惑不解的队友来求救后,我坐下来,看看现在的状态,搔搔头,问“你是怎么进入这种状态的?“。”
跟踪分支的命名方案(例如origin/mybranch
或remotes/origin/mybranch
-甚至refs/remotes/origin/mybranch
以及类似的upstream/mybranch
)泄漏了分支名称空间的实现细节,即。refs
、remotes,
和origin
是未打包存储的物理目录。请参阅git pack-refs
documentation或转到.git/refs
下目录层次结构中的Spelunging。
git接受分支的缩写名称以方便用户,类似于用户不需要键入整个40个字符的sha1对象名。git rev-parse
documentation解释道。<refname>
,例如master
,heads/master
,refs/heads/master
一个符号参考名称。例如,master
通常表示提交对象
由refs/heads/master
引用。如果你碰巧两者都有heads/master
和tags/master
,您可以显式地说heads/master
来告诉git您指的是哪个。当不明确时,通过采用以下规则中的第一个匹配项来消除a<refname>
的歧义:
如果$GIT_DIR/<refname>
存在,那就是你的意思(这通常只适用于HEAD
,FETCH_HEAD
,ORIG_HEAD
,MERGE_HEAD
和CHERRY_PICK_HEAD
);
否则,refs/<refname>
如果存在;
否则,refs/tags/<refname>
如果存在;
否则,refs/heads/<refname>
如果存在;
否则,refs/remotes/<refname>
如果存在;
否则,refs/remotes/<refname>/HEAD
如果存在。
git文档将refs/remotes/origin/foo
称为符号全名或完全refname,它们对于按名称指定不可能有歧义的精确引用(例如在自动化程序中)非常有用。
请注意,mybranch
指的是您的本地mybranch
,而不是它的跟踪分支(或远程跟踪分支)origin/mybranch
或upstream/mybranch
。跟踪分支随每次获取或拉取而更新。把它们想象成你历史上的书签,或者是你上次拉遥控器的时候,遥控器所在位置的路标。mybranch
和origin/mybranch
引用不同的提交是可能的,而且经常发生这种情况。
相反,origin mybranch
从不指origin/mybranch
或mybranch
。git没有“/
运算符”。这种想法会将这两个独立的参数从上下文中去掉。请记住,git是一套命令行工具,命令行工具接受参数作为位置参数,unix命令shell按空格分隔参数。在上下文中,命令
git push origin master
具有一般形式
git push <remote> <branch>
也就是说,其中一个参数命名一个远程分支,另一个命名一个(通常是本地)分支。因此在英语中,它的意思是“将my
<branch>
上的提交(在本例中命名为master
)推送到远程(在本例中命名为origin
)。关于git - 为什么Git使用令人困惑的相似名称,例如“origin foo”,“remotes/origin/foo”和“origin/foo”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57312560/