Anda meminta saya untuk menarik tanpa memberi tahu saya cabang mana yang ingin Anda gabungkan

125

TL; DR: Saya memiliki cabang "terlacak" yang tidak dapat saya tarik.

Jadi, inilah saya di "bucket-4":

$ git branch -v
  bucket-1       410f7b5 * gh-53 * gh-48 * "Share App"
  bucket-2       7ed70a2 * upgrade to SOLR 3.3.0
  bucket-3       400ffe4 * emergency fix prod issue
* bucket-4       64c2414 Merge branch 'bucket-3' into bucket-4
  master         8dc4854 [ahead 1] * gh-73

Saya ingin menarik perubahan dari kendali jarak jauh saya:

$ git pull

You asked me to pull without telling me which branch you
want to merge with, and 'branch.bucket-4.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "bucket-4"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Hmm, aneh, saya pikir saya sudah menambahkan "bucket-4" sebagai cabang pelacakan. Ayo lihat:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:abcd/main.git
  Push  URL: [email protected]:abcd/main.git
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    bucket-3
    master
  Remote branches:
    bucket-1       tracked
    bucket-2       tracked
    bucket-3       tracked
    bucket-4       tracked
    master         tracked
  Local branches configured for 'git pull':
    bucket-1       merges with remote bucket-1
    bucket-2       merges with remote bucket-2
    bucket-3       merges with remote bucket-3
    master         merges with remote master
  Local refs configured for 'git push':
    bucket-1       pushes to bucket-1       (up to date)
    bucket-2       pushes to bucket-2       (up to date)
    bucket-3       pushes to bucket-3       (up to date)
    bucket-4       pushes to bucket-4       (local out of date)
    master         pushes to master         (fast-forwardable)

Memang, bucket-4 ditandai sebagai "dilacak", namun entah bagaimana itu dikonfigurasikan untuk push, tetapi tidak ditarik.

Melihat .git/configfile saya , saya melihat bahwa saya memiliki entri "jarak jauh" dan "menggabungkan" untuk sebagian besar cabang saya, tetapi tidak untuk bucket-4. Bagaimana itu bahkan dianggap "dilacak" tanpa ini?

[remote "origin"]
    url = [email protected]:abcd/main.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "rel-2011-07-07"]
    remote = origin
    merge = refs/heads/rel-2011-07-07
[branch "bucket-1"]
    remote = origin
    merge = refs/heads/bucket-1
[branch "bucket-2"]
    remote = origin
    merge = refs/heads/bucket-2
[branch]
    autosetupmerge = true
[branch "bucket-3"]
    remote = origin
    merge = refs/heads/bucket-3

Saya melihat bahwa kemungkinan solusi di sini adalah menambahkan remote/mergeentri untuk bucket-4 di file konfigurasi saya. Tetapi bagaimana itu dianggap "dilacak" tanpa ini? bucket-4 dibuat secara lokal, lalu didorong ke server dari repo ini, jadi saya curiga bahwa entah bagaimana saya tidak mengatur pelacakan dengan benar untuk cabang ini.

Apakah ada beberapa konfigurasi yang dapat saya tambahkan untuk membuat semua cabang lokal melacak remote mereka dengan benar di masa depan?

George Armhold
sumber
2
Pertanyaan ini mengarahkan saya ke arah yang benar, saya hanya perlu menambahkan entri dalam file .git / config saya untuk cabang yang saya coba tarik lalu berfungsi dengan baik.
Tn. Bungle
Yup saya juga, dan cara untuk melakukannya adalah seperti yang dijelaskan Mark Longair di bawah ini dengan cabang git --set-upstream bucket-4 origin / bucket-4
Jonathon Horsman

Jawaban:

191

Dikatakan bucket-4 pushes to bucket-4hanya karena default ketika mendorong cabang adalah mendorongnya ke cabang dengan nama yang cocok pada remote. (Perhatikan bahwa ini masih default, bahkan jika cabang lokal melacak cabang pelacakan jarak jauh dan cabang pelacakan jarak jauh terkait dengan cabang dengan nama berbeda di repositori jarak jauh.)

Cara paling sederhana untuk mengatur hubungan antara Anda bucket-4dan bucket-4di originadalah untuk memastikan bahwa saat berikutnya Anda mendorong, Anda melakukannya:

git push -u origin bucket-4

Atau, Anda dapat melakukan:

git branch --set-upstream-to origin/bucket-4

Untuk menjawab beberapa pertanyaan Anda secara langsung:

Bagaimana itu bahkan dianggap "dilacak" tanpa ini?

Dalam hal ini tidak - itu tidak melacak cabang pelacakan jarak jauh dalam arti jika tidak ada branch.bucket-4.mergeatau branch.bucket-4.remotedalam konfigurasi git Anda. Output dari git remote show originhanya menunjukkan Anda di mana cabang akan didorong secara default.

Apakah ada beberapa konfigurasi yang dapat saya tambahkan untuk membuat semua cabang lokal melacak remote mereka dengan benar di masa depan?

Saya kira tidak ada. Ketika Anda membuat bucket-4secara lokal, seperti yang saya asumsikan terjadi, cabang pelacak jarak jauh tidak ada, sehingga tidak dapat diatur pada saat itu - itu akan menjadi perilaku default yang sangat membingungkan. Anda hanya perlu ingat untuk menambahkan cabang -upertama Anda git pushke repositori hulu.

Saya harap itu bisa membantu.

Mark Longair
sumber
7
git branch --set-upstreambekerja dengan sempurna untuk saya sebelum melakukan tarikan
ohaal
cabang git --set-upstream bucket-4 asal / bucket-4 bekerja untuk saya :-)
Aliza
Bagaimana jika Anda tidak ingin mendorong? Saya memiliki masalah yang sama tetapi saya tidak ingin mendorong dari repo bahwa masalah ini terjadi. Saya baru saja mengganti asal remote dan saya ingin menarik KEPALA terbaru untuk cabang yang tampaknya tidak lagi dilacak (meskipun sudah dilacak sebelum saya beralih asal terpencil). Pada akhirnya saya menghapus klon yang bermasalah dan kembali kloning dari asal baru.
geoidesic
1
Sebenarnya ketika mencoba git --set-upstream <branch> origin/<branch>Anda mendapatkan kesalahan karena bendera sudah usang. Disarankan untuk menggunakan git branch --track origin/<branch>atau --set-upstream-tosebagai jawaban kedua disarankan. Saya kira jawabannya bisa diperbarui, @MarkLongair?
AymDev
Terima kasih atas sarannya, @AymDev - Saya telah membuat perubahan itu.
Mark Longair
6

git branch --set-upstream <branch> origin/<branch> sudah tidak digunakan lagi pada 1.8.2.3 (versi saya).

Gunakan git branch --set-upstream-to=origin/<branch> <branch>sebagai gantinya.

d_roge
sumber
2
Apakah Anda bermaksud agar ini menjadi komentar atas jawaban Markus ? Juga, itu sebenarnya sudah usang di Git versi 1.8.0 .