在git中获取父源分支的名称?

时间:2012-11-01 00:21:10

标签: git

我克隆了一些git存储库,并做了“git branch abcd”,把我转换成了一个源自origin / abcd的分支。 abcd不是默认的原始分支。 然后,我从abcd创建了一个功能分支“my_feature”。 我想在一个脚本中将“git merge origin / abcd”写入my_feature中,无论所使用的原始分支的名称如何都适用(或者至少适用于其他一些答案中没有描述复杂分支结构的简单情况) GIT)。

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

2 个答案:

答案 0 :(得分:3)

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

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

您在c检查了分支“master”,并提交了y1y2y3。因此,您的历史记录如a b c y1 y2 y3。与此同时,master已升级到de,但有人创建了一个功能分支,并基于f1通过f4提交了c。 Git无法确定您的分支来自master而不是feature,所以最多只能选择要合并的分支。

如果您自动执行此操作,则必须应用有关选择最短分支或最长分支或具有最多/最少提交的分支或类似其他内容的启发式方法。当然,由于有很多选项,它对于git内置函数来说并不是一个好的选择。但是,使用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

答案 1 :(得分:2)

使用DVCS,没有"父分支"。

分支是:

  • 一个名字
  • 一个开始提交,该提交可以:
    • 多个分支的一部分,包括本地仓库和上游仓库,如' origin'。
    • 在您的分支机构改变后改变

了解更多信息:

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