2

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

オリジンの名前も test2 です。ローカル追跡ブランチ test2 をチェックアウトしていません。

「git pull origin remote-branch:local-tracked-branch」を実行すると、このエラーが発生します

[test2]$ git pull test2 test2:test2 /gitvobs/git_bare/test2 から ! [却下] test2 -> test2 (非早送り)

一方、ローカル トラッキング ブランチ test2 をチェックアウトして pull 'git pull origin local-tracked-branch' を実行すると、エラーは発生せず、'git pull test2 test2' を使用してプルを実行します。

/gitvobs/git_bare/test2 から * ブランチ test2 -> FETCH_HEAD a.txt の自動マージ 自動マージに失敗しました。競合を修正してから、結果をコミットします。

+ (git pull test2 +test2:test2) を追加すると役立つことはわかっていますが、ローカルの変更が上書きされます。

では、どのローカル ブランチが「git branch new-branch-name」を使用してローカルで作成されたか、または「git branch -b branch-name origin/branch-name」を使用してリモート ブランチからローカルで追跡されたかを知るにはどうすればよいでしょうか。

4

2 に答える 2

7

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 の宛先部分 ( ) を含めたくないでしょう。test2test2:test2


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

git pull

リモートとリポジトリを指定 (またはオーバーライド) する必要がある場合は、リモートの名前/URL とリモートのローカル ブランチを指定するだけです (refspec の最後の部分は省略します)。

git pull test2 test2

チェックアウトされていないブランチへのプル

git pullは (前述のように) git fetchgit 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たローカル ブランチを意味します。特別なリモート名を使用して、ローカル リポジトリ内のローカル ブランチを参照できます。test2test2.

    • 他のブランチを「追跡」するローカル ブランチの目的は、入力するだけで簡単に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
于 2010-05-22T21:22:14.500 に答える
1

追跡されたブランチのリスト ( で確認できますgit config -l) とは別に、" 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..*
于 2010-05-22T07:30:21.850 に答える