ブランチがローカルで追跡されたブランチまたはユーザーが作成したローカルブランチであるかどうかを見つける方法は?

StackOverflow https://stackoverflow.com/questions/2887242

  •  04-10-2019
  •  | 
  •  

質問

「git branch-b branch-name origin/branch-name」を使用して、ローカルリポジトリでローカルで追跡されたリモート追跡ブランチがあります。私のリモートブランチは、test2/test2(origin/branch-name)で、これは局所的にtest2として追跡されています。

起源はTest2とも呼ばれます。ローカルトラッキングブランチテストをチェックアウトしていません2。

私が 'git pull origin remote-branch:local-tracked-branch'私はこのエラーを取得するとき

test2] $ git pull test2 test2:test2 from/gitvobs/git_bare/test2! [拒否] test2-> test2(fast Forwnon)

一方、ローカルトラッキングブランチテスト2をチェックアウトして、「Git Pull Origin Local-Tracked-Branch」をプルすると、エラーが発生しません。

from/gitvobs/git_bare/test2 * branch test2-> fetch_head auto -merging a.txt自動マージが失敗しました。競合を修正してから結果をコミットします。

a +(git pull test2 + test2:test2)を追加することは役立つが、局所的な変更を上書きすることを知っています。

では、「Git Branch New-Branch-Name」を使用してローカルに作成されているか、Git Branch-B Branch-Name Origin/Branch-Name」を使用してリモートブランチからローカルで追跡されている地元のブランチのどれが作成されているかを知るにはどうすればよいですか?

役に立ちましたか?

解決

追跡された分岐のリストとは独立して(あなたはそれを見ることができます git config -l)、a "non-fast-forward" メッセージ 手段は、枝のリモートブランチ(つまり、リモートブランチのフェッチされたコミットのローカルコピー)をマージすることはできません。

  • あなたの枝には独自のコミットがあります
  • リモートブランチには、最後のプル以来新しいコミットがあります

それで:

  --last pull
  |
  v
x-x-x-x-x <--test2
  \
   -y-y-y <-- test2/test2

一方、これは早送りのマージでした

  --last pull
  |
  v
x-x <--test2
  \
   -y-y-y <-- test2/test2

それで:

git checkout test2
git fetch test2 test2 
git merge test2/test2
#fix conflicts
git commit

また、Test2以外の名前をリモートレポを呼び出してください。それはここであまりにも多くのtest2です;)


これで、ローカルリポジトリで追跡されているリモートブランチのリストについて:

git config --get-regexp branch..*

他のヒント

Git Pull 錯乱

過剰特異性

あなたの Git Pull コマンドには情報が多すぎます。

test2] $ git pull test2 test2:test2
from/gitvobs/git_bare/test2
! [拒否] test2-> test2(fast Forwnon)

a +(git pull test2 + test2:test2)を追加することは役立つが、局所的な変更を上書きすることを知っています。

これがあなたのコマンドの意味です:

#             *------------ (1) remote repository name
#            /     *------- (2) ref in remote repository
#           /     /     *-- (3) ref in  local repository
#          /     /     /
git pull test2 test2:test2

# Means this: From remote repository `test2` (1),
# fetch branch `test2` (2), store it in local branch `test2` (3), then
# merge the fetched history into HEAD.

あなたは言っています Git Pull あなたの地元を上書きするために test2 リモコンが持っているものは何でもブランチします test2 ブランチしてから、それを頭とマージします。おそらく、RefSpecの宛先部分を含めたくないでしょう( :test2).


チェックアウトしたローカルブランチが何かを追跡するように構成されている場合(以下の「ブランチ:…」を参照)、

git pull

リモートとリポジトリを提供する(またはオーバーライドする)場合は、リモート名/URLとローカルブランチをリモートに供給するだけです(REFSPECの最終部分を離れます):

git pull test2 test2

チェックアウトされていないブランチに引き込みます

Git Pull (上記のように)の組み合わせです gitフェッチgitマージ (また Git Rebase).

一般に、マージには紛争解決が含まれる場合があります。紛争解決には、作業ツリーが必要です。したがって、作業ツリーなしで通常のマージ操作を実行することはできません。これは、あなたの現在の頭がマージの親の一人でなければならないことを意味します(それは最初の親になります)。リベースを行うには、紛争解決のために作業ツリーも必要です。

プルにはマージまたはリベースが含まれるため、チェックアウトされていないローカルブランチに引っ張ることはできません。現在チェックアウトされているブランチにのみ引き込むことができます。

ブランチ:ローカル、追跡、リモートトラッキング

さまざまなタイプのgitブランチは、すべて同じ基礎となるオブジェクトです:refs。 refsはに住んでいます refs/ 名前空間 $GIT_DIR/refs/$GIT_DIR/packed-refs.

  • 「ローカル」ブランチはに住んでいます refs/heads/ 名前空間。
    • を調べる test2 ローカルブランチREF:
      • git show-ref refs/heads/test2, 、 また
        • cat .git/refs/heads/test2, 、 また
        • grep -F refs/heads/test2 .git/packed-refs
  • 「リモートトラッキング」ブランチはに住んでいます refs/remotes/<remote-name>/ 名前空間。
    • リモートトラッキングブランチは、リモートリポジトリからのブランチのローカルコピーです。
      • 「リモートトラッキング」という名前は、このように考えると理にかなっていますが、残念ながら名前が付いていると混同することができます。 --track の機能 gitブランチgitチェックアウト (最終的なブランチタイプを参照)。
    • を調べる test2 リモートトラッキングブランチ参照:
      • git show-ref refs/remotes/test2/test2, 、 また
        • cat .git/refs/remotes/test2/test2, 、 また
        • grep -F refs/remotes/test2/test2 .git/packed-refs
  • 別の枝を追跡するローカルブランチは、通常のローカルブランチです( refs/heads/)追加の構成があります $GIT_DIR/config:

    [branch "test2"]
            remote = test2
            merge = refs/heads/test2
    

    に注意することが重要です merge (また rebase)構成オプション名a リモートでref. 。それで refs/heads/test2 ここでは、地元の支店を意味します test2 リモコンで見つかりました test2. 。特別なリモート名 . ローカルリポジトリのローカルブランチを参照するために使用できます。

    • 他のいくつかのブランチを「追跡」するローカルブランチの目的は、簡単に入力できるようにすることです git pull また、他のブランチの歴史を統合します(または上にリベースします)。

あなたは、他のいくつかの枝を追跡する地元の枝とプレーンな地元の枝を区別したいと言いました。これを行うことができます。 $GIT_DIR/config ファイル。

使用する場合があります git config これをする:

branch_tracks_something() {
    {
        git config branch."$1".merge ||
        git config branch."$1".rebase
    } >/dev/null 2>&1
}
# test local branch 
branch_tracks_something test2 && echo 'test2 tracks something' || echo 'test2 does not track anything'

または、GIT 1.6.3以降がある場合は、 %(upstream) の形式 git for-ref-ref:

{ echo 'show_ref_desc() {
    case "$1" in
        refs/heads/*)
            t=''
            test -n "$2" && t=" (tracks $2)"
            echo "local: $1$t"
        ;;
        refs/remotes/*)
           echo "remote tracking: $1"
        ;;
        *)
            echo "other: $1"
        ;;
    esac
}'; git for-each-ref --shell --format='show_ref_desc %(refname) %(upstream)'; } |
sh

出力は次のようになります:

local: refs/heads/test2 (tracks refs/remotes/test2/test2)
remote tracking: refs/remotes/test2/HEAD
remote tracking: refs/remotes/test2/test2
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top