Saya baru saja mengamati sesuatu yang aneh git pull
, yang saya tidak mengerti.
Pada hari Jumat, saya bekerja di cabang setempat. sebut saja mybranch
. Sebelum meninggalkan kantor saya mendorongnya ke asal (yang saya github repo): git push origin mybranch
.
Kemarin di rumah, pull
saya mengubah cabang saya ke laptop saya, melakukan beberapa pengkodean lagi, dan kemudian mendorong perubahan saya kembali ke github (asal).
Sekarang saya bekerja lagi, dan mencoba menarik perubahan dari kemarin ke mesin kerja saya (saya tidak mengubah apa pun di repo lokal tempat kerja saya selama akhir pekan):
git pull origin mybranch
yang menyebabkan penggabungan maju cepat, dan itu tidak masalah. Saya kemudian melakukan git status
, dan dikatakan:
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
Hah? Bagaimana bisa 6 komitmen di depan ketika saya bahkan tidak menyentuhnya selama akhir pekan, DAN baru saja menarik dari asalnya? Jadi saya menjalankan a git diff origin/mybranch
dan perbedaannya persis dengan 6 perubahan yang baru saja saya tarik dari jarak jauh.
Saya hanya bisa "memperbaiki" ini dengan menjalankan git fetch origin
:
From [email protected]:me/project
af8be00..88b0738 mybranch -> origin/mybranch
Rupanya, repo lokal saya kehilangan beberapa objek referensi, tapi bagaimana bisa? Maksud saya, tarikan sudah mengambil, dan saya tidak mengerjakan apa pun kecuali cabang itu, jadi a git fetch origin
dan git fetch origin mybranch
harus memiliki hasil yang sama?
Haruskah saya selalu menggunakan git pull origin
bukan git pull origin branchname
?
Saya bingung.
sumber
git push
juga akan menyelesaikannya (melaporkan "semua terbaru").git config --get-regexp br.*
dapat memberi tahu Anda jika konfigurasi Anda memiliki cabang lokal yang melacak cabang laingit config branch.master.remote yourGitHubRepo.git
di workRepo Anda dan memeriksa (di berikutnyagit pull origin
) apakah status tetap dengan peringatan 'di depan'?git remote show origin
menunjukkan kepada saya bahwa titik asal menunjuk ke repositori GitHub saya, jadi itu tidak masalah, saya kira?Your branch is ahead
" pesan peringatan setelahgit pull
, Anda perlu pertama yang juga menentukan nama remote untuk cabang . Karenanya saran saya: ketikgit config branch.master.remote yourGitHubRepo.git
, lalu coba agit pull
dan agit status
dan lihat apakah masalahnya tetap ada.Jawaban:
git pull
panggilangit fetch
dengan parameter yang sesuai sebelum menggabungkan head yang diambil secara eksplisit (atau jika tidak ada cabang jarak jauh yang dikonfigurasi untuk digabungkan) ke dalam cabang saat ini.Sintaks: di
git fetch <repository> <ref>
mana<ref>
hanya nama cabang tanpa titik dua adalah pengambilan 'satu tembakan' yang tidak melakukan pengambilan standar dari semua cabang terlacak dari jarak jauh yang ditentukan tetapi hanya mengambil cabang bernama ke dalamFETCH_HEAD
.Pembaruan: untuk versi Git sejak 1.8.4, jika ada cabang pelacakan jarak jauh yang melacak referensi yang Anda minta untuk diambil, maka cabang pelacakan sekarang akan diperbarui oleh
fetch
. Perubahan ini telah dibuat secara khusus untuk menghindari kebingungan yang disebabkan oleh perilaku sebelumnya.Ketika Anda melakukan
git pull <repository> <ref>
,FETCH_HEAD
diperbarui seperti di atas, kemudian digabungkan ke dalam check out AndaHEAD
tetapi tidak ada cabang pelacakan standar untuk repositori jarak jauh yang akan diperbarui (Git <1.8.4). Ini berarti bahwa secara lokal sepertinya Anda lebih unggul dari cabang jarak jauh, padahal sebenarnya Anda sudah memperbaruinya.Secara pribadi saya selalu
git fetch
mengikutigit merge <remote>/<branch>
karena saya dapat melihat peringatan apa pun tentang pembaruan paksa sebelum saya menggabungkan, dan saya dapat melihat pratinjau apa yang saya gabungkan. Jika saya menggunakangit pull
sedikit lebih banyak daripada yang saya lakukan, saya akan melakukan polosgit pull
tanpa parameter paling banyak pada waktu, mengandalkanbranch.<branch>.remote
danbranch.<branch>.merge
'melakukan hal yang benar'.sumber
git fetch
setelahgit pull <repository> <ref>
memperbaiki masalah karena pengambilan akan memperbarui cabang pelacakan standar? Juga, terima kasih atas jawaban ini, mulai masuk akal :)git fetch
diikuti olehgit merge origin/master master
.Apa
git remote -v show
pengembalian ketika datang ke asal?Jika origin menunjuk ke github, statusnya harus up to date, dan tidak mendahului remote repo. Setidaknya, dengan Git1.6.5 yang saya gunakan untuk pengujian cepat.
Bagaimanapun, untuk menghindari ini, tentukan secara eksplisit repo jarak jauh dari cabang master:
lalu a
git pull origin master
, diikuti dengan agit status
harus mengembalikan status bersih (tidak di depan).Mengapa? karena master get fetch origin (termasuk dalam master git pull origin) tidak hanya akan memperbarui
FETCH_HEAD
(seperti yang dijelaskan Charles Bailey dalam jawabannya ), tetapi juga akan memperbarui "cabang master jarak jauh" dalam repositori Git lokal Anda.Dalam hal ini, master lokal Anda tampaknya tidak lagi berada "di depan" dari master jarak jauh.
Saya bisa mengujinya, dengan git1.6.5:
Pertama saya membuat workrepo:
Saya mensimulasikan repo GitHub dengan membuat repo telanjang (yang dapat menerima push dari mana saja)
Saya menambahkan modif ke repo kerja saya, yang saya dorong ke repo github (ditambahkan sebagai remote)
Saya membuat repo rumah, kloning dari GitHub, di mana saya membuat beberapa modifikasi, didorong ke GitHub:
Saya kemudian menggandakan workrepo untuk percobaan pertama
Dalam repo itu, status git menyebutkan master geing sebelum '
origin
':Tapi itu
origin
bukan github:Tetapi jika saya mengulangi urutan dalam repo yang memiliki asal ke github (atau tidak ada asal sama sekali, hanya 'github' jarak jauh yang ditentukan), statusnya bersih:
Jika saya hanya
origin
menunjukgithub
,status
akan bersih untuk git1.6.5.Ini mungkin dengan peringatan 'di depan' untuk git sebelumnya, tetapi bagaimanapun, sebuah
git config branch.master.remote yourGitHubRepo.git
definisi secara eksplisit harus dapat menangani itu, bahkan dengan versi awal Git.sumber
git remote show origin
.Apakah Anda berhati-hati untuk menambahkan semua remote Anda (kecuali
origin
yang disertakan dengan klon asli Anda) menggunakangit remote add NAME URL
? Saya telah melihat bug ini ketika mereka baru saja ditambahkan ke konfigurasi git.sumber
git checkout -b mybranch origin/mybranch
. Menurut halaman manual git-branch, origin / mybranch adalah titik awal, dan selanjutnya, menyatakan untuk --track: "... Gunakan ini jika Anda selalu menarik dari cabang upstream yang sama ke cabang baru, dan jika Anda tidak ingin menggunakan "git pull <repository> <refspec>" secara eksplisit. Perilaku ini adalah default ketika titik awal adalah cabang jarak jauh. "