2010-06-02 61 views
2

我们使用Git,我们的工作流由一个位于GitHub和每个开发人员的本地存储库上的'dev'和'master'分支组成。没有工作是直接在'master'或'dev'上执行的,而是在本地分支上进行的,只有合并发生在'dev'上,然后在'master'上进行。我们不会将本地分支机构推送到GitHub。本地分支机构在GitHub的“网络”视图中显示

由于某些原因,开发人员的本地分支出现在GitHub的“网络”视图中,这使网络图变得混乱(我应该指出分支本身不存在GitHub上的分支列表下)。

我的问题是这是否是正常行为,并自动发生,作为显示'dev'和'master'更改来自哪里的手段,还是因为某人错误地推送了本地分支并在以后删除它?如果是后者,是否有办法清理混乱?

回答

9

删除它,你看到在“网络”视图中的文物可能是跟踪您的基于合并的工作流程中。

当合并的合并经营成果提交*(即它不是一个“快进”),版本库的历史DAG模型将包括表示两个分支部分。当非本地分支被推送时,其祖先将包括最初在当地分支上提交的提交。
*通过使用git merge --no-ff或者因为两个分支已经超出其合并基础。

考虑一个假想的一系列事件和由此产生的历史DAG +裁判在中央资料库:

A$ git fetch && git checkout -b foo central/dev 
# A works and commits to her local branch 
B$ git fetch && git checkout -b bar central/dev 
# A and B work and commit to their local branches 
A$ git checkout dev && git pull && 
    git merge --no-ff foo && git push central dev 
# B works and commits to his local branch 
C$ git fetch && git checkout -b quux central/dev 
# B and C work and commit to their local branches 
B$ git checkout dev && git pull && 
    git merge --no-ff bar && git push central dev 
C$ git checkout dev && git pull && 
    git merge --no-ff quux && git push central dev 
D$ git fetch && 
    git checkout master && git pull && 
    git merge --no-ff dev && git push central master 

---o---o-------------------------------D master 
     \       /
     \    o---o---o / (was quux in C's local repository) 
      \ o---o /  \ /  (was foo in A's local repository) 
      \/ \/   \/
      o-------A---------B---C  dev 
      \    /
       o---o----o----o    (was bar in B's local repository) 

在任何时候都是当地(酒吧QUUX)分公司曾直接推送到中央存储库。但是,“他们的”提交被合并提交引用,这些合并提交被推送到中央存储库中的dev分支(以及后来的主分支)。

我怀疑GitHub网络视图向您显示这些间接推送的分支。

如果你想消除分支的这种拓扑证据,你将需要移动到基于rebase操作而不是合并操作的工作流(这意味着本地分支的原始“分支点”将被丢弃,这对您的整体工作流程可能是重要的也可能不重要)。

不要陷入困境,试图让DAG看起来很“漂亮”。工具不在乎DAG是否“丑陋”,你也不应该。您应该专注于挑选并正确使用生成DAG的分支工作流程,以便让工具为您提供有用的工作。

3

本地分支不应该显示在github上,否。除非有人说

git push origin branch_name 

没有办法起源(在这种情况下,github上)可以知道分支。

如果分支不再作为一个本地分支,你可以从产地通过

git push origin :branch_name 
+0

正如我提到的分支本身并不存在于原点(GitHub),而是它的效果可以在GitHub的“网络”视图中看到。 – Xubin 2010-06-02 17:15:37

+0

github无法联系到您的开发人员计算机,并查看您在那里得到了什么 - 如果它位于网络视图上,那么在某些时候它必须已被推入到github中。网络视图中存在大量缓存,因此显示的标签/分支可能已过时? – deanWombourne 2010-06-02 17:27:13

+0

虽然想到它 - 你确定它是一个分支而不是标签吗?什么'git标签'输出? – deanWombourne 2010-06-02 17:29:09