28 poin oleh GN⁺ 2023-11-24 | 1 komentar | Bagikan ke WhatsApp
  • 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 main dan mybranch sama-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 mybranch ke main, 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 main sebagai sesuatu yang berbeda.

Trunk dan branch yang bercabang

  • Orang memandang main dan mybranch secara 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 main maupun rebase terbalik git rebase mybranch sama-sama memungkinkan. Hal yang sama berlaku untuk merge.

Ketiadaan hierarki antar-branch di Git terasa agak aneh

  • Pernyataan bahwa branch main tidak 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 log dan git diff berbeda.

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

 
GN⁺ 2023-11-24
Komentar Hacker News
  • Branch adalah pointer yang menunjuk ke commit, dan pointer ini diperbarui setiap kali commit baru dibuat. Branch bisa dianggap sebagai nama yang mengambang seperti tag. Karena commit itu sendiri menunjuk ke parent commit, branch pada dasarnya adalah rangkaian commit terkait dengan titik masuk yang diberi nama. Jika branch dihapus, label bernama itu hilang, sehingga yang tersisa hanyalah rangkaian commit terkait.
  • Akan lebih mudah dipahami jika silsilah commit dianggap sebagai pointer yang menunjuk ke belakang, bukan ke depan. Branch adalah ID commit, jadi dengan menelusuri tautan parent ke belakang, kita bisa menemukan seluruh riwayat branch tersebut. 'Branch point' adalah titik tempat dua rantai commit bertemu, dan merge commit bersifat khusus karena menandakan dua riwayat telah digabung menjadi satu.
  • Dalam proyek pribadi, teman-teman kadang marah saat melihat saya memanipulasi perubahan dan pointer branch dengan git reset --hard dan git stash. Untuk membatalkan merge yang salah, saya menggunakan git reset --hard <병합 전 마지막 커밋>, dan untuk menerapkan perubahan kecil dari branch lokal ke branch utama, saya menggunakan git stash, lalu checkout ke branch utama dan menjalankan git stash apply.
  • Di Git tidak ada konsep bahwa 'main itu spesial', tetapi alat seperti GitLab menyediakan fitur protected branch untuk mengurangi kesalahan. Konsep branch 'parent' dan 'child' sebenarnya bisa menarik, dan perlu mendukung beberapa branch 'parent' untuk branch dukungan jangka panjang.
  • Saat melakukan merge, rebase, atau pull request, Anda perlu menyebut branch lain secara eksplisit. Git tidak tahu branch mana yang Anda anggap sebagai basis. Kadang Anda ingin menggabungkan feature branch ke feature branch lain, jadi harus jelas branch mana yang akan digabungkan ke branch yang mana.
  • Intuisi yang dimiliki orang bisa saja sebagian keliru secara teknis, tetapi ada alasan yang masuk akal mengapa mereka memiliki intuisi seperti itu.
  • Ada tutorial interaktif yang ditujukan untuk orang yang sudah tahu cara menggunakan git add dan git commit. Tutorial ini membantu pembaca memahami branch sambil memvisualisasikannya.
  • Jika Anda ingat bahwa saat menjalankan perintah Git Anda 'selalu' memodifikasi branch saat ini, sintaks Git akan 'mudah' dipahami. Misalnya, git merge my-branch menggabungkan my-branch ke branch saat ini, dan git rebase my-branch me-rebase branch saat ini di atas my-branch.
  • Akan bagus jika branch (head) memiliki 'ekor' yang menunjuk ke commit dasar tempat branch itu dimulai. Karena branch sering di-rebase, kadang kita perlu memikirkan dari mana branch itu berawal. Akan lebih nyaman jika Git memberi tahu bahwa commit dasar itu termasuk ke main.
  • Saat mengirim 'patch' ke mailing list, Anda bisa secara opsional menyertakan commit dasar. Ini karena tidak selalu jelas apakah perubahan tersebut berbasis pada rilis terbaru, branch pengembangan utama, atau branch integrasi. Saat menggunakan git range-diff, Anda juga perlu mengingat basisnya. Alat ini membandingkan dua rentang seperti main..previous dan main..current.
  • Setelah membaca ulang pandangan pribadi tentang branch, saya belajar lagi beberapa hal yang sempat saya lupakan.