2012-11-01 39 views
6

我已经克隆了一些git仓库,并且做了“git branch abcd”,它将我切换到派生自origin/abcd的分支。 abcd不是默认的原始分支。 然后,我从abcd创建了一个功能分支“my_feature”。 我想在适用的脚本中执行“git merge origin/abcd”到my_feature中,而不管使用的原始分支的名称如何(或者至少适用于其他答案中没有描述复杂分支结构时的简单情况关于git)。在git中获取父原始分支的名称?

如何找到什么是当前分支创建的“最近”/“父母”原点分支?

+0

[查找分支的父分支](http:// stackoverflow。3161204 /找最父分支对的一分支COM /问题/) – pisaruk

回答

3

这很难做好。在git中,分支只是一个自动前进的指向提交的指针,而提交可以有任意数量的分支名称。考虑这种情况下:

your master:  y1---y2---y3 
       /
master: a---b---c---d---e 
       \ 
feature:   f1---f2---f3---f4 

你签出分支 “大师” 在c,并承诺y1y2y3。您的历史看起来像a b c y1 y2 y3。与此同时,master已提前到de,但有人创建了功能分支,并根据c提交了f1f4。 Git没有办法确定你的分支来自master而不是feature,所以最好你可以选择分支来合并。

如果你自动做到这一点,你将不得不应用启发式方法来选择最短的分支或最长的分支,或者提供最多/最少提交或其他类似的方法。当然,由于有很多选择,对于内置功能来说这不是一个好的选择。但是,使用git的“管道”功能,你可以自己写:

#!/bin/bash 

# Tries to determine a good merge base from among all local branches. 
# Here used, a "good" merge base is the one sharing the most recent commit 
# on this branch. This function will exit 1 if no branch is found, 
# or exit 2 in a tie. 
# 
# Untested - use at your own risk. 

MAX_SEARCH=20 # only search the last 20 commits on this branch 
FOUND=0 
LAST_BRANCH= 

# iterate through the commits, most recent first 
for COMMIT in $(git rev-list --max-count=$MAX_SEARCH HEAD); do 
    # check every local branch 
    for BRANCH in $(git for-each-ref --format="%(refname)" refs/heads); do 
    # look for the commit in that branch's history 
    if (git rev-list $BRANCH | fgrep -q COMMIT); then 
     echo $BRANCH 
     FOUND=$((FOUND + 1)) 
     LAST_BRANCH="$BRANCH" 
    fi 
    done 
    if [ $FOUND -gt 1 ]; then 
    # more than one choice; exit 
    exit 2 
    elif [ $FOUND -eq 1 ]; then 
    git merge $LAST_BRANCH 
    exit 0 
    fi 
done 
exit 1 # could not find a parent 
2

对于DVCS,没有“父分支”这样的东西。

一个分支是:

  • 名称
  • 起始提交,并且承诺可以:多个分支的
    • 部分,无论是从本地回购和上游回购像'origin ”。您分支的重订后
    • 变化

中查看:

唯一的脚本方式工作是记录的名称,最好作为git notes(因为它不会更改历史记录和SHA1,但会添加元数据)。