TL; Versi DR: cabang pelacak jarak jauh origin/master
dulu ada, tetapi tidak sekarang, jadi cabang lokal source
melacak sesuatu yang tidak ada, yang paling mencurigakan — artinya fitur Git yang berbeda tidak dapat melakukan apa pun untuk Anda — dan Git memperingatkan Anda tentang hal itu. Anda baik-baik saja tanpa memiliki fitur "pelacakan hulu" berfungsi sebagaimana dimaksud, jadi terserah Anda apakah akan mengubah apa pun.
Untuk pengambilan pengaturan upstream lainnya, lihat Mengapa saya harus "git push --set-upstream origin <branch>"?
Peringatan ini adalah hal baru di Git, muncul pertama kali di Git 1.8.5. Catatan rilis berisi hanya satu butir-butir singkat tentang hal itu:
- "git branch -v -v" (dan "git status") tidak membedakan antara cabang yang tidak berdasarkan cabang lain, cabang yang disinkronkan dengan cabang hulu, dan cabang yang dikonfigurasi dengan hulu cabang yang sudah tidak ada.
Untuk menggambarkan apa artinya, pertama-tama Anda perlu tahu tentang "remote", "cabang pelacak jarak jauh", dan bagaimana Git menangani "melacak upstream". ( Cabang pelacak jarak jauh adalah istilah yang sangat cacat — saya sudah mulai menggunakan nama pelacak jarak jauh , yang menurut saya sedikit perbaikan. Namun, di bawah ini, saya akan menggunakan "cabang pelacak jarak jauh" untuk konsistensi dengan dokumentasi Git. )
Setiap "remote" hanyalah sebuah nama, seperti origin
atau octopress
dalam hal ini. Tujuannya adalah untuk merekam hal-hal seperti URL lengkap tempat tempat Anda git fetch
atau git pull
pembaruan. Ketika Anda menggunakan 1 Git pergi ke remote itu (menggunakan URL yang disimpan) dan membawa set pembaruan yang sesuai. Itu juga mencatat pembaruan, menggunakan "cabang pelacakan jarak jauh".git fetch remote,
"Cabang pelacak jarak jauh" (atau nama pelacak jarak jauh) hanyalah rekaman nama cabang yang terakhir dilihat pada "jarak jauh". Setiap remote itu sendiri adalah repositori Git, sehingga ia memiliki cabang. Cabang-cabang di "asal" jauh direkam di repositori lokal Anda di bawah remotes/origin/
. Teks yang Anda menunjukkan mengatakan bahwa ada cabang bernama source
pada origin
, dan cabang bernama 2.1
, linklog
dan sebagainya pada octopress
.
(Cabang "normal" atau "lokal", tentu saja, hanya nama cabang yang telah Anda buat di repositori Anda sendiri.)
Terakhir, Anda dapat mengatur cabang (lokal) untuk "melacak" cabang "pelacakan jarak jauh". Setelah cabang lokal L
diatur untuk melacak cabang pelacakan jarak jauh R
, Git akan memanggil R
"upstream" dan memberi tahu Anda apakah Anda "maju" dan / atau "belakang" upstream (dalam hal komitmen). Itu normal (bahkan direkomendasikan-mampu) untuk cabang lokal dan cabang pelacakan jarak jauh untuk menggunakan nama yang sama (kecuali untuk bagian awalan jarak jauh), suka source
dan origin/source
, tapi itu sebenarnya tidak perlu.
Dan dalam hal ini, itu tidak terjadi. Anda memiliki cabang lokal yang source
melacak cabang pelacakan jarak jauh origin/master
.
Anda seharusnya tidak perlu mengetahui mekanisme yang tepat tentang bagaimana Git mengatur cabang lokal untuk melacak yang jauh, tetapi mereka relevan di bawah ini, jadi saya akan menunjukkan cara kerjanya. Kami mulai dengan nama cabang lokal Anda source
,. Ada dua entri konfigurasi menggunakan nama ini, dieja branch.source.remote
dan branch.source.merge
. Dari output yang Anda tunjukkan, jelas bahwa keduanya diatur, sehingga Anda akan melihat yang berikut jika Anda menjalankan perintah yang diberikan:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
Jika disatukan, 2 ini memberi tahu Git bahwa cabang source
Anda melacak "cabang pelacak jarak jauh" Anda origin/master
,.
Tapi sekarang lihat output git branch -a
, yang menampilkan semua nama cabang lokal dan pelacakan jarak jauh di repositori Anda. Nama pelacak jarak jauh tercantum di bawah remotes/
... dan tidak adaremotes/origin/master
. Mungkin ada, pada suatu waktu, tetapi sekarang sudah hilang.
Git memberi tahu Anda bahwa Anda dapat menghapus informasi pelacakan --unset-upstream
. Ini akan menghapus keduanya branch.source.origin
dan branch.source.merge
, dan menghentikan peringatan.
Tampaknya cukup mungkin bahwa apa yang Anda inginkan adalah beralih dari pelacakan origin/master
, ke pelacakan sesuatu yang lain: mungkin origin/source
, tetapi mungkin salah satu octopress/
nama.
Anda dapat melakukan ini dengan git branch --set-upstream-to
, 3 misalnya:
$ git branch --set-upstream-to=origin/source
(dengan asumsi Anda masih di "sumber" cabang, dan itu origin/source
adalah hulu yang Anda inginkan — tidak ada cara bagi saya untuk mengatakan yang mana, jika ada, Anda benar-benar menginginkannya).
(Lihat juga Bagaimana Anda membuat cabang Git yang ada melacak cabang jarak jauh? )
Saya pikir cara Anda sampai di sini adalah ketika Anda pertama kali melakukan git clone
, hal yang Anda kloning-dari memiliki cabang master
. Anda juga memiliki cabang master
, yang disetel untuk dilacak origin/master
(ini adalah pengaturan standar normal untuk git). Ini berarti Anda memiliki branch.master.remote
dan branch.master.merge
mengatur, ke origin
dan refs/heads/master
. Tetapi kemudian origin
remote Anda mengubah namanya dari master
menjadi source
. Untuk mencocokkan, saya yakin Anda juga mengubah nama lokal Anda dari master
menjadi source
. Ini mengubah nama pengaturan Anda, dari branch.master.remote
ke branch.source.remote
dan dari branch.master.merge
ke branch.source.merge
... tetapi meninggalkan yang lama nilai-nilai , sehingga branch.source.merge
sekarang salah.
Pada titik inilah tautan "hulu" rusak, tetapi dalam versi Git yang lebih tua dari 1.8.5, Git tidak pernah memperhatikan pengaturan yang rusak. Sekarang Anda memiliki 1.8.5, ini menunjukkan ini.
Itu mencakup sebagian besar pertanyaan, tetapi bukan yang "harus saya perbaiki". Kemungkinan Anda telah bekerja di sekitar kehancuran selama bertahun-tahun sekarang, dengan melakukan (misalnya, ). Jika Anda terus melakukan itu, itu akan terus mengatasi masalah — jadi, tidak, Anda tidak perlu memperbaikinya. Jika Anda suka, Anda dapat menggunakan untuk menghapus hulu dan menghentikan keluhan, dan tidak memiliki cabang lokal ditandai sebagai memiliki setiap hulu sama sekali.git pull remote branch
git pull origin source
--unset-upstream
source
Maksud dari memiliki upstream adalah untuk membuat berbagai operasi lebih nyaman. Misalnya, git fetch
diikuti oleh git merge
umumnya akan "melakukan hal yang benar" jika upstream diatur dengan benar, dan git status
setelah git fetch
akan memberi tahu Anda apakah repo Anda cocok dengan yang upstream, untuk cabang itu.
Jika Anda menginginkan kenyamanan, atur ulang hulu.
1git pull
menggunakan git fetch
, dan pada Git 1.8.4, ini (akhirnya!) Juga memperbarui informasi "cabang pelacakan jarak jauh". Dalam versi Git yang lebih lama, pembaruan tidak direkam di cabang pelacakan jarak jauh git pull
, hanya dengan git fetch
. Karena Git Anda harus setidaknya versi 1.8.5 ini bukan masalah bagi Anda.
2 Nah, ini ditambah garis konfigurasi saya sengaja mengabaikan yang ditemukan di bawah remote.origin.fetch
. Git harus memetakan nama "gabungan" untuk mengetahui bahwa nama lokal lengkap untuk cabang jarak jauh adalah refs/remotes/origin/master
. Pemetaan hampir selalu berfungsi seperti ini, jadi bisa diprediksi master
masuk ke situ origin/master
.
3 Atau, dengan git config
. Jika Anda hanya ingin mengatur upstream ke origin/source
satu-satunya bagian yang harus diubah adalah branch.source.merge
, dan git config branch.source.merge refs/heads/source
akan melakukannya. Tetapi --set-upstream-to
katakan apa yang ingin Anda lakukan, daripada membuat Anda melakukannya sendiri secara manual, jadi itu "cara yang lebih baik".