git pull混乱
過剰特異性
git pullコマンドに含まれる情報が多すぎます。
[test2]$ git pull test2 test2:test2
/gitvobs/git_bare/test2 から
! [却下] test2 -> test2 (非早送り)
+ (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.
リモートのブランチにあるものでローカル ブランチを上書きし、それを HEAD とマージするようにgit pullに指示しています。おそらく、refspec の宛先部分 ( ) を含めたくないでしょう。test2
test2
:test2
チェックアウトしたローカル ブランチが何かを追跡するように構成されている場合 (以下の「ブランチ: …」を参照)、そのまま実行します。
git pull
リモートとリポジトリを指定 (またはオーバーライド) する必要がある場合は、リモートの名前/URL とリモートのローカル ブランチを指定するだけです (refspec の最後の部分は省略します)。
git pull test2 test2
チェックアウトされていないブランチへのプル
git pullは (前述のように) git fetchとgit merge (またはgit rebase ) の組み合わせです。
一般に、マージには競合の解決が含まれる場合があります。競合の解決には作業ツリーが必要です。したがって、作業ツリーがなければ通常のマージ操作を実行することはできません。これは、現在の HEAD がマージの親の 1 つでなければならないことを意味します (最初の親になります)。リベースを行うには、競合を解決するための作業ツリーも必要です。
プルにはマージまたはリベースが含まれるため、チェックアウトされていないローカル ブランチにプルすることはできません。現在チェックアウトされているブランチにのみプルできます。
ブランチ: ローカル、トラッキング、リモート トラッキング
さまざまなタイプの Git ブランチはすべて同じ基本オブジェクトである refs です。Ref は と の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>/
名前空間に存在します。
- リモート追跡ブランチは、リモート リポジトリからのブランチのローカル コピーです。
- このように考えると「リモート追跡」という名前は理にかなっていますが、残念ながらgit branchおよびgit checkout
--track
という名前の機能と混同される可能性があります(最後のブランチ タイプを参照)。
test2
リモート追跡ブランチ ref
を調べるには:
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
) 構成オプションは、リモートの 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 以降を使用している場合は、 git for-each-ref%(upstream)
の形式を使用できます。
{ 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