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
.
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.
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.
.
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".
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 clone
d 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".
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
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
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
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.