2

私はこれを持っています

    abc@abc-ubuntu:~/project1/wh-app-ios$ git branch -a -v -v
    * master                   1d35af1 [origin/master: ahead 2] Adding 123 to hello
      remotes/gitb/gh-pages    e3dad9d boom
      remotes/gitb/integration 1d3fcd5 Adding 55_Glossary chapter
      remotes/gitb/master      86d1d30 Merge remote-tracking branch 'origin/master'
      remotes/gitb/pt_BR       dc9d991 Revisions at 03, 07, 08, 09, 10, 11 and 50
      remotes/origin/HEAD      -> origin/master
      remotes/origin/master    1ae426b Update README.md

そうです

    abc@abc-ubuntu:~/project1/wh-app-ios$ git checkout gitb/master
    Note: checking out 'gitb/master'.

    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.

    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:

      git checkout -b new_branch_name

    HEAD is now at 86d1d30... Merge remote-tracking branch 'origin/master'

次に、上記の警告メッセージを見て、私はそうします

    abc@abc-ubuntu:~/project1/wh-app-ios$ git checkout -b mastergitb
    Switched to a new branch 'mastergitb'

今、私は

    abc@abc-ubuntu:~/project1/wh-app-ios$ git branch -a -v -v
      master                   1d35af1 [origin/master: ahead 2] Adding 123 to hello
    * mastergitb               86d1d30 Merge remote-tracking branch 'origin/master'
      remotes/gitb/gh-pages    e3dad9d boom
      remotes/gitb/integration 1d3fcd5 Adding 55_Glossary chapter
      remotes/gitb/master      86d1d30 Merge remote-tracking branch 'origin/master'
      remotes/gitb/pt_BR       dc9d991 Revisions at 03, 07, 08, 09, 10, 11 and 50
      remotes/origin/HEAD      -> origin/master
      remotes/origin/master    1ae426b Update README.md
    abc@abc-ubuntu:~/project1/wh-app-ios$ 

質問:

  1. しかし、明らかに mastergitb は gitb/master を追跡していません。何故ですか ?

  2. mastergitb という名前のローカル ブランチを作成しましたが、これは単に gitb/master のコピーですが、他の関係はありません。

4

2 に答える 2

8

メッセージがこれを参照していない理由はわかりませんが、書くことができます

git checkout -t origin/branchname

という名前のローカル ブランチを作成しbranchnameますorigin/branchname(-tは の略です--track)。または、あなたが書くことができます

git checkout -b localname -t origin/branchname

localnamethat trackという名前のローカル ブランチを作成するorigin/branchnameには、例では次のようにします。

git checkout -b mastergitb -t gitb/master

はい、非追跡ブランチの作成はまさにあなたが行ったことです。ブランチを削除してこれらの手順に従うか、実行git branch --set-upstream mastergitb gitb/masterして既存のブランチのアップストリームを設定することで修正できます。

于 2013-09-01T04:07:36.173 に答える
5

「リモート ブランチ」には、git が呼ぶところの「ローカル」ブランチとは非常に異なる独特の特徴があります。git が別の名前を使用した方が人々にとってより意味があるのではないかと思うことがありますが、実際にはより良い名前はありません。したがって、質問2に関して:

mastergitb単なるコピーであるgitb/masterが、それとは他の関係がないという名前のローカルブランチを作成しましたか?

はい。しかし、「のコピー」という表現は少し誤解を招きます。代わりに、リモートブランチと同じコミットで終了するローカル ブランチを作成したとします。

git ブランチについて覚えておくべきことは、各ブランチ名はcommit のラベルに過ぎないということです。ローカル ブランチ名を特に特別な (そして便利な) ものにしているのは、それが移動ラベルであり、自動的に移動することです。(特定のコミットのラベルでもある「タグ」と比較してください。ただし、タグは自動的に移動しません。また、人々は一般的にタグがそのままであると期待しています。鬼ごっこ。)

誰かが指摘したように、「切り離されたHEAD」とは対照的に、「ブランチ上」にいる場合、これは一種の恐ろしいことです。新しいコミットを行うと、ブランチラベルは自動的に新しいコミットに移動します。つまり、 がbranchのHEAD名前である場合(およびコミットを追加するその他のさまざまな方法) は、親が前のブランチ チップを指している新しいコミットを追加し、次にブランチ チップを前方に移動します。brangit commitgit merge

C5 -- C6 -- C7   <-- HEAD=bran

になります:

C5 -- C6 -- C7 -- C8   <-- HEAD=bran

しかし、「リモート ブランチ」はこのようには機能しません。実際、あなたが発見したように、リモート ブランチ上にいることさえできませんgit checkout origin/master

しかし、もう 1 つの面白い点は、「リモート ブランチ」が move できることです。それらを「オン」にすることはないため、コミット追加しても移動しません。あなたはそれらをチェックアウトし、あなたの頭はすぐにギロチンにかけられます. :-) これでgit checkout -b、先ほどと同じように を使用してローカル ブランチを作成できます。このローカル ブランチは、その名前のコミットを指すように設定されHEADます。これは、「リモート ブランチ名」が指すコミットと同じです。コミットを指す矢印にすぎないため、何かのコピーではありません。

ダイアグラム形式では、次のようになります ( master「追跡」しているローカルにいると仮定しますorigin/master)。

       C2        <-- origin/xyz
      /
C0--C1           <-- origin/foo
      \
       C3--C4    <-- origin/bar
         \
          C5     <-- origin/master, HEAD=master

の場合git checkout origin/foo、git は をHEAD=下から消去し (残しorigin/mastermaster両方とも commit を指していC5ます)、 commitHEADの SHA-1 ハッシュに設定しC1ます。これは設定されませんHEAD=origin/foo(リモート ブランチに「オン」になります) が、コミット ハッシュ (「デタッチされたヘッド」状態) に直接設定されます。

次に、git checkout -b localfoogit は新しいブランチ名を作成し、localfooそれを commit を指すように設定しC1、 を設定しますHEAD=localfoo。今、あなたは「枝の上」にいます!

注: ローカル ブランチの「完全な名前」branは. リモート ブランチの「完全な名前」は. つまり、ローカル ブランチは常に にあり、リモート ブランチは決してありません。通常、すべてのフロントエンドのものを省略して および を参照するだけですが、場合によっては重要であり、以下のテキストの一部がより意味のあるものになります。refs/heads/branrmt/branrefs/remotes/rmt/branrefs/heads/branorigin/bran

localfoo「トラック」を作成すること以外にorigin/foo(既に回答済み)、説明する項目がもう 1 つあります。それは、「リモート ブランチ」はどのように移動するのかということです。答え: 彼らはgit fetch(またはgit remote update基本的に と同じfetch) に移動します。リモートから取得 (または更新) すると、git はリモートに接続し、そのブランチ名を見つけます。これらの名前を使用して、それらが指すコミットを見つけます。次に、それらの親、およびその親の親などを見つけます。それらのコミットがないときはいつでも、それらを持ってきてレポに詰め込むので、リモートに「追いつく」ことができます。次に、ファイルによって制御されるように、「リモート ブランチ」カテゴリの下に新しい参照名を書き込み.git/configます。

のぞいて.git/configみると、次のようなものが表示されます。

[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = ssh://some.where.out.there/some/path/to/repo.git

そのfetch行は、「リモートブランチ」を取得するための鍵です。これは、リモートが持っている一致するすべてのブランチ (refs/heads/*すべてのローカルrefs/heads/ブランチ)を(残りのブランチ名を保持して)に置き換えてから、それらの参照を (符号refs/remotes/origin/のために強制的に) 更新することを示しています。+したがって、リモート URL を制御している誰かがそのレポを更新し、次にあなたfetchがそれらから更新を取得した後、あなたの git はあなたの「リモート ブランチ」ラベルを一致するように移動します。

自動的に移動された「リモート ブランチ」ラベルと一致するようにローカルブランチ ラベルを移動するかどうか、またいつ移動するかはユーザー次第です。これを行う簡単な方法は「git merge」を使用することであり、それを自動化する簡単な方法は、ローカル ブランチを「追跡ブランチ」にすることです。ローカル ブランチLをリモート ブランチrmt/Rを追跡するものとしてマークgit statusすると、遅れているかどうかが通知され、git pullを呼び出す方法がわかり、自動更新するように指示されます ( git-merge ドキュメントの CONFIGURATION セクションを参照)。 )。git mergegit mergemerge.defaultToUpstream

于 2013-09-01T09:38:01.390 に答える