如何创建分支别名,使其可以被推拉,而不会被视为单独的分支。 一些背景:
我们有一个名为Production
的分支。由于各种原因,我不能只重命名分支。
$ git branch --all
* master
remotes/origin/HEAD -> origin/master
remotes/origin/Production
remotes/origin/master
有时候我会git checkout production
错误而不会注意到它是一个新的分支。没有远程分支production
。也没有引用origin/production
。
$ git checkout production
Branch production set up to track remote branch production from origin.
Switched to a new branch 'production'
$ git status
On branch production
Your branch is up-to-date with 'origin/production'.
nothing to commit, working directory clean
$ git branch --all
master
* production
remotes/origin/HEAD -> origin/master
remotes/origin/Production
remotes/origin/master
Git创建了一个本地分支production
,声称它正在跟踪远程分支production
。现在,如果我提交并推送或只是推动git将推动一个新的分支。不是我想要的。
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:path/repo.git
* [new branch] production -> production
然后我必须退后一步
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git branch -d production
warning: deleting branch 'production' that has been merged to
'refs/remotes/origin/production', but not yet merged to HEAD.
Deleted branch production (was bc6d7a2).
$ git push origin :production
To git@github.com:path/repo.git
- [deleted] production
$ git checkout Production
error: pathspec 'Production' did not match any file(s) known to git.
不知怎的,现在我失去了Production
,直到我再次拉它。 git是否区分大小写?
$ git branch --all
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
$ git pull
From github.com:path/repo
* [new branch] Production -> origin/Production
Already up-to-date.
$ git checkout Production
Branch Production set up to track remote branch Production from origin.
Switched to a new branch 'Production'
Your branch is up-to-date with 'origin/Production'.
现在推动并没有推动新的分支。其实我想要的是什么。
$ git push
Everything up-to-date
我的第一个想法是创建一个名为Production
的{{1}}分支的别名,但我希望它能够被推拉,好像两者实际上是同一个东西。这是我不知道该怎么做的事情。其他问题中的所有别名方法似乎只是本地别名。
如果您对我的问题有不同的解决方案,我也希望听到它。
作为附注,如果你能告诉我为什么git有时会区分大小写,有时候不是。
答案 0 :(得分:2)
OP在评论中提及branch alias
git symbolic-ref refs/heads/production refs/heads/Production
这确实在本地解决了问题,并且比下面提到的钩子更简单 那些钩子可以在那里确保两个分支保持同步。
在这两种情况下,都涉及到对所有团队成员进行本地配置,尽管我提到了" templatedir"最后,自动化钩子传播。
Using hooks,您可以创建一个post-commit
挂钩,以确保将本地分支production
设置为与Production
分支相同的提交。 (或者,如果您在production
分支上提交,Production
设置为与production
分支相同的提交)
这样,两个分支总是引用相同的提交,你可以从任何一个提取。
pre-push
hook(git 1.8.2+),可以:
这样,即使将git config push.default
设置为simple
(意味着您只是推送当前分支),即使您推错了({{ 1}} => production
),origin/production
挂钩可以负责推送另一个(pre-push
=> Production
)
由于两个分支都被推动,因此拉动将始终至少更新其中一个分支 并且提交后挂钩将确保另一个挂起。
目标是不再关心您正在处理的分支(origin/Production
或Production
)。
您可以在shared template Git repo folder中添加这些挂钩,这将允许任何团队成员在其新克隆的仓库中获取这些挂钩,前提是他们的production
全局配置引用为共享文件夹。
答案 1 :(得分:1)
作为未来读者的替代方案,我考虑创建一个production
orphaned branch并放置一个文件,以便在错误的分支上显而易见。
git checkout --orphan production
touch wrong-branch
这可以是可移植的,但是不会让production
分支的行为像我真正想要的Production
分支一样(并且似乎不可能)
如果(出于某种未知原因)有人在实时服务器上并且错误地执行了git checkout production
,这可能会导致实时服务器中断。