我想找到一个git命令,它将在Atlassian Bitbucket上基于另一个特定分支(而不是主分支)创建一个功能分支,而不是在本地创建分支。
有这样的命令吗?
如果我键入git branch
,我将看不到分支,因为它只显示本地分支。但是,如果我键入git branch -a
,我会看到新创建的分支。
任何帮助都将不胜感激,我已经搜索了又搜索,没有找到这样做的例子。
谢谢你,
所有分支都是本地的(用于查看分支名称的存储库)。使用git branch -a
时,您不仅可以看到分支(它们是本地的),还可以看到远程跟踪名称,如origin/master
。
远程跟踪名称也是本地的(对于运行此git branch -r
或git branch -a
命令的存储库)。只是它们存在,因为你正在使用的Git在本地存储库上操作,在一些其他Git存储库中看到了这些名称作为它们的分支名称,因此将它们复制到你自己的Git存储库中,将这些名称改为origin/*
远程跟踪名称。
因此,这实际上可以归结为让Atlassian Bitbucket上的Git在Atlassian Bitbucket上存储的Git存储库中创建一个新的分支名称。有办法让他们做到这一点。其中一些涉及使用web界面。当然,这些不是Git命令(但它们可能比实际的Git命令更方便)。既然您要求使用Git命令,我们将忽略这些方法。
一般来说,你可以拥有自己的Git,让任何其他Git在其他Git存储库中创建你喜欢的任何名称。执行此操作的命令是git push
。然而,在如何使用git push
方面存在一些相对较强的限制,其中之一是,您不能直接使用其他Git存储库中存在的分支名称。(这是网络界面可能更合适的原因之一。)
要要求其他Git存储库创建分支名称,必须让您的Git向该Git存储池提供一个原始提交哈希ID,以及一个表单请求:创建或更新名称_____(填写空白),使其包含哈希ID _____(填写空间)。请注意,这里有两个空格需要填写。
为了填补这些空白,我们通常运行如下命令:
git push origin xyzzy
其中CCD_ 10是我们自己的(本地)分支名称之一。我们的Git采用该分支名称并将其转换为原始提交哈希ID,就好像我们运行了一样
git rev-parse xyzzy
(在您自己的分支名称上尝试此命令:git rev-parse
是只读操作,因此在任何名称或任何合适的表达式上尝试总是安全的;有关详细信息,请参阅gitrevisions文档)。
将xyzzy
转换为原始哈希ID(如a123456...
)后(实际哈希ID较长,但在大多数情况下,您可以通过仅使用前四个或更多字符来使用缩短的哈希ID),您的Git现在调用其Git。它从您的名称xyzzy
找到的哈希ID中填充原始哈希ID空白,并用refs/heads/xyzzy
填充名称空白,这是分支名称xyzzy
的完全拼写形式。
您的Git知道xyzzy
是一个分支名称,而不是像refs/tags/v2.3
这样的标记名称,因为xyzzy
是您自己的存储库中的支路的名称。因此,你的Git将这个只有一个分支名称的请求变成了一个两边都有分支名称的要求。为了理智,它在的侧使用了相同的name(无论如何,在所有正常和理智的设置中:有些不寻常或疯狂的设置可能不是这样;有时确实有一些理由变得疯狂和疯狂,尽管最好尽可能避免这种情况)。
现在,您实际上不需要分支名称。如果您知道正确的散列ID,您可以使用完整的git push
refspec语法,如下所示。假设您想让他们创建分支名称xyzzy
,并且您没有名称用于提交faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
,但您的存储库中有提交faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
。然后:
git push origin faefdd61ec7c7f6f3c8c9907891465ac9a2a1475:refs/heads/xyzzy
发送相同类型的创建或更新名称_____,使其包含哈希ID _____请求,名称来自冒号的右侧,哈希ID来自左侧你必须拼出全名,因为他们(大概)还没有xyzzy
,他们不知道这应该是一个分支、一个标签还是其他什么。将其拼写为refs/heads/xyzzy
,告诉他们这是分支名称,以便他们可以继续使用。
那么,在其他Git存储库中创建分支的真正限制是:
- 您希望他们将分支名称设置为的提交必须存在于您自己的存储库中
- 您必须具有通过
git push
创建新分支名称的权限
(Git本身缺乏这种权限系统,所以如果你建立了自己的Git服务器,你通常只拥有这些权限。但GitHub、GitLab、Bitbucket和其他托管服务总是会添加某种权限控制结构。如果没有权限控制结构,会把太多客户送到竞争对手那里,而竞争对手确实提供了这些控制结构:GitHub提出了r很久以前了。)
现在,使用这样一个丑陋的大散列ID是一种痛苦。幸运的是,没有必要经历那么多痛苦。简单运行:
git fetch origin
首先,如果必要的话,从Atlassian站点的Git获取所有提交。这还将获得他们的所有分支名称,并使用这些名称在您自己的Git存储库中创建或更新您自己的远程跟踪名称。因此,如果他们现在有一个名为plugh
的分支,那么在Git存储库中就有了origin/plugh
,以及相应的提交。您现在可以运行:
git push origin origin/plugh:refs/heads/xyzzy
在他们的Git存储库中创建分支名称xyzzy
,指向与您在Git存储库中的提交名称origin/plugh
相同的提交,至少在几秒钟前,这是您想要的提交。这种方法的缺点是这几秒钟:到目前为止,plugh
可能已经更改了几十或数百次提交,这取决于新提交进入Git存储库的速度。但是,即使使用他们的web界面在这方面也没有多大帮助,因为如果每秒有50个新的提交出现在plugh
上,那么当你让他们从他们的plugh
创建xyzzy
时,你可以坐下来查看它,他们的plugh
中将会有50或100个新提交。
以上所有内容的简短版本是,你所寻找的是可能的,但毫无意义。分支机构名称没有什么特别之处。没有真正的理由在他们的存储库中创建一个,而不在自己的存储库中也创建一个。只需创建一个分支,完成工作,然后根据您在本地构建的提交在另一个Git存储库中创建名称。