pengembangan-web-mp-pd.com

Mengapa memanggil cabang git --unset-upstream untuk memperbaiki?

Saya lebih pemula dalam hal operasi lanjutan di git. Saya memelihara blog menggunakan kerangka blogging Octopress . Meskipun Octopress tidak dalam pengembangan sejak 2011, itu melayani tujuan saya dengan baik dan jadi saya belum memikirkan mengubah apa pun sejauh ini.

FYI, blog saya di-host di Halaman Github. 

Hari ini, saat mengerjakan sebuah posting baru, git status menunjukkan pesan berikut:

On branch source
Your branch is based on 'Origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Pesan yang sama diulang untuk semua perintah selanjutnya seperti git add ., git commit -m 'message' dan git Push Origin source

  • Apa pesannya? 
  • Apakah ada yang rusak? 
  • Jika ya, apa? 
  • Apakah saya perlu memperbaikinya? 

Jika memungkinkan, tolong tunjukkan saya ke artikel pdf/web di mana saya bisa membaca ini dan memahaminya untuk masa depan.

Keterangan lebih lanjut:

bash-3.2$ git branch -a
* source
  remotes/octopress/2.1
  remotes/octopress/HEAD -> octopress/master
  remotes/octopress/gh-pages
  remotes/octopress/linklog
  remotes/octopress/master
  remotes/octopress/refactor_with_tests
  remotes/octopress/rubygemcli
  remotes/octopress/site
  remotes/Origin/source

Harap beri tahu saya jika diperlukan informasi lebih lanjut. Terima kasih.

122
Jatin Ganhotra

TL; Versi DR: cabang pelacak jarak jauh Origin/master dulunya ada, tetapi tidak sekarang, jadi cabang lokal source sedang melacak sesuatu yang tidak ada, yang paling mencurigakan - itu artinya fitur Git yang berbeda tidak dapat melakukan apa pun untuk Anda —Dan Git memperingatkanmu tentang hal itu. Anda baik-baik saja tanpa memiliki fitur "pelacakan hulu" berfungsi sebagaimana dimaksud, jadi terserah Anda apakah akan mengubah apa pun.

Untuk pengaturan 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 ada di sinkronkan dengan cabang hulu, dan cabang yang dikonfigurasi dengan cabang hulu yang sudah tidak ada lagi.

Untuk menjelaskan apa artinya, pertama-tama Anda perlu tahu tentang "remote", "cabang pelacak jarak jauh", dan bagaimana Git menangani "melacak upstream". (Cabang pelacakan jarak jauh adalah istilah yang sangat cacat — saya sudah mulai menggunakan nama-nama pelacakan jarak jauh sebagai gantinya, yang menurut saya sedikit perbaikan. Namun, di bawah ini, saya akan menggunakan "cabang pelacakan jarak jauh" untuk konsistensi dengan dokumentasi Git.)

Setiap "jarak jauh" hanyalah sebuah nama, seperti Origin atau octopress dalam kasus ini. Tujuannya adalah untuk merekam hal-hal seperti URL lengkap tempat tempat Anda git fetch atau git pull diperbarui. Saat Anda menggunakan git fetch remote,1 Git pergi ke remote itu (menggunakan URL yang disimpan) dan membawa set pembaruan yang sesuai. Ini juga mencatat pembaruan, menggunakan "cabang pelacak jarak jauh". 

"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 pada "Asal" jarak jauh direkam di repositori lokal Anda di bawah remotes/Origin/. Teks yang Anda perlihatkan mengatakan bahwa ada cabang bernama source di Origin, dan cabang-cabang bernama 2.1, linklog, dan seterusnya 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". Begitu cabang lokal L diatur untuk melacak cabang pelacak jarak jauh R, Git akan memanggil R dengan "upstream" dan memberi tahu Anda apakah Anda "maju" dan/atau "di belakang" hulu (dalam hal komitmen). Adalah normal (bahkan direkomendasikan untuk) cabang lokal dan cabang pelacakan jarak jauh untuk menggunakan nama yang sama (kecuali untuk bagian awalan jarak jauh), seperti source dan Origin/source, tetapi itu sebenarnya tidak perlu.

Dan dalam hal ini, itu tidak terjadi. Anda memiliki cabang lokal source yang melacak cabang pelacakan jarak jauh Origin/master.

Anda seharusnya tidak perlu tahu mekanika yang tepat dari bagaimana Git membuat cabang lokal untuk melacak yang jauh, tetapi mereka relevan di bawah, jadi saya akan menunjukkan bagaimana ini bekerja. Kami mulai dengan nama cabang lokal Anda, source. Ada dua entri konfigurasi yang 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

Menyatukan ini,2 ini memberi tahu Git bahwa source cabang Anda melacak "cabang pelacak jarak jauh" Anda, Origin/master.

Tapi sekarang lihat output dari git branch -a, yang menunjukkan semua nama cabang lokal dan pelacakan jarak jauh di repositori Anda. Nama-nama pelacak jarak jauh terdaftar di bawah remotes/ ... dan tidak ada remotes/Origin/master. Mungkin ada, pada suatu waktu, tetapi sekarang sudah hilang.

Git memberi tahu Anda bahwa Anda dapat menghapus informasi pelacakan dengan --unset-upstream. Ini akan menghapus branch.source.Origin dan branch.source.merge, dan menghentikan peringatan.

Tampaknya cukup mungkin bahwa apa yang Anda inginkan adalah beralih dari pelacakan Origin/master, untuk melacak sesuatu yang lain: mungkin Origin/source, tetapi mungkin salah satu nama octopress/.

Anda dapat melakukan ini dengan git branch --set-upstream-to,3 misalnya.:

$ git branch --set-upstream-to=Origin/source

(dengan asumsi Anda masih menggunakan "sumber" cabang, dan Origin/source itu 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 melacak Origin/master (ini adalah pengaturan standar normal untuk git). Ini berarti Anda telah mengatur branch.master.remote dan branch.master.merge, menjadi Origin dan refs/heads/master. Tetapi kemudian remote Origin Anda mengubah namanya dari master menjadi source. Untuk mencocokkan, saya percaya Anda juga mengubah nama lokal Anda dari master menjadi source. Ini mengubah nama dari pengaturan Anda, dari branch.master.remote menjadi branch.source.remote dan dari branch.master.merge menjadi branch.source.merge ... tetapi meninggalkan nilaiyang lama, jadi 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 mengatasi masalah ini selama bertahun-tahun sekarang, dengan melakukan git pull remote branch (mis., git pull Origin source). Jika Anda terus melakukan itu, itu akan terus mengatasi masalah — jadi, tidak, Anda tidak perlu untuk memperbaikinya. Jika Anda suka, Anda dapat menggunakan --unset-upstream untuk menghapus upstream dan menghentikan keluhan, dan tidak memiliki cabang lokal source ditandai memiliki ada upstream sama sekali.

Maksud dari memiliki upstream adalah untuk membuat berbagai operasi lebih nyaman. Sebagai contoh, git fetch diikuti oleh git merge umumnya akan "melakukan hal yang benar" jika upstream diatur dengan benar, dan git status setelah git fetch setelah Anda mengatakan apakah repo Anda cocok dengan hulu, untuk cabang itu.

Jika Anda menginginkan kenyamanan, atur ulang hulu.

.


git 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 dengan git pull, hanya dengan git fetch. Karena Git Anda harus paling tidak versi 1.8.5 ini bukan masalah bagi Anda..

Nah, ini ditambah garis konfigurasi yang sengaja saya abaikan 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 dapat diprediksi bahwa master pergi ke Origin/master..

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 mengatakan apa Anda ingin dilakukan, daripada membuat Anda melakukannya sendiri secara manual, jadi itu "cara yang lebih baik".

165
torek

jawaban torek mungkin sempurna, tetapi saya hanya ingin agar catatan menyebutkan kasus lain yang berbeda dari yang dijelaskan dalam pertanyaan asli tetapi kesalahan yang sama mungkin muncul (karena dapat membantu orang lain dengan masalah yang sama):

Saya telah membuat repo kosong (baru) menggunakan git init --bare pada salah satu server saya. Lalu saya punya git cloned ke ruang kerja lokal di PC saya.

Setelah melakukan satu versi pada repo lokal saya mendapatkan kesalahan itu setelah memanggil git status

Mengikuti jawaban torek, saya mengerti bahwa yang terjadi adalah bahwa komit pertama pada repo direktori kerja lokal membuat cabang "master". Tetapi pada repo jarak jauh (pada server) tidak pernah ada apa-apa, jadi bahkan tidak ada cabang "master" (remote/Origin/master). 

Setelah menjalankan git Push Origin master dari repo lokal repo jarak jauh akhirnya memiliki cabang master. Ini menghentikan kesalahan muncul.

Jadi untuk menyimpulkan - orang mungkin mendapatkan kesalahan seperti itu untuk repo jarak jauh baru yang baru dengan nol komit karena tidak memiliki cabang, termasuk "master".

138
ElazarR

Ini bisa menyelesaikan masalah Anda.

setelah melakukan perubahan, Anda dapat mengkomitnya lalu 

git remote add Origin https://(address of your repo) it can be https or ssh
then
git Push -u Origin master

semoga ini berhasil untuk Anda.

terima kasih

7
Ajay Kotnala

Bagi saya, .git/refs/Origin/master telah rusak.

Saya melakukan yang berikut, yang memperbaiki masalah bagi saya.

rm .git/refs/remotes/Origin/master
git fetch
git branch --set-upstream-to=Origin/master
7
smremde

Saya punya pertanyaan ini dua kali, dan itu selalu disebabkan oleh korupsi file cache git di cabang lokal saya. Saya memperbaikinya dengan menulis hash komit yang hilang ke file itu. Saya mendapat hash komit yang tepat dari server dan menjalankan perintah berikut secara lokal:

cat .git/refs/remotes/Origin/feature/mybranch \
echo 1edf9668426de67ab764af138a98342787dc87fe \
>> .git/refs/remotes/Origin/feature/mybranch
0
user1106400

Sebenarnya torek sudah memberi tahu Anda cara menggunakan alat-alat ini jauh lebih baik daripada yang bisa saya lakukan. Namun, dalam hal ini saya pikir penting untuk menunjukkan sesuatu yang aneh jika Anda mengikuti pedoman di http://octopress.org/docs/deploying/github/ . Yaitu, Anda akan memiliki multiple repositori github di pengaturan Anda. Pertama-tama satu dengan semua kode sumber untuk situs web Anda di katakan direktori $WEBSITE, dan kemudian yang hanya dengan file statis yang dihasilkan berada di $WEBSITE/_deploy. Yang lucu dari pengaturan adalah bahwa ada file .gitignore di direktori $WEBSITE sehingga pengaturan ini benar-benar berfungsi.

Pengantar yang cukup. Dalam hal ini kesalahan mungkin juga berasal dari repositori di _deploy.

cd _deploy

git branch -a
* master
remotes/Origin/master
remotes/Origin/source

Dalam .git/config Anda biasanya perlu menemukan sesuatu seperti ini:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "Origin"]
    url = [email protected]:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/Origin/*
[branch "master"]
    remote = Origin
    merge = refs/heads/master

Tetapi dalam kasus Anda master cabang tidak memiliki remote.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "Origin"]
    url = [email protected]:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/Origin/*

Yang dapat Anda atasi dengan:

cd _deploy
git branch --set-upstream-to=Origin/master

Jadi, semuanya seperti yang dikatakan torek kepada Anda, tetapi mungkin penting untuk menunjukkan bahwa ini mungkin lebih berkaitan dengan direktori _deploy daripada akar situs web Anda.

PS: Mungkin layak menggunakan Shell seperti zsh dengan plugin git untuk tidak digigit oleh hal ini di masa depan. Ini akan segera menunjukkan bahwa _deploy berkaitan dengan repositori yang berbeda.

0
Anne van Rossum