不应该git branch --no-merged列出新的分支?

时间:2012-10-30 14:45:32

标签: git branch

我们有大量的中央git存储库,并使用分支来跟踪各种项目的工作。当项目完成时,我们合并为主人并推送到原点。

在开始一个新项目时,我想列出该存储库中的任何其他当前工作,作为开发人员的单挑(例如,他们可以传达他们的发布计划)。 git branch --all --no-merged origin/master似乎很有希望,但显然它只列出了有提交的分支。从概念上讲,即使是新创建的“空”分支也表明了做某些工作的意图,所以不应该列出这些吗?

我怀疑这可能与分支和分支头之间的区别有关,而分支头指向其起点则没有任何合并。但是,由于合并明确记录在历史中(对吗?)不应该有可能将“空”分支识别为未合并?可以这样做吗?

一个明显的解决方法是在每个新分支中强制进行虚拟初始提交,但是如果可能的话我想避免这种情况。如果他们不愿意,开发人员似乎不必推动他们未完成的更改(因此我希望中央存储库中的大多数分支在项目完成之前保持空白。)

示例:

# Alice creates and pushes branch1
git clone $REPO clone1
git checkout -b branch1
git push -u --all
# ...continues development in her local repository...

# Bob wants to know if anybody is working on $REPO
git clone $REPO clone2
git branch --all --no-merged origin/master
# no output - he doesn't realize Alice is working in the same repository

3 个答案:

答案 0 :(得分:1)

似乎没有git内置支持我想要的东西,但是通过一些git管道我获得了我想要的结果,灵感来自Finding a branch point with Git?

如果这些假设不正确,请告诉我......

  • 一个分支,其头部与origin/master的分支点相匹配(即没有提交)应该是一个空分支,表示工作的意图。
  • origin/master匹配的最佳合并点的分支已完全合并,可以忽略。
  • 任何其他情况都应该是具有未合并更改的分支。

打印所有远程分支的类别的示例脚本;如果Bob跑了这个,就会告诉他refs/remotes/origin/branch1: new branch without any commits

#! /usr/bin/env bash

# check branches created from and merged to this branch
MASTER=refs/remotes/origin/master

# for each remote branch...
for BRANCH in $(git for-each-ref --format='%(refname)' refs/remotes/); do
    # ...except the $MASTER branch and the current HEAD
    [[ $BRANCH == $MASTER || $BRANCH =~ /HEAD$ ]] && continue

    # get the hash for the head of the branch
    BRANCH_HEAD=$(git show-ref --head --hash $BRANCH)

    # returns the first shared commit among $MASTER and $BRANCH commits
    BRANCH_POINT=$(fgrep -m 1 -f <(git rev-list --first-parent $BRANCH) \
                                 <(git rev-list --first-parent $MASTER))

    # find the best merge point
    BRANCH_MERGE=$(git merge-base $MASTER $BRANCH)

    # determine the type of branch
    if [[ $BRANCH_POINT == $BRANCH_HEAD ]]; then
        echo "$BRANCH: new branch without any commits"
    elif [[ $BRANCH_MERGE == $BRANCH_HEAD ]]; then
        echo "$BRANCH: fully merged into $MASTER"
    else
        echo "$BRANCH: branch with unmerged changes"
    fi
done

答案 1 :(得分:0)

不,因为branch1中没有未更改的更改。因此“--no-merged”不会列出分支。一旦Alice提交并推送更改,它就会显示出来。

答案 2 :(得分:0)

我担心我会和Doug-W在一起。 --no-merged指的是包含当前分支不包含的提交(或许多)的分支。由于您是从master进行分支,而不是进行后续提交,因此分支包含的所有提交也都在master之内。

由于创建分支机构并不知道何时创建分支机构,因此您将失去一个对您和您的公司未来可能很重要的指标。如果只使用一个简单的“存根”文件创建一个分支时只进行一次提交,那么您可以使用此存根提交的时间戳和第二个提交时间戳来了解项目在启动之前停放的时间。

这还有一个额外的好处,就是在--no-merged命令中报告这些分支。