Terminologi Git yang Membingungkan
(jvns.ca)- Git memiliki banyak duplikasi dan penggunaan ulang istilah yang tetap membingungkan meski sudah lama dipakai, sehingga sulit memprediksi perilaku sebenarnya hanya dengan menghafal perintah
- Kata dan simbol yang sama seperti
HEAD,heads, detached HEAD,ours/theirs,../...berubah makna tergantung konteks index,staged,cachedsemuanya terkait dengan.git/index, tetapireset,revert,restore, meski namanya mirip, memiliki dampak berbeda pada riwayat commit, working tree, dan pointer branch- Track pada remote oleh
mainberbeda dari remote-tracking branch sepertiorigin/main, sementaracheckoutmenggabungkan perpindahan branch dan pemulihan file dalam satu perintah - Untuk memahami Git, kita perlu melihat model internal yang mengaitkan branch, reference, commit, index, dan status remote-tracking, bukan hanya perintah individual
HEAD, branch, detached HEAD
- Di Git, heads mengacu pada branch, dan secara internal branch disimpan di direktori
.git/refs/heads- Glosarium resmi Git membedakan branch sebagai semua commit di atasnya dan head sebagai commit terbaru, tetapi keduanya bisa dilihat sebagai dua cara memandang objek yang sama
HEADmenunjuk ke branch saat ini dan disimpan di.git/HEAD- Ungkapan “
headadalah branch, danHEADadalah branch saat ini” sendiri menunjukkan dengan baik kebingungan istilah Git
- Ungkapan “
- detached HEAD state adalah kondisi ketika
HEADmenunjuk langsung ke ID commit, bukan ke branch- Jika melakukan checkout pada tag, karena tag bukan branch, kita bisa masuk ke kondisi detached HEAD
- Dalam kondisi ini,
git pulltidak bekerja, dangit pushjuga tidak bekerja kecuali dengan cara khusus git commit,git merge,git rebase,git cherry-pickbisa dilakukan, tetapi commit baru tidak terhubung ke branch mana pun sehingga bisa sulit ditemukan- Kita bisa keluar dari kondisi detached HEAD dengan membuat branch baru atau berpindah ke branch yang sudah ada
ours dan theirs yang berubah pada merge dan rebase
- Dalam penyelesaian konflik,
git checkout --ours file.txtmemilih file sisi “ours”, tetapi titik acuan pada merge dan rebase berbeda - Pada merge, branch saat ini adalah
ours, sedangkan branch yang digabungkan masuk adalahtheirs- Contoh: setelah
git checkout merge-into-ours, jika menjalankangit merge from-theirs, branch saat ini menjadiours
- Contoh: setelah
- Pada rebase, branch saat ini adalah
theirs, sedangkan branch target rebase adalahours- Contoh: setelah
git checkout theirs, jika menjalankangit rebase ours, branch target menjadiours
- Contoh: setelah
- Perbedaan ini terkait dengan cara
git rebase mainsecara internal berulang kali menggabungkan commit dari branch saat ini ke salinan branchmain- Contoh terkait ada di skrip shell yang mengimplementasikan
git rebasedengangit merge
- Contoh terkait ada di skrip shell yang mengimplementasikan
- ourstheirs menjelaskan istilah
oursdantheirssecara singkat- “current change” dan “incoming change” di VSCode juga bisa membingungkan dengan cara yang sama
Pesan status remote dan fast-forward
Your branch is up to date with 'origin/main'bukan berartimainsaat ini adalah status terbaru di remote- Artinya branch lokal sama dengan
origin/mainpada saat terakhirgit fetchataugit pull - Jika fetch terakhir dilakukan 5 hari lalu, maka “terbaru” itu berdasarkan kondisi 5 hari lalu
- Artinya branch lokal sama dengan
- Git menyimpan informasi waktu fetch terbaru di reflog, tetapi pesan status tidak menampilkan waktu “berdasarkan fetch terakhir”
can be fast-forwardedberarti branch remote berada di depan branch lokal, dan karena tidak ada commit terpisah di lokal, pointer saja bisa digeser maju- Contoh: jika
mainadalahA-B-Cdanorigin/mainadalahA-B-C-D-E, setelahgit pullkeduanya menjadiA-B-C-D-E - Dalam kasus ini tidak ada kemungkinan konflik merge
- Contoh: jika
- Jika fast-forward tidak memungkinkan, berarti kedua branch sudah bercabang
- Contoh: jika
mainmemiliki commitXyang tidak ada diorigin/main, danorigin/mainmemilikiD,Eyang tidak ada dimain, fast-forward tidak memungkinkan - Saat itu Git menampilkan bahwa kedua branch berada dalam kondisi diverged dan masing-masing memiliki jumlah commit berbeda
- Contoh: jika
Sintaks pemilihan commit: ^, ~, .., ...
HEAD^danHEAD~sama-sama menunjuk ke 1 commit sebelumnyaHEAD^^^,HEAD~~~,HEAD~3semuanya menunjuk ke 3 commit sebelumnya
- Pada commit yang memiliki beberapa parent seperti merge commit, makna
HEAD^2,HEAD^3berbedaHEAD^adalah parent pertamaHEAD^2adalah parent keduaHEAD^3adalah parent ketigaHEAD~3berarti parent dari parent dari parent, sehingga berbeda dariHEAD^3
git log main..testdangit log main...testjuga bekerja secara berbedamain..testmenampilkan commit yang hanya ada ditesttest..mainmenampilkan commit yang hanya ada dimainmain...testmenampilkan commit yang hanya ada di kedua sisi
- Pada
git diff,..dan...ditafsirkan berbeda darigit loggit diff test..mainmembandingkan dengan menyertakan perubahan di sisitestdan perubahan di sisimaingit diff test...mainmembandingkan common ancestor dengan ujung sisimain, sehingga hanya menampilkan diff satu sisi
- Kebingungan notasi titik juga dibahas lebih lanjut di pain in dots
reference, refspec, tree-ish
- Di Git, reference dipakai dengan beberapa makna
- Branch dan tag seperti
main,v0.2 HEADyang menunjuk ke branch saat ini- Ekspresi seperti
HEAD^^^yang ditafsirkan sebagai ID commit
- Branch dan tag seperti
- Dokumentasi Git secara ketat menyebut ekspresi seperti
HEAD^^^sebagai “revision parameters”, tetapi dalam penggunaan sehari-hari ekspresi itu bisa diperlakukan seperti reference - symbolic reference berarti reference yang menunjuk ke reference lain, seperti
HEADHEADadalah konsep sentral yang sangat memengaruhi perilaku perintah inti Git
- Pengaturan remote di
.git/configberisi refspec- Contoh:
+refs/heads/main:refs/remotes/origin/main - Dalam banyak kasus, orang memakai apa adanya nilai yang dibuat oleh
git cloneataugit remote adddefault
- Contoh:
tree-ishmengacu pada objek yang bisa menjadiTHINGdalamgit checkout THING .- ID commit
- Reference commit seperti
main,HEAD^^,v0.3.2 - Subdirektori di dalam commit seperti
main:./docs - Dalam praktiknya, sering kali cukup dipahami sebagai “commit atau reference commit”
index, staged, cached
index,staged,cachedsemuanya terkait dengan.git/index.git/indexadalah file yang digunakan saat melakukan stage perubahan dengangit add
- Istilah yang menunjuk ke hal yang sama tersebar di berbagai perintah
git diff --cachedgit rm --cachedgit diff --staged.git/index
- Namun flag
--indexdan--cachedtidak selalu bermakna sama- Tulisan dari maintainer utama Git, Junio Hamano, menjelaskan perbedaan detailnya
- Index juga mencantumkan untracked files demi alasan performa, tetapi secara umum staging area tidak dianggap mencakup untracked files
reset, revert, restore
reset,revert,restoreadalah kata yang mirip, tetapi di Git objek yang dipengaruhinya berbedagit revert COMMITmembuat commit baru di branch saat ini yang melakukan kebalikan dariCOMMIT- Jika
COMMITmenambahkan 3 baris, commit baru akan menghapus 3 baris tersebut
- Jika
git reset --hard COMMITsecara paksa mengembalikan branch saat ini ke titikCOMMIT- Ini operasi yang sangat berbahaya karena menghapus perubahan baru setelah
COMMIT
- Ini operasi yang sangat berbahaya karena menghapus perubahan baru setelah
git restore --source=COMMIT PATHmengembalikan file diPATHke kondisi saatCOMMIT- File lain atau riwayat commit tidak diubah
git reset --harddangit restore .bila dipakai sendiri umumnya bekerja mirip, tetapigit reset --hard COMMITdangit restore --source COMMIT .bekerja sangat berbeda
track, remote-tracking branch, untracked files
- Git memakai kata track dalam tiga cara
Untracked files:padagit statusberarti file yang tidak dikelola Git dan tidak termasuk dalam commit- Remote-tracking branch seperti
origin/mainadalah reference lokal yang berisi ID commit yang ditunjuk olehmaindi remoteoriginpada saat terakhirgit pullataugit fetch - Branch lokal bisa dikonfigurasi untuk track branch remote, seperti pada “branch foo set up to track remote branch bar from origin”
- Pernyataan bahwa
mainadalah branch yang track remote berbeda dari pernyataan bahwaorigin/mainadalah remote-tracking branch mainadalah branch sungguhan, sehingga kita bisa membuat commit dan melakukan merge di sana- Jika dikonfigurasi di
.git/configuntuk trackmainremote,git pulldangit pushbisa dipakai dengan nyaman
- Jika dikonfigurasi di
- Meski namanya “remote-tracking branch”,
origin/mainbukan branch biasa- Tidak bisa langsung diberi commit
- Hanya diperbarui saat mengambil status
mainterbaru dari remote dengangit pullataugit fetch
checkout, reflog, merge/rebase/cherry-pick
git checkoutmemasukkan dua operasi berbeda ke dalam satu perintahgit checkout BRANCHberpindah branchgit checkout file.txtmembuang perubahan unstaged padafile.txt
- Untuk mengurangi kebingungan ini, Git membagi fungsinya menjadi
git switchdangit restore, tetapicheckoutlama masih tetap bisa digunakan reflogadalah reference log, yaitu catatan tentang apa yang pernah ditunjuk oleh sebuah reference- Reference adalah istilah luas yang mencakup branch, tag, dan
HEAD - Reflog bisa membantu keluar dari situasi Git yang sangat buruk, misalnya saat tidak sengaja menghapus branch penting
- Reference adalah istilah luas yang mencakup branch, tag, dan
- merge, rebase, dan cherry-pick menggabungkan commit dengan cara berbeda
- merge membuat satu commit baru yang menggabungkan dua branch
- rebase menyalin commit dari branch saat ini satu per satu ke atas branch target
- cherry-pick mirip dengan rebase, tetapi sintaksnya berbeda dan menyalin commit ke branch saat ini
git rebase --onto main otherbranch mybranchbisa dipakai untuk memindahkan hanya sebagian commit darimybranchke atasmain- Dalam struktur contoh, ini bisa digunakan saat ingin me-rebase hanya
F,Gke atasmain - Sintaks ini sulit diingat karena berisi tiga nama branch
- Dalam struktur contoh, ini bisa digunakan saat ingin me-rebase hanya
commit dan istilah membingungkan lainnya
commitdipakai di Git baik sebagai kata kerja maupun kata benda- Kata kerja: “seringlah melakukan commit”
- Kata benda: commit terbaru di
main
- Commit Git bisa dilihat dengan tiga cara
- Snapshot dari kondisi saat ini semua file
- Diff terhadap commit parent
- History dari semua commit sebelumnya
- Setiap perintah memperlakukan commit secara berbeda
git showmemperlakukan commit seperti diffgit logmemperlakukan commit seperti historygit restorememperlakukan commit seperti snapshot
blob,tree,origin,upstream,downstream, hubunganfetchdanpull,stash,worktree,subtree,submodulejuga termasuk istilah Git yang membingungkan- Di antara istilah GitHub, “pull request”, “squash and merge”, “rebase and merge” disebut sebagai contoh yang membingungkan
Tiga sumbu kebingungan yang berulang
- Istilah Git yang sangat membingungkan dapat diringkas menjadi tiga hal
headadalah branch, danHEADadalah branch saat ini- “remote tracking branch” dan “branch that tracks a remote” adalah dua hal berbeda
index,staged,cachedsemuanya menunjuk ke objek yang sama
- the most confusing git terminology dari 2012 juga membahas bagaimana istilah Git terkait dengan istilah CVS dan Subversion
- Kebingungan istilah Git bukan hanya pada beberapa fitur khusus, tetapi berulang di seluruh fitur inti
- Khususnya saat membahas branch, “tracking” dipakai dalam beberapa cara sehingga perbedaannya sulit disadari saat pertama melihatnya
- Beberapa penjelasan mencakup sudut Git yang jarang dipakai, sehingga masih ada catatan bahwa mungkin terdapat kesalahan
1 komentar
Pendapat di Hacker News
Nama branch,
HEAD, dan tag semuanya adalah pointer.HEADmenunjuk ke commit yang sedang kita lihat, dan nama branch sepertimy-featuremenunjuk ke commit terbaru di branch itu. Jika menjalankangit checkout -b my-featuredarimain, makamain,my-feature, danHEADsemuanya akan menunjuk ke commit terbaru dimainSetiap kali melakukan commit di
my-branch,HEADdanmy-branchbergerak agar menunjuk ke commit baru. detached HEAD berarti kondisi ketika tidak ada branch yang menunjuk ke commit yang ditunjuk olehHEAD. Perbedaan tag dan branch adalah tag menunjuk ke commit tertentu dan tidak bergerakHal lain yang membingungkan adalah banyak perintah tampak tidak konsisten karena Git mengasumsikan argumen default.
git checkout file.txtsama dengangit checkout HEAD -- file.txt, dan ketika berada dimy-branch,git rebase mainsama dengangit rebase main my-branch. Namun bentuk yang terakhir bisa dijalankan dari branch lain jugaTerakhir, ketika semuanya kacau, perintah yang bisa mengeluarkan kita dari kondisi aneh apa pun adalah
git reflog. Perintah ini menampilkan semua commit yang pernah ditunjuk olehHEAD. Tetap saja, senang melihat Git mengakui kebingungan ini dan membuat perintah dengan antarmuka yang tidak terlalu mengejutkan dan lebih sederhanareflogHal lain yang sering tidak terpikir oleh banyak pengguna Git adalah bahwa ref branch atau tag remote yang sudah di-fetch juga semuanya ref, jadi bisa direferensikan di mana pun nama ref bisa dipakai
Misalnya jika ingin berkata, “Saya tidak peduli apa isi branch ini, jangan fast-forward, jangan merge, jangan rebase, cukup timpa branch lokal dengan isi remote,” lakukan seperti ini:
git checkout foo,git reset --hard origin/fooHEADtidak menunjuk langsung ke commit; biasanya ia menunjuk ke pointer branch sepertimy-branch, lalu pointer branch itu menunjuk ke commit. Kondisi detached HEAD adalah pengecualiannyaSaat melakukan commit di
my-branch, bukanHEADdanmy-branchyang sama-sama berpindah ke commit baru;HEADtetap menunjuk ke pointermy-branch, dan hanyamy-branchyang bergerak agar menunjuk ke commit baru. Tentu saja, jika mengikutiHEADmelaluimy-branchsampai ke commit, kita akan sampai ke commit barudetached HEAD adalah kondisi ketika
HEADmenunjuk langsung ke commit, bukan ke pointer branch. Bahkan dalam kondisi detached HEAD,HEADdan pointer branch bisa sama-sama menunjuk ke commit terbaru. Jika melihatgit log --decorate, alih-alih tampilan biasa(HEAD -> my-branch), pada commit terbaru biasanya akan terlihat seperti(HEAD, my-branch)Sebaliknya, annotated tag bisa berisi pesan, timestamp, SHA, dan lain-lain. Ini adalah objek Git yang sesungguhnya dan perilakunya cukup mirip dengan objek commit, tetapi biasanya tetap mereferensikan objek Git lain, umumnya commit
git rev-parse HEADlalu menyalin string itu ke tempat aman juga bagusAda rasa tenang karena kita menandai secara persis keadaan terakhir yang diyakini benar. Biasanya kita bisa kembali ke keadaan terakhir yang baik, bukan ke titik beberapa langkah setelah masuk ke kekacauan. Tentu saja dengan asumsi tidak sembarangan memakai hal seperti
git gcataugit filter-branchKedengarannya seperti lelucon, tetapi sebenarnya bukan lelucon: pernyataan bahwa untuk memakai Git kita benar-benar perlu gelar ilmu komputer tidak sepenuhnya salah. Saya setuju bahwa argumen default Git menciptakan pengalaman penggunaan yang sangat tidak konsisten
git checkout .,git reset --hard/soft, dangit cleanupsemuanya tampak sangat mirip, tetapi sebenarnya sangat berbeda. Meski begitu, saya tetap lebih suka Git daripada Perforce atau SVN. Dulu saya sedikit lebih suka Mercurial, tetapi saya tidak tahu apakah masih begitu sekaranggit reflogadalah rajanya dan menunjukkan kebenaranSaya ingat pernah membaca tulisan bahwa Linus Torvalds terkejut orang-orang mulai memakai Git secara langsung tanpa menambahkan lapisan yang lebih ramah di atasnya. Jika industri ini mampu melakukan introspeksi, kita akan mengakui bahwa memilih Git adalah kesalahan dan pindah ke sistem version control lain. Jangan membuang waktu luar biasa banyak untuk alat yang tugasnya hanya menyimpan teks
Tentu saja masih bisa dibuat lebih baik. Namun kebencian yang diterima Git selalu mengejutkan. Git adalah alat yang hebat, dan jauh lebih maju daripada alat seperti Word atau Google Docs yang dibuat untuk non-developer
Mungkin karena saya cukup tua untuk mengingat masa ketika Subversion masih jadi raja
Setiap minggu saya melihat rekan kerja kebingungan karena Git, melihat postingan minta bantuan secara online, dan melihat lagi tulisan yang mencoba menjelaskan ulang hal yang seharusnya sederhana seperti artikel ini
Saya tidak ingat ada orang yang saat coding membuang berjam-jam untuk membatalkan kekacauan yang mereka buat sendiri di SVN, TFVC, Perforce, dan sebagainya
Alat ada untuk membuat hidup lebih mudah. Kalau tidak bisa melakukan itu, tidak layak menghabiskan waktu untuknya
Saya masih berharap keragaman seperti itu tetap ada. Monokultur Git juga berarti bahwa apa pun yang ingin menggantikan Git harus lebih dulu mengimplementasikan ulang Git. Jadi kita jadi terikat pada Git nyaris selamanya, seperti ASCII atau tombol Scroll Lock
Kekhawatiran utamanya adalah GitHub terlalu bagus, sehingga kita akan terikat pada Git kecuali GitHub memisahkan Git dari mesin pengelolaan teks dan mengizinkan mesin lain juga
https://trolololo.xyz/github
https://news.ycombinator.com/item?id=38098109
Ini istilah seperti abstraksi yang bocor
cache, istilah yang paling bernuansa ilmu komputerSetelah itu Junio tampaknya mengubahnya menjadi
index, yang lebih spesifik untuk sistem kontrol versi terdistribusi, dan kebanyakan pengguna menyebutnya staging area. Kini evolusi istilah ini membatu seperti fosil di UI dan internal Gitpullorigin/masterbukan master yang ada di origin, melainkan commit yang ditunjuk olehorigin/masterterakhir yang diketahui. Nilai ini diperbarui saatfetch, danpullotomatis melakukanfetchJika melihat
ls -l .git/refs/remotes/origin/master, Anda bisa tahu bahwaorigin/masterhanyalah sebuah file di sistem Anda. Anda juga bisa melihat kapan ia berubah. Ia tidak diperbarui secara ajaibJika ada perubahan saat menjalankan
git fetch origin, timestamp dan isinya akan berubah. Anda bisa memeriksanya dengancat .git/refs/remotes/origin/masterDasar-dasar Git sangat sederhana, sampai struktur data inti dan beberapa operasi bisa diimplementasikan dalam sehari. Mengetahui hal ini benar-benar berharga. Entah bagaimana Git berhasil membangun antarmuka pengguna yang sangat rumit di atas inti yang cukup sederhana
masterlokal. Biasanya saya tidak bisa push kemaster, atau memang tidak ingin bekerja langsung dimaster. Kalau begitu tidak ada alasan untuk menyimpan branchmasterlokal yang bisa diubahJadi yang perlu diperbarui hanya
origin/master, danfetchsudah cukup untuk itugit fetch && git pullSaya menunggu hari ketika bisa pensiun 3 tahun lagi dan cuci tangan dari sampah rusak ini
git status, dan menambahkan flag--porcelainbenar-benar membantu. Ia menghasilkan output yang lebih ringkas dan lebih mudah di-parse oleh programSaya jadi penasaran berapa banyak command yang punya output yang lebih mudah dibaca mesin, sampai akhirnya membuka halaman “Git Internals - Plumbing and Porcelain” di git-scm. Ringkasnya, sejak awal Git ditulis lebih sebagai kumpulan alat untuk menangani version control daripada sebagai sistem version control yang terpoles
Banyak orang yang memakai Git sejak awal mempelajari tugas-tugas version control lewat command level rendah ini, lalu menyebarkan workflow itu ke orang lain. Inilah lapisan plumbing. Belakangan Git membuat lapisan yang lebih dipoles, yang disebut porcelain
Saya masih belum sepenuhnya tahu command mana masuk lapisan yang mana, tetapi ini membantu saya memahami workflow baru yang direkomendasikan dalam beberapa tahun terakhir. Ini juga membuat saya bisa menilai lebih baik saat mengubah workflow saya sendiri
https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Po...
Sayangnya, untuk membuatnya lebih cepat mereka meng-hardcode UI itu, tetapi tidak memperbaikinya
Kalau dipikir-pikir, saat pertama mulai saya pasti sangat kebingungan, tetapi sepertinya saya pura-pura tidak begitu agar terlihat keren
https://news.ycombinator.com/item?id=28143078
“Your branch is up to date with ‘origin/main’” sebenarnya agak menyesatkan. Itu bisa dipahami sebagai berarti branch
mainsudah terbaru, padahal sebenarnya tidak demikianNamun tidak perlu terlalu menempelkan “secara ketat” pada hal ini. Bukankah masalah dua jenderal berlaku di sini? Kalau benar-benar ditelisik dengan sangat teliti, kita tidak bisa tahu apakah tepat pada saat ini ia “terbaru”. Bahkan jika melakukan
fetchsebelumstatus, tetap samaJadi apa ekspektasi yang masuk akal? Kira-kira bahwa ref yang ada di database objek di komputer saya sama dengan ref di database objek lain yang jauh di sana saat terakhir kali diperiksa
Pemanggilan
statussederhana tidak bisa melakukanfetchjaringan, atau setiap kali mengingatkan prinsip dasar alat yang sedang dipakai. Setidaknya menurut saya begitu. Namun mengejutkannya, banyak komentar di jawaban StackOverflow justru menganggap keduanya diperlukanFrasa seperti “is up to date with the origin’s main as of your last fetch 5 days ago” lebih masuk akal. Karena itu hanya memberi tahu sudah berapa lama sejak terakhir kali
fetchdilakukan[1] https://stackoverflow.com/questions/27828404/why-does-git-st...
Satu lagi: saya sempat mengira
ORIG_HEADterkait dengan “origin’s head” sepertiFETCH_HEAD. Ternyata bukan. “Pseudoref” ini tampaknya dipakai sebagai titik simpan sebelum penulisan ulang yang lebih kompleks seperti rebase, dan diimplementasikan sebelum reflog ada. Mungkin maksudnya “original head”“Your branch is up to date with ‘origin/main’” secara teknis benar, tetapi ungkapan up to date jika dibaca sekilas menyiratkan dua hal. Bahwa
mainsama denganorigin/main, danorigin/mainjuga terbaru; dengan kata lain terasa seperti baru diperbarui saat perintah dijalankan, atau otomatis dijaga tetap terbaru dan sinkronisasi terbaru berhasilIni bukan sinyal yang dibaca mesin dan harus benar selama satu siklus CPU, melainkan pesan status yang terlihat oleh pengguna. Tanpa membawa-bawa teori jaringan pun, interpretasi seperti itu masuk akal
“Up to date” lebih dekat artinya dengan sudah mengejar secara waktu, bukan ruang. Posisi branch lokal lebih dekat ke ruang, yaitu “branch ini menunjuk ke mana”, sedangkan status ref remote lebih dekat ke waktu, yaitu “kapan terakhir kali saya memperbarui ref remote”. Tentu saja ini sangat subjektif dan keduanya bisa bermakna dua arah
Redaksi yang lebih baik bisa berupa “Your branch matches origin/main”, “Your branch’s head is the same as origin/main”, atau “Your branch is pointing to the same commit as origin/main”. Ini kompromi antara kejelasan dan kepanjangan. Seperti usulan penulis, bisa juga ditambahkan dalam tanda kurung “remote ref last updated 5 days ago”
statusyang melakukanfetchjaringan itu menjengkelkan. Menurut saya operasi jaringan harus eksplisit, bukan implisit. Saat menjalankangit status, saya ingin mengetahui status repository saya yang ada di sistem fileKalau ingin tahu apa yang terjadi di remote lain, saya bisa melakukan
fetchsendiri lalu membandingkannyastatusdimulai. Memang bisa ada race condition saat informasi dicetak ke terminal, tetapi itu jendela waktu yang sangat kecilSecara umum ini berarti menginginkan
fetch. Masalah dua jenderal hanya berlaku di sisi remote. Jika remote tidak menerima konfirmasi bahwa klien sudah menerima data, remote bisa terus mengirim ulang untuk sementara waktu. Itu bukan masalah klienJika klien tidak menerima data dari server, perilaku yang benar mestinya berhenti lalu menampilkan error setelah timeout, dan kemungkinan
fetchsaat ini memang melakukan ituAlat ini sering dibagikan, dan cocok juga di sini. Ia memvisualisasikan model internal Git dan efek dari berbagai perintah
https://learngitbranching.js.org/
Yang saya pelajari dari memakai alat ini 10 menit lebih banyak daripada sekitar 10 tahun pengalaman Git sebelumnya. Sangat direkomendasikan
“pull” adalah tindakan menggabungkan perubahan remote ke repository lokal. Yang sebenarnya diminta pengguna adalah agar server menggabungkan perubahan remote miliknya ke sebuah branch. Istilah GitLab, “merge request”, adalah ungkapan yang tepat
Saya pernah melihat seseorang melakukan
fetchlalu commit menghilang. Itu tersembunyi karena repository bergerak mundur dalam waktu. Git menyembunyikan detail seperti itu distatus, jadi kalau tidak memakaigit-promptataupowerline-shell, rasanya bekerja dalam gelapgit-request-pull(1)adalah bahwa kita semua punya repository Git masing-masing di tempat seperti kernel.org/git atau redhat.com/git, lalu meminta lewat email agar orang lain melakukan pull dari repository yang berada di server, organisasi, dan domain berbedaGitHub terinspirasi oleh perintah
request-pullmilik Git, tetapi menafsirkannya ulang sebagai penggabungan dari satu repository GitHub ke repository GitHub lainSetidaknya saya selalu membacanya begitu
Ringkasnya, itu bukan permintaan kepada server, melainkan permintaan kepada orang lain. Kita meminta orang tersebut untuk melakukan pull branch kita agar ia meninjau perubahan yang ingin kita kontribusikan ke proyek
[0] https://git-scm.com/book/en/v2/Distributed-Git-Contributing-...