Bagikan melalui


Memahami simplifikasi histori Git

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

Penyederhanaan riwayat Git bisa menjadi binatang buas yang membingungkan. 99% dari 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 utama.
  3. Anda kembali beberapa waktu kemudian dan melihat perubahan Anda hilang.
  4. Mencari pelakunya, Anda pergi melihat riwayat file dan pemberitahuan ... 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 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 Di mana sih melakukan perubahan saya pergi?

Penyederhanaan riwayat: Aktif secara Default

Secara default, menjalankan perintah log pada file: git log file.txt akan secara otomatis menyederhanakan riwayat, mungkin menyembunyikan beberapa penerapan dari outputnya. Untuk informasi selengkapnya, lihat halaman git log man.

Apa yang menambah kebingungan adalah bahwa penyederhanaan riwayat 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 --full-historybaris perintah .

Contoh Penyederhanaan Riwayat

Untuk lebih memahami cara kerja penyederhanaan, kami membuat contoh penyederhanaan riwayat 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 hewan cabang kembali ke utama.
  5. Gabungkan buah cabang 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 pergi dengan buah dalam file kita sebagai gantinya, jadi kita membuat cabang yang berbeda dan menambahkan teks "pisang" di akhir file sebagai gantinya:

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

Merasa puas dengan perubahan kami, kami memutuskan untuk menggabungkan cabang hewan kami kembali ke utama:

> git checkout main
> git merge animals

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

> 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 test.txt file dari cabang 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 kita test.txt :

> 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 full-history bendera, 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 salah dan Anda ingin tahu apa yang terjadi, Anda mungkin menemukan diri Anda melihat riwayat log git dan bertanya-tanya ke mana perubahan Anda pergi.

Sekarang, alih-alih panik, Anda tahu bahwa:

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

Pembaruan: Karena saya menulis artikel ini, Azure DevOps Services telah memperkenalkan sejumlah opsi tampilan riwayat yang mengagumkan di web. Apa artinya ini adalah bahwa jika Anda tidak ingin masuk ke slogging melalui baris perintah, Anda cukup menarik file yang ingin Anda lihat riwayatnya di penjelajah kami dan Anda akan disajikan dengan filter riwayat di bawah ini di mana Anda dapat menentukan tampilan riwayat sederhana atau tidak sederhana:

Filter Git

(c) 2016 Microsoft Corporation. Semua hak dilindungi undang-undang. Dokumen ini disediakan "apa adanya." 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 memberikan hak hukum apa pun kepada Anda atas kekayaan intelektual apa pun di semua produk Microsoft. Anda dapat menyalin dan menggunakan dokumen ini sebagai referensi internal.