Saya pikir saya berada di jalur yang benar untuk memahami konsep dasar git.
Saya sudah menyiapkan dan mengkloning repositori jarak jauh. Saya juga membuat repositori kosong di sisi server, dan menautkan repositori lokal saya dengannya.
Masalah saya adalah saya tidak mengerti perbedaan antara:
- origin / master vs. remote / origin / master
Sejauh yang saya mengerti, master adalah cabang lokal, dan remote / asal / master adalah yang jauh.
Tapi apa sebenarnya asal / master ?
git
git-remote
John Rumpel
sumber
sumber
.git/refs/origin/master
saya harus pindah.git/refs/remotes/origin/master
? Ini terjadi pada saya sekarang dan saya terlempar.Jawaban:
Ambil klon repositori jarak jauh dan jalankan
git branch -a
(untuk menampilkan semua cabang yang diketahui git). Mungkin akan terlihat seperti ini:Di sini,
master
adalah cabang di repositori lokal.remotes/origin/master
adalah cabang bernamamaster
pada remote bernamaorigin
. Anda dapat merujuk ini sebagaiorigin/master
, seperti pada:Anda juga dapat menyebutnya sebagai
remotes/origin/master
:Ini hanya dua cara berbeda untuk merujuk ke hal yang sama (kebetulan, kedua perintah ini berarti "tunjukkan perubahan antara
master
cabang jarak jauh danmaster
cabang saya ).remotes/origin/HEAD
adalahdefault branch
untuk remote bernamaorigin
. Ini memungkinkan Anda mengatakanorigin
sebaliknyaorigin/master
.sumber
git branch -a
menunjukkan cabang jarak jauhremotes/origin/master
sebagian karena ref yang mendasarinya disimpan.git/refs/remotes/origin
(jika belum dikemas). Menurut pendapat saya, output darigit branch -a
bisa jauh lebih jelas, mungkin dengan memisahkan nama remote dari nama cabang dengan sesuatu selain garis miring.git branch -r
, yang hanya menampilkan cabang jarak jauh, akan menampilkan cabang hanyaorigin/master
karenaremotes/
awalan tidak diperlukan.git log
saya melihatcommit fa9sd8jasdf98 (HEAD -> master)
, apa artinya ini? Apa itu KEPALA dalam hal ini? Saya pikir saya saat ini "master" dan berkomitmen untukorigin/master
. Saya pikir saya memiliki sesuatu yang membingungkan, dapatkah seseorang membantu menenangkan? EDIT UPDATE: Saya pikir saya mengerti, apakah benar untuk menganggap bahwa HEAD saat ini menunjuk ke cabang master, artinya saya sedang dalam proses komit untuk menguasai?Jawaban singkat untuk boneka seperti saya (dicuri dari Torek):
sumber
Secara teknis sebenarnya tidak ada hal-hal "jauh" sama sekali 1 di repo Git Anda, hanya ada nama-nama lokal yang harus sesuai dengan nama-nama pada repo lain yang berbeda. Yang bernama
origin/whatever
awalnya akan cocok dengan yang ada di repo yang Anda kloning-dari:membuat salinan lokal dari repo lainnya. Sepanjang jalan itu mencatat semua cabang yang ada di sana, dan melakukan yang merujuk, dan menempelkan itu ke repo lokal Anda di bawah nama
refs/remotes/origin/
.Bergantung pada berapa lama Anda pergi sebelum Anda
git fetch
atau yang setara untuk memperbarui "salinan saya dari apa yang some.where.out.there", mereka dapat mengubah cabang mereka di sekitar, membuat yang baru, dan menghapus beberapa. Ketika Anda melakukangit fetch
(ataugit pull
yang benar-benar mengambil plus penggabungan), repo Anda akan membuat salinan dari karya baru mereka dan mengubah semuarefs/remotes/origin/<name>
entri sesuai kebutuhan. Momenfetch
yang membuat semuanya cocok (well, itu, dan klon awal, dan beberapa kasuspush
juga - pada dasarnya setiap kali Git mendapat kesempatan untuk memeriksa - tetapi lihat peringatan di bawah).Git biasanya membuat Anda menyebut milik Anda sendiri
refs/heads/<name>
sebagai adil<name>
, dan yang jauh sebagaiorigin/<name>
, dan itu semua hanya bekerja karena sudah jelas mana yang mana. Kadang-kadang mungkin untuk membuat nama cabang Anda sendiri yang membuatnya tidak jelas, tetapi jangan khawatir tentang hal itu sampai itu terjadi. :-) Beri saja Git nama terpendek yang membuatnya jelas, dan itu akan pergi dari sana:origin/master
adalah "di mana master ada di sana terakhir kali saya memeriksa", danmaster
"di mana master ada di sini berdasarkan apa yang telah saya lakukan" . Jalankangit fetch
untuk memperbarui Git pada "di mana master ada di sana" sesuai kebutuhan.Peringatan: dalam versi Git yang lebih tua dari 1.8.4,
git fetch
memiliki beberapa mode yang tidak memperbarui "di mana master ada di sana" (lebih tepatnya, mode yang tidak memperbarui cabang pelacakan jarak jauh). Larigit fetch origin
, ataugit fetch --all
, atau bahkan hanyagit fetch
, tidak pembaruan. Berlarigit fetch origin master
tidak . Sayangnya, mode "tidak diperbarui" ini dipicu oleh mode biasagit pull
. (Ini terutama hanya gangguan kecil dan diperbaiki di Git 1.8.4 dan yang lebih baru.)1 Nah, ada satu hal yang disebut "remote". Tapi itu juga lokal! Nama
origin
adalah hal yang disebut Git "remote". Itu pada dasarnya hanya nama pendek untuk URL yang Anda gunakan ketika Anda melakukan klon. Itu juga tempatorigin
diorigin/master
berasal dari. Namaorigin/master
ini disebut cabang pelacakan jarak jauh , yang kadang disingkat menjadi "cabang jarak jauh", terutama dalam dokumentasi yang lebih lama atau lebih informal.sumber
origin/master
stiker padalocal
grafik repo, dan bukan pada stiker ituremote
(saya dengan sepenuh hati merekomendasikan presentasi "Kerit Terjadi" dari Jessica Kerr untuk orang-orang yang baru mengenalgit
: vimeo.com/46010208 . Saya menggaruk-garuk kepala saya antara pukul 30: 30-30: 19.)Saya akan mencoba membuat jawaban @ ErichBSchulz lebih sederhana untuk pemula:
sumber
last time I've checked
itu kehilangan poin penting$ git remote add origin https://github.com/git/git.git
--- Anda akan menjalankan perintah ini untuk menautkan proyek github Anda ke asal. Di sini asal ditentukan oleh pengguna. Anda dapat mengganti nama dengan$ git remote rename old-name new-name
$ git fetch origin
- Mengunduh objek dan referensi dari repositori jarak jauh ke komputer [asal / master] Anda. Itu berarti itu tidak akan mempengaruhi cabang master lokal Anda kecuali Anda menggabungkannya menggunakan$ git merge origin/master
. Ingatlah untuk checkout cabang yang benar di mana Anda harus menggabungkan sebelum menjalankan perintah iniCatatan: Konten yang diambil direpresentasikan sebagai cabang jarak jauh. Ambil memberi Anda kesempatan untuk meninjau perubahan sebelum mengintegrasikannya ke dalam salinan proyek Anda. Untuk menampilkan perubahan antara Anda dan jarak jauh
$git diff master..origin/master
sumber
Satu klarifikasi (dan poin yang membingungkan saya):
"remote / origin / HEAD adalah cabang default" tidak sepenuhnya benar.
remote / origin / master adalah cabang default di repositori jarak jauh (terakhir kali Anda memeriksa). KEPALA bukan cabang, itu hanya menunjuk ke cabang.
Pikirkan HEAD sebagai area kerja Anda. Ketika Anda memikirkannya seperti ini maka 'git checkout branchname' masuk akal sehubungan dengan mengubah file area kerja Anda menjadi cabang tertentu. Anda "checkout" file cabang ke area kerja Anda. KEPALA untuk semua tujuan praktis adalah apa yang terlihat oleh Anda di wilayah kerja Anda.
sumber
HEAD
adalah "penunjuk ke cabang" (file aktual di repo lokal Anda sering berisi stringref: refs/heads/master
, misalnya ... kecuali "terpisah", yang merupakan hal lain sama sekali). Namun, ada semacam bug dalam caraclone
mengartikan "HEAD jarak jauh": protokol transfer tidak dapat mengirim cabang tidak langsung sama sekali, hanya SHA-1 mentah, jadi git memiliki kludge yang membuat ini "sebagian besar berfungsi". Namun sesekali seseorang menemukan kasus aneh. Saya agak berharap git tidak menciptakanremotes/origin/HEAD
sama sekali, terutama ketika itu keluar salah ...Saya pikir notasi git slash ini mungkin paling baik dipahami dengan melihat ke dalam
.git
folder Anda .Sebagai contoh, ini adalah pohon .git saya yang agak disingkat untuk basis sumber LibreOffice.
Di linux
sudo apt-get install tree
bermanfaat untuk melihatnya.Di Windows saya pikir
tree
perintah itu mungkin masih berfungsi.Gulir ke bawah dan lihat referensi (alias 'referensi') di dekat bagian bawah:
Mungkin kurang membingungkan jika ditata seperti ini, tetapi tidak:
Kami memiliki tiga jenis referensi dasar: kepala , jarak jauh , dan tag .
.git / refs / kepala memegang master lokal kami .
.git / refs / remote dapat menampung sejumlah remote, meskipun saat ini kami hanya memiliki asal di dalamnya.
.git / refs / tag (dibahas di tempat lain).
asal demikian, adalah satu-satunya kita dan jauh. Itu memegang asal / master .
Kami menemukan bahwa kami memiliki 2 HEADS (pointer ke cabang saat ini), satu lokal, dan satu remote:
Jika Anda daftar cabang Anda :
Selanjutnya, Anda mungkin memiliki banyak cabang pelacakan jarak jauh, dan kami lakukan di sini. Anda tahu ini adalah cabang pelacakan jarak jauh karena mereka diawali dengan ' remote / '. Yang ditampilkan di sini adalah untuk asal bernama remote.
Jadi baris kedua adalah pointer cabang saat ini asal . Remote / asal: HEAD --points to -> master. Ini menunjukkan bahwa dalam repositori jarak jauh, cabang saat ini adalah cabang mereka yang bernama master , (jangan bingung dengan cabang lokal kami yang bernama master ).
Cabang yang tersisa tidak ditemukan di .git / refs / tree Anda, tetapi Anda akan menemukannya di
.git/packed-refs
.Ketika kita git fetch kita download perubahan dari repositori jauh, ke dalam repositori pelacakan jarak jauh kami.
Ketika kita git menggabungkan kita menggabungkan perubahan di repositori pelacakan lokal, jauh ini ke cabang lokal kami atau cabang, dalam hal ini ke dalam cabang utama kami.
(Ketika kita git pull, kita melakukan kedua langkah ini dalam satu operasi.)
Ini juga menarik untuk dicatat lokal ini UUID dan jarak jauh ini untuk master yang saat ini mengarah ke simpul yang sama (alias 'komit'):
Jadi master lokal kami menunjuk ke tempat yang sama dengan master asal remote:
Akhirnya, saya pikir ini juga berguna untuk melihatnya
.git/packed-refs
Tidak diragukan lagi ini menyisakan lebih banyak pertanyaan daripada jawaban, tetapi saya pikir ini dapat mulai membantu Anda menjawab pertanyaan Anda sendiri tentang apa itu.
sumber