Bagikan melalui


Memahami penyederhanaan riwayat Git

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Penyederhanaan riwayat Git bisa menjadi hal yang rumit dan membingungkan. 99% waktu Anda bahkan tidak akan tahu itu ada, tetapi kadang-kadang akan melompat keluar dari sudut-sudut gelap Git dan menggigit Anda. Dalam artikel ini, kita akan menjelajahi apa itu penyederhanaan riwayat dan bagaimana hal itu dapat menyebabkan kebingungan saat melihat riwayat file.

Mari kita mulai dengan skenario umum:

  1. Anda mendorong perubahan ke file lalu menggabungkan perubahan menjadi utama.
  2. Beberapa kolega Anda juga menggabungkan cabang mereka ke cabang utama.
  3. Anda kembali beberapa waktu kemudian dan melihat perubahan Anda hilang.
  4. Saat mencari pelakunya, Anda memeriksa riwayat file dan menyadari... perubahan Anda bahkan tidak tercantum!?

Riwayat penerapan Git adalah pohon. Terkadang, riwayat kronologis tidak sama dengan riwayat pohon file yang sebenarnya. Situasi ini paling sering terjadi ketika penerapan penggabungan mengembalikan file kembali ke status aslinya. Dalam hal ini, tampilan riwayat default tidak akan benar-benar menunjukkan kepada Anda semua perubahan, karena secara teknis file tidak berubah. Dalam skenario ini, Git menyadari bahwa itu dapat menyederhanakan riwayat dan "perubahan" yang kemungkinan besar Anda cari dihapus dari log.

Kecuali Anda telah mengalaminya sebelumnya, Anda mungkin menjadi frustrasi, bertanya-tanya Ke mana perginya perubahan yang saya buat?

Penyederhanaan riwayat: Diaktifkan secara otomatis

Secara bawaan, menjalankan perintah log pada file: git log file.txt akan otomatis menyederhanakan riwayat dan mungkin menyembunyikan beberapa commit dari keluarannya. Untuk informasi selengkapnya, lihat halaman git log man.

Apa yang menambah kebingungan adalah bahwa penyederhanaan riwayat tidak tidak terjadi jika Anda hanya menjalankan git log, karena Anda melihat semua perubahan tidak ada yang perlu disederhanakan.

Untuk menonaktifkan penyederhanaan riwayat, Anda perlu menggunakan sakelar baris perintah --full-history.

Contoh Penyederhanaan Riwayat

Untuk lebih memahami cara kerja penyederhanaan, kami membuat contoh penyederhanaan sejarah kami sendiri. Pertama, mari kita lihat diagram riwayat yang akan kita buat:

Cabang Git

Seperti yang Anda lihat, kita akan:

  1. Buat file.
  2. Tambahkan baris ke file tersebut di cabang (hewan).
  3. Tambahkan baris yang berbeda ke file tersebut di cabang lain (buah).
  4. Gabungkan cabang hewan kembali ke cabang utama.
  5. Gabungkan cabang buah kembali ke utama, dan pilih seluruh salinan file dari cabang buah.
  6. Periksa riwayat file.

Git akan menyederhanakan sejarah bagi kita. Langkah 5 adalah kuncinya di sini. Kami mengabaikan semua perubahan dari cabang hewan . Git akan melihat bahwa file kami pada dasarnya tidak berubah antara langkah 1 dan langkah 5, sehingga hanya akan menunjukkan kepada kita dua entri riwayat.

Pertama, kita membuat file dan menambahkannya ke repositori kita:

> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"

Sekarang kami memutuskan untuk menambahkan teks "keledai" ke file di cabang hewan:

> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"

Saat kita bereksperimen, kita memutuskan mungkin kita ingin menggunakan buah dalam file kita, jadi kita membuat cabang baru dan menambahkan teks "pisang" di akhir file.

> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"

Merasa puas dengan perubahan yang telah kami buat, kami memutuskan untuk menggabungkan kembali cabang hewan kami ke cabang utama.

> git checkout main
> git merge animals

Sekarang mari kita lihat log untuk file test.txt kita:

> git log test.txt
    
    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Sejauh ini begitu baik, kan? Tidak ada yang terlihat luar biasa dalam output log kami. Sekarang katakanlah kita berubah pikiran dan memutuskan untuk menggabungkan cabang buah kita:

>git merge fruit
    
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.

Uh-oh, konflik penggabungan. Setelah beberapa pertimbangan, kami memutuskan untuk menggunakan seluruh file test.txt dari divisi buah kami. Biasanya Anda akan menggunakan semacam editor teks atau alat penggabungan, tetapi kami hanya akan membuat ulang seluruh file, karena hanya dua baris:

> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"

Sekarang mari kita lihat riwayat untuk file test.txt kami:

> git log test.txt
    
    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Tentu saja, kita tidak melihat perubahan apa pun dari eksperimen pertama kita di log, kita juga tidak melihat penggabungan kita! Apakah mereka masih di sana? Apakah Git menghilangkan perubahan sepenuhnya?

> git log --full-history test.txt

Seperti yang Anda lihat, meskipun menyederhanakan log tanpa bendera full-history, Git telah menyimpan semua perubahan kami:

> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
    Merge: 6b33d99 fdd4dfd
        Date:   Mon Feb 15 10:59:34 2016 -0500

        Fixed merge conflict

    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Ringkasan penyederhanaan riwayat Git

Hal tentang penyederhanaan sejarah adalah bahwa sebagian besar waktu Anda tidak akan pernah menyadarinya. Tetapi ketika konflik penggabungan menjadi kacau dan Anda ingin tahu apa yang terjadi, Anda mungkin mendapati diri Anda melihat riwayat log git dan bertanya-tanya ke mana perginya perubahan Anda.

Sekarang, alih-alih panik, Anda tahu bahwa:

  • Penyederhanaan riwayat untuk file diaktifkan secara default
  • Bendera --full-history akan memberi Anda riwayat file yang lebih komprehensif

Update: Sejak saya menulis artikel ini, Azure DevOps Services telah memperkenalkan beberapa opsi tampilan riwayat di web yang mengagumkan. Apa yang dimaksudkan di sini adalah bahwa jika Anda tidak ingin melalui proses rumit di baris perintah, Anda dapat dengan mudah membuka file yang ingin Anda lihat riwayatnya di penjelajah berkas kami dan Anda akan disajikan dengan filter riwayat berikut di mana Anda dapat menentukan tampilan riwayat yang sederhana atau tidak sederhana.

Filter Git

(c) 2016 Microsoft Corporation. Seluruh hak cipta dilindungi. Dokumen ini disediakan "as-is." Informasi dan tampilan yang dinyatakan dalam dokumen ini, termasuk URL dan referensi situs Web Internet lainnya, dapat berubah tanpa pemberitahuan. Anda menanggung risiko menggunakannya.

Dokumen ini tidak memberi Anda hak hukum apa pun atas kekayaan intelektual apa pun dalam produk Microsoft apa pun. Anda dapat menyalin dan menggunakan dokumen ini sebagai referensi internal.