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