我正在使用没有master
分支但有几个vX.Y
分支的repo。我总是在使用let {'}}作为我的远程分支。
我以前将远程分支称为master并且有很多别名来执行以下操作:
v1.2
我希望保持不变,因为这种情况发生了
我有没有办法将alias grhm="git reset --hard origin/master"
分支称为origin/v1.2
?
这可以通过origin/master
文件中的某些条目或类似的东西来实现,这样我就可以继续使用相同的shell环境处理其他repos吗?
答案 0 :(得分:2)
你可以,但我认为这是不明智的。推动时你也必须小心。考虑重新调整您的习惯和/或在别名中使用@{upstream}
或类似的东西。
有一种方法可以做你想要的,但它很笨拙且不灵活。您必须手动维护此特定存储库的.git/config
文件,并在每次要重命名的分支名称集以任何方式更改时进行更新。
当您运行git fetch
时(使用git fetch
而不是git pull
,我希望:-) ...如果您使用git pull
,则此处会遇到更多问题),你的Git使用存储在远程名称下的URL - origin
,在这种情况下 - 与其他一些Git联系。另一个Git有分支,通常名为master
和develop
等等,但有人对名称和/或幽默有着古怪的感觉,并使用v1.2
代替。 (这更适合作为标记名称而不是分支名称。)
在任何情况下,您的git fetch
都会从他们的 Git获取分支列表,并使用原始提交哈希ID来实现他们拥有的您没有的任何提交这个。提交带来了必要的任何文件。从技术上讲,Git只是传输对象,包括提交,树和 blob 对象,以获取所有内容。在任何情况下,只要你有提交,你就拥有了你需要的一切,除了一部分:名称。
您的git fetch
现在继续重命名所有分支名称。此重命名由您的远程名称下的另一个设置控制:
$ cat .git/config
[snip]
[remote "origin"]
url = <some url>
fetch = +refs/heads/*:refs/remotes/origin/*
url
设置包含我们已提及的网址。这个fetch
行控制了分支名称重命名的方式,但是:这个特定的(标准)fetch
设置告诉你的Git:匹配任何以refs/heads/
开头的内容,并将其重写为以refs/remotes/origin/
开头的字符串。第一个*
是“匹配任何东西”部分,第二个告诉Git重新插入匹配的内容。
但您不希望将refs/heads/master
更改为refs/remotes/origin/master
,将refs/heads/v1.2
更改为refs/remotes/origin/v1.2
。具体而言,您希望将refs/heads/v1.2
(如他们的Git上所见)更改为refs/remotes/origin/master
(存储在您的Git存储库中)。幸运的是,你没有 使用*
来匹配所有内容 - 你可以列出每个名字,一次一个:
[remote "origin"]
url = <some url>
fetch = +refs/heads/v1.2:refs/remotes/origin/master
fetch = +refs/heads/mr_t:refs/remotes/origin/i_pity_the_fool
等等。这些 refspecs 中的每一个都以加号开头 - 这会设置“强制”标志,这样您的Git就会使用他们的覆盖您的引用 - 即使这不是快进操作,也会获取值 - 然后列出他们的分支名称,冒号将他们的名字与您的名字分开,然后列出您的名称,在refs/remotes/origin/
名称空间中。由于您未使用*
匹配,因此必须列出您要从中复制的每个分支,并在您身边提供唯一的名称。< / p>
请注意,这些提取引用指针对推送操作没有影响。如果您打算将某些内容从master
推送到v1.2
,则必须运行{{ 1}}。您只能为每个分支设置一个上游名称;您需要使用重命名的git push origin master:v1.2
名称,当然不 origin/master
上的实际名称。将origin
配置为push.default
(就像在Git 2.0及更高版本中一样),如果您的分支名称与其分支名称不匹配 - 它不会 - 它必须拼出所有你的推送命令。