2012-11-01 9 views
6

私はいくつかのgitリポジトリをクローンし、origin/abcdから派生したブランチに切り替えた "git branch abcd"を実行しました。 abcdはデフォルトの起点ブランチではありません。 次に、abcdの中から機能ブランチ「my_feature」を作成しました。 "git merge origin/abcd"をmy_featureに、使用する起点ブランチの名前にかかわらず適用可能なスクリプトで(少なくともいくつかの他の回答に記載されている複雑な分岐構造がない場合約git)。gitで親の元のブランチの名前を取得していますか?

現在のブランチが作成された「最も近い」/「親」の分岐先を見つけるにはどうすればよいですか?

+0

[ブランチの親ブランチを見つける](http:// stackoverflow。com/questions/3161204/find-the-parent-of-a-branch) – pisaruk

答えて

3

これはうまくいきません。 gitでは、ブランチはコミットの自動進化ポインタに過ぎず、コミットには任意の数のブランチ名を付けることができます。このような場合を考えてみましょう:

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

あなたはcでブランチ "マスター" をチェックアウトして、y1を犯し、y2、およびy3。あなたの履歴はa b c y1 y2 y3のようになります。一方、マスターはdeに進みましたが、誰かがフィーチャーブランチを作成し、cに基づいてf4までf1をコミットしました。 Gitはあなたのブランチがfeatureではなくmasterから来たと判断する方法がないので、最高であなたはマージするブランチの選択肢を持っています。

これを自動的に行うには、最短のブランチ、最長のブランチ、最も多い/最小のコミットを持つブランチ、またはそれ以外のものを選択するヒューリスティックを適用する必要があります。当然、多くのオプションがあるので、git組み込み関数のための実際の選択ではありません。しかし、gitの "plumbing"関数を使って、あなた自身で書くことができます:

#!/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を変更せずにメタデータを追加するため)。

関連する問題