Branch Git: Intuisi dan Realitas
(jvns.ca)- Banyak orang menganggap cara kerja branch Git tidak intuitif.
- Menjelaskan perbedaan antara model intuitif umum tentang branch Git dan bagaimana branch sebenarnya direpresentasikan di dalam Git.
- Menunjukkan bahwa model intuitif dan cara kerja Git yang sebenarnya ternyata sangat berkaitan erat.
- Membahas keterbatasan model intuitif dan alasan mengapa hal itu dapat menimbulkan masalah.
Model branch yang intuitif
- Banyak orang membayangkan branch seperti 'cabang pada pohon apel'.
- Di Git, branch tidak memiliki konsep 'induk', sehingga berbeda dari anggapan bahwa branch 'bercabang dari'
main.
Di Git, branch adalah seluruh riwayat
- Di Git, branch bukan sekadar commit yang bercabang, tetapi mencakup seluruh riwayat semua commit sebelumnya.
- Melalui repositori contoh, ditunjukkan bahwa
maindanmybranchsama-sama memiliki 4 commit.
Branch disimpan sebagai ID commit
- Di dalam Git, branch disimpan sebagai file teks kecil yang berisi ID commit.
- Commit terbaru dari setiap branch dicatat di file tersebut.
- Karena tidak ada relasi induk-anak antar-branch, Git tidak mengetahui hubungan antar-branch.
Intuisi orang biasanya tidak sepenuhnya salah
- Mengatakan bahwa intuisi orang tentang Git itu 'salah' agak konyol.
- Model yang 'salah' pun pada praktiknya tetap bisa berguna.
Rebase menggunakan konsep branch yang 'intuitif'
- Rebase hanya menerapkan ulang commit dari branch yang 'intuitif' ke
main. - Hasil rebase sesuai dengan model intuitif.
Merge juga menggunakan konsep branch yang 'intuitif'
- Merge tidak menyalin commit, tetapi memerlukan commit dasar yang dibagikan bersama.
- Merge base menemukan commit tempat branch bercabang berdasarkan model intuitif.
Pull request GitHub juga menggunakan ide intuitif
- Saat membuat pull request di GitHub untuk menggabungkan
mybranchkemain, yang ditampilkan hanya commit dari branch intuitif tersebut.
Intuisi itu bagus, tetapi ada batasnya
- Definisi branch yang intuitif cukup selaras dengan pekerjaan Git di dunia nyata, tetapi Git tidak bisa mengenali branch yang bercabang dari
mainsebagai sesuatu yang berbeda.
Trunk dan branch yang bercabang
- Orang memandang
maindanmybranchsecara berbeda, dan ini memengaruhi cara mereka menggunakan Git. - Git tidak membedakan apakah sebuah branch merupakan 'cabang' dari branch lain.
Git bisa melakukan rebase 'terbalik'
- Karena Git tidak memberi tahu apakah sebuah branch adalah 'cabang' dari branch lain, pengguna harus tahu sendiri branch mana yang perlu direbase dan kapan.
git rebase mainmaupun rebase terbalikgit rebase mybranchsama-sama memungkinkan. Hal yang sama berlaku untuk merge.
Ketiadaan hierarki antar-branch di Git terasa agak aneh
- Pernyataan bahwa branch
maintidak istimewa muncul karena Git tidak mengenali hubungan antar-branch. - Hubungan antar-branch itu ada, tetapi Git tidak tahu apa-apa tentangnya.
UI branch Git juga aneh
- Saat ingin hanya melihat commit yang 'bercabang', cara menggunakan
git logdangit diffberbeda.
Di GitHub, branch default itu istimewa
- GitHub memiliki 'branch default', dan branch ini memang memiliki peran khusus.
Pendapat GN⁺
Hal terpenting dari tulisan ini adalah memahami perbedaan antara pemahaman intuitif orang tentang branch Git dan cara kerja Git yang sebenarnya. Tulisan ini akan membantu software engineer pemula memahami konsep branch Git dengan lebih baik dan menggunakannya secara lebih efektif. Menarik dan bermanfaat untuk melihat bagaimana model intuitif branch selaras dengan pekerjaan nyata, serta bagaimana Git tidak menangani relasi antar-branch.
1 komentar
Komentar Hacker News
git reset --harddangit stash. Untuk membatalkan merge yang salah, saya menggunakangit reset --hard <병합 전 마지막 커밋>, dan untuk menerapkan perubahan kecil dari branch lokal ke branch utama, saya menggunakangit stash, lalu checkout ke branch utama dan menjalankangit stash apply.git adddangit commit. Tutorial ini membantu pembaca memahami branch sambil memvisualisasikannya.git merge my-branchmenggabungkan my-branch ke branch saat ini, dangit rebase my-branchme-rebase branch saat ini di atas my-branch.main.git range-diff, Anda juga perlu mengingat basisnya. Alat ini membandingkan dua rentang sepertimain..previousdanmain..current.