Saya telah menyiapkan beberapa cabang pelacakan jarak jauh di git, tetapi sepertinya saya tidak pernah dapat menggabungkannya ke cabang lokal setelah saya memperbaruinya dengan 'git fetch'.
Misalnya, saya memiliki cabang jarak jauh yang disebut 'an-other-branch'. Saya mengaturnya secara lokal sebagai cabang pelacakan menggunakan
git branch --track an-other-branch origin/an-other-branch
Sejauh ini baik. Tetapi jika cabang itu diperbarui (biasanya oleh saya memindahkan mesin dan melakukan dari mesin itu), dan saya ingin memperbaruinya di mesin asli, saya mengalami masalah dengan fetch / merge:
git fetch origin an-other-branch
git merge origin/an-other-branch
Setiap kali saya melakukan ini, saya mendapatkan pesan 'Sudah up-to-date' dan tidak ada yang bergabung.
Namun, a
git pull origin an-other-branch
selalu perbarui seperti yang Anda harapkan.
Juga, menjalankan git diff
git diff origin/an-other-branch
menunjukkan bahwa ada perbedaan, jadi menurut saya sintaks saya salah.
Apa yang saya lakukan salah?
EDIT [2010-04-09]: Saya telah memeriksa beberapa kali, dan saya jelas tidak berada di cabang yang berbeda. Haruskah 'git fetch' saya yang diikuti dengan 'git merge' (seperti yang ditunjukkan di atas) harus melakukan hal yang sama persis dengan git pull? Saya akan mendapatkan beberapa alur kerja yang menunjukkan hasil dari status git dll.
git fetch origin an-other-branch
menyimpan tip yang diambilFETCH_HEAD
, tetapi tidakorigin/an-other-branch
(yaitu 'cabang pelacakan jarak jauh' biasa). Jadi, seseorang dapat melakukannyagit fetch origin an-other-branch && git merge FETCH_HEAD
, tetapi melakukannya seperti yang dikatakan @Gareth lebih baik (atau cukup gunakan git pull ).git merge origin/an-other-branch
bergabungorigin/an-other-branch
ke semua cabang lokal yang diatur untuk melacaknya? bagaimana cara menggabungkan menjadi hanya satu cabang lokal?git pull
(tanpa argumen) lakukan - cabang mana yang digabungkan? Apakah itu menggabungkan cabang pelacakan jarak jauh yang sesuai dengan cabang saat ini ?Memilih hanya satu cabang:
fetch
/merge
vs.pull
Orang sering menyarankan Anda untuk memisahkan "pengambilan" dari "penggabungan". Mereka malah mengatakan:
melakukan hal ini:
Apa yang tidak mereka sebutkan adalah bahwa perintah fetch seperti itu sebenarnya akan mengambil semua cabang dari repo jarak jauh, yang bukan merupakan fungsi dari perintah pull itu. Jika Anda memiliki ribuan cabang di repo jarak jauh, tetapi Anda tidak ingin melihat semuanya, Anda dapat menjalankan perintah yang tidak jelas ini:
Tentu saja, itu sangat sulit untuk diingat, jadi jika Anda benar-benar ingin menghindari pengambilan semua cabang, lebih baik mengubah Anda
.git/config
seperti yang dijelaskan di ProGit.Hah?
Penjelasan terbaik dari semua ini ada di Bab 9-5 dari ProGit, Git Internals - The Refspec ( atau via github ). Itu sangat sulit ditemukan melalui Google.
Pertama, kita perlu memperjelas beberapa terminologi. Untuk pelacakan cabang jarak jauh, biasanya ada 3 cabang berbeda yang harus diperhatikan:
refs/heads/branchB
di dalam repo lainnyarefs/remotes/remoteR/branchB
di repo Andarefs/heads/branchB
di dalam repo AndaCabang pelacakan jarak jauh (dalam
refs/remotes
) bersifat hanya baca. Anda tidak mengubahnya secara langsung. Anda mengubah cabang Anda sendiri, dan kemudian Anda mendorong ke cabang yang sesuai di repo jarak jauh. Hasilnya tidak tercermin dalam Andarefs/remotes
sampai setelah penarikan atau pengambilan yang sesuai. Perbedaan itu sulit bagi saya untuk memahami dari halaman manual git, terutama karena cabang lokal (refs/heads/branchB
) dikatakan "melacak" cabang pelacakan jarak jauh saat.git/config
mendefinisikanbranch.branchB.remote = remoteR
.Pikirkan 'refs' sebagai petunjuk C ++. Secara fisik, mereka adalah file yang berisi SHA-digest, tetapi pada dasarnya mereka hanyalah penunjuk ke dalam pohon komit.
git fetch
akan menambahkan banyak node ke commit-tree Anda, tetapi bagaimana git memutuskan pointer apa yang akan dipindahkan agak rumit.Seperti yang disebutkan dalam jawaban lain , keduanya juga tidak
maupun
akan bergerak
refs/remotes/branches/branchB
, dan yang terakhir pasti tidak bisa bergerakrefs/heads/branchB
. Namun, keduanya bergerakFETCH_HEAD
. (Anda dapatcat
salah satu dari file-file ini di dalam.git/
untuk melihat kapan mereka berubah.) Dangit merge
akan merujuk keFETCH_HEAD
, saat mengaturMERGE_ORIG
, dll.sumber
Apakah Anda yakin Anda berada di lokal
an-other-branch
saat Anda menggabungkan?The penjelasan lain :
Tetapi dalam kasus Anda, jika
git pull
berhasil, itu berarti Anda tidak berada di cabang yang benar.sumber
Git pull sebenarnya adalah alat kombo: ia menjalankan git fetch (mendapatkan perubahan) dan git merge (menggabungkannya dengan salinan Anda saat ini)
Apakah Anda yakin Anda berada di cabang yang benar?
sumber
ini adalah perintahnya:
jika Anda melakukan ini di baris kedua:
itu akan mencoba untuk menggabungkan master lokal ke dalam cabang Anda saat ini.
Pertanyaannya, seperti yang saya pahami, apakah Anda sudah diambil secara lokal dan sekarang ingin menggabungkan cabang Anda ke yang terbaru dari cabang yang sama .
sumber