Git Reset vs Kembalikan vs Rebase

Diterbitkan: 2021-05-20

Dalam artikel ini, Anda akan belajar tentang berbagai cara untuk bermain-main dengan commit di Git.

Sebagai pengembang, Anda akan mengalami situasi seperti itu beberapa kali di mana Anda ingin memutar kembali ke salah satu komitmen Anda sebelumnya tetapi tidak yakin bagaimana melakukannya. Dan bahkan jika Anda mengetahui perintah Git seperti reset, revert, rebase, Anda tidak menyadari perbedaan di antara mereka. Jadi mari kita mulai dan memahami apa itu git reset, revert, dan rebase.

Atur Ulang Git

Git reset adalah perintah yang kompleks, dan digunakan untuk membatalkan perubahan.

Anda dapat menganggap git reset sebagai fitur rollback. Dengan git reset, Anda dapat melompat di antara berbagai komit. Ada tiga mode menjalankan perintah git reset: –soft, –mixed, dan –hard. Secara default, perintah git reset menggunakan mode campuran. Dalam alur kerja reset git, tiga mekanisme manajemen internal git muncul: HEAD , staging area (indeks), dan working directory .

git reset - geekflare

Direktori kerja adalah tempat Anda bekerja saat ini, tempat file Anda berada. Menggunakan perintah git status, Anda dapat melihat semua file/folder yang ada di direktori kerja.

Staging Area (Indeks) adalah tempat git melacak dan menyimpan semua perubahan dalam file. Perubahan yang disimpan tercermin dalam direktori .git. Anda menggunakan git add "nama file" untuk menambahkan file ke area pementasan. Dan seperti sebelumnya, ketika Anda menjalankan git status, Anda akan melihat file mana yang ada di staging area.

Cabang saat ini di Git disebut sebagai HEAD. Ini menunjuk ke komit terakhir, yang terjadi di cabang checkout saat ini. Itu diperlakukan sebagai penunjuk untuk referensi apa pun. Setelah Anda checkout ke cabang lain, HEAD juga pindah ke cabang baru.

Mari saya jelaskan bagaimana git reset bekerja dalam mode hard, soft, dan campuran. Mode keras digunakan untuk pergi ke komit runcing, direktori kerja diisi dengan file komit itu, dan area pementasan diatur ulang. Dalam soft reset, hanya pointer yang diubah ke komit yang ditentukan. File semua komit tetap berada di direktori kerja dan area pementasan sebelum reset. Dalam mode campuran (default), penunjuk dan area pementasan keduanya diatur ulang.

Git Reset Keras

Tujuan hard reset git adalah untuk memindahkan HEAD ke komit yang ditentukan. Ini akan menghapus semua komit yang terjadi setelah komit yang ditentukan. Perintah ini akan mengubah riwayat komit dan menunjuk ke komit yang ditentukan.

Dalam contoh ini, saya akan menambahkan tiga file baru, mengkomitnya dan kemudian melakukan hard reset.

Seperti yang Anda lihat dari perintah di bawah ini, saat ini, tidak ada yang perlu dilakukan.

 $ git status On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean

Sekarang, saya akan membuat 3 file dan menambahkan beberapa konten ke dalamnya.

 $ vi file1.txt $ vi file2.txt $ vi file3.txt

Tambahkan file-file ini ke repositori yang ada.

 $ git add file*

Saat Anda menjalankan kembali perintah status, itu akan mencerminkan file baru yang baru saja saya buat.

 $ git status On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: file1.txt new file: file2.txt new file: file3.txt

Sebelum melakukan, izinkan saya menunjukkan kepada Anda, saat ini saya memiliki log 3 komitmen di Git.

 $ git log --oneline 0db602e (HEAD -> master) one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

Sekarang, saya akan berkomitmen ke repositori.

 $ git commit -m 'added 3 files' [master d69950b] added 3 files 3 files changed, 3 insertions(+) create mode 100644 file1.txt create mode 100644 file2.txt create mode 100644 file3.txt

Jika saya melakukan ls-files, Anda akan melihat file baru telah ditambahkan.

 $ git ls-files demo dummyfile newfile file1.txt file2.txt file3.txt

Ketika saya menjalankan perintah log di git, saya memiliki 4 komit, dan HEAD menunjuk ke komit terbaru.

 $ git log --oneline d69950b (HEAD -> master) added 3 files 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

Jika saya pergi dan menghapus file1.txt secara manual dan melakukan status git, itu akan menunjukkan pesan bahwa perubahan tidak dipentaskan untuk komit.

 $ git status On branch master Your branch is ahead of 'origin/master' by 3 commits. (use "git push" to publish your local commits) Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: file1.txt no changes added to commit (use "git add" and/or "git commit -a")

Sekarang, saya akan menjalankan perintah hard reset.

 $ git reset --hard HEAD is now at d69950b added 3 files

Jika saya memeriksa kembali statusnya, saya tidak akan menemukan apa pun untuk dikomit, dan file yang saya hapus telah kembali ke repositori. Rollback terjadi karena setelah menghapus file, saya tidak melakukan, jadi setelah hard reset, itu kembali ke keadaan sebelumnya.

 $ git status On branch master Your branch is ahead of 'origin/master' by 3 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean

Jika saya memeriksa log git, ini adalah tampilannya.

 $ git log commit d69950b7ea406a97499e07f9b28082db9db0b387 (HEAD -> master) Author: mrgeek <[email protected]> Date: Mon May 17 19:53:31 2020 +0530 added 3 files commit 0db602e085a4d59cfa9393abac41ff5fd7afcb14 Author: mrgeek <[email protected]> Date: Mon May 17 01:04:13 2020 +0530 one more commit commit 59c86c96a82589bad5ecba7668ad38aa684ab323 Author: mrgeek <[email protected]> Date: Mon May 17 00:54:53 2020 +0530 new commit commit e2f44fca2f8afad8e4d73df6b72111f2f2fd71ad (origin/master, origin/HEAD) Author: mrgeek <[email protected]> Date: Mon May 17 00:16:33 2020 +0530 test

Tujuan dari hard reset adalah untuk menunjuk ke komit yang ditentukan dan memperbarui direktori kerja dan area pementasan. Mari saya tunjukkan satu contoh lagi. Saat ini, visualisasi komit saya terlihat seperti di bawah ini:

susah payah

Di sini, saya akan menjalankan perintah dengan HEAD^, yang berarti saya ingin mengatur ulang ke komit sebelumnya (satu komit kembali).

 $ git reset --hard HEAD^ HEAD is now at 0db602e one more commit

Anda dapat melihat penunjuk kepala sekarang telah berubah menjadi 0db602e dari d69950b.

 $ git log --oneline 0db602e (HEAD -> master) one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

susah payah 1

Jika Anda memeriksa log, komit d69950b hilang, dan kepala sekarang menunjuk ke 0db602e SHA.

 $ git log commit 0db602e085a4d59cfa9393abac41ff5fd7afcb14 (HEAD -> master) Author: mrgeek <[email protected]> Date: Mon May 17 01:04:13 2020 +0530 one more commit commit 59c86c96a82589bad5ecba7668ad38aa684ab323 Author: mrgeek <[email protected]> Date: Mon May 17 00:54:53 2020 +0530 new commit commit e2f44fca2f8afad8e4d73df6b72111f2f2fd71ad (origin/master, origin/HEAD) Author: mrgeek <[email protected]> Date: Mon May 17 00:16:33 2020 +0530 Test

Jika Anda menjalankan ls-files, Anda dapat melihat file1.txt, file2.txt, dan files3.txt tidak ada di repositori lagi karena komit dan filenya dihapus setelah hard reset.

 $ git ls-files demo dummyfile newfile

Git Soft Reset

Demikian pula, sekarang saya akan menunjukkan kepada Anda contoh soft reset. Pertimbangkan, saya telah menambahkan 3 file lagi seperti yang disebutkan di atas dan mengkomitnya. Log git akan muncul seperti yang ditunjukkan di bawah ini. Anda dapat melihat 'soft reset' adalah komit terbaru saya, dan HEAD juga menunjuk ke sana.

 $ git log --oneline aa40085 (HEAD -> master) soft reset 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

Detail komit di log dapat dilihat menggunakan perintah di bawah ini.

 $ git log commit aa400858aab3927e79116941c715749780a59fc9 (HEAD -> master) Author: mrgeek <[email protected]> Date: Mon May 17 21:01:36 2020 +0530 soft reset commit 0db602e085a4d59cfa9393abac41ff5fd7afcb14 Author: mrgeek <[email protected]> Date: Mon May 17 01:04:13 2020 +0530 one more commit commit 59c86c96a82589bad5ecba7668ad38aa684ab323 Author: mrgeek <[email protected]> Date: Mon May 17 00:54:53 2020 +0530 new commit commit e2f44fca2f8afad8e4d73df6b72111f2f2fd71ad (origin/master, origin/HEAD) Author: mrgeek <[email protected]> Date: Mon May 17 00:16:33 2020 +0530 test

Sekarang menggunakan soft reset, saya ingin beralih ke salah satu komit lama dengan SHA 0db602e085a4d59cfa9393abac41ff5fd7afcb14

Untuk melakukan itu, saya akan menjalankan perintah di bawah ini. Anda harus melewati lebih dari 6 karakter awal SHA, SHA lengkap tidak diperlukan.

 $ git reset --soft 0db602e085a4

Sekarang ketika saya menjalankan git log, saya dapat melihat HEAD telah diatur ulang ke komit yang saya tentukan.

 $ git log commit 0db602e085a4d59cfa9393abac41ff5fd7afcb14 (HEAD -> master) Author: mrgeek <[email protected]> Date: Mon May 17 01:04:13 2020 +0530 one more commit commit 59c86c96a82589bad5ecba7668ad38aa684ab323 Author: mrgeek <[email protected]> Date: Mon May 17 00:54:53 2020 +0530 new commit commit e2f44fca2f8afad8e4d73df6b72111f2f2fd71ad (origin/master, origin/HEAD) Author: mrgeek <[email protected]> Date: Mon May 17 00:16:33 2020 +0530 test

Tapi perbedaannya di sini adalah, file dari komit (aa400858aab3927e79116941c715749780a59fc9) di mana saya telah menambahkan 3 file masih dalam direktori kerja saya. Mereka belum dihapus. Itu sebabnya Anda harus menggunakan soft reset daripada hard reset. Tidak ada risiko kehilangan file dalam mode lunak.

 $ git ls-files demo dummyfile file1.txt file2.txt file3.txt newfile

Kembalikan Git

Di Git, perintah revert digunakan untuk melakukan operasi revert, yaitu untuk mengembalikan beberapa perubahan. Ini mirip dengan perintah reset, tetapi satu-satunya perbedaan di sini adalah Anda melakukan komit baru untuk kembali ke komit tertentu. Singkatnya, adil untuk mengatakan bahwa perintah git revert adalah komit.

Perintah revert Git tidak menghapus data apa pun saat melakukan operasi revert.

Katakanlah saya menambahkan 3 file dan melakukan operasi git commit untuk contoh revert.

 $ git commit -m 'add 3 files again' [master 812335d] add 3 files again 3 files changed, 3 insertions(+) create mode 100644 file1.txt create mode 100644 file2.txt create mode 100644 file3.txt

Log akan menampilkan komit baru.

 $ git log --oneline 812335d (HEAD -> master) add 3 files again 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

Sekarang saya ingin kembali ke salah satu komit saya sebelumnya, katakanlah – “59c86c9 komit baru”. Saya akan menjalankan perintah di bawah ini.

 $ git revert 59c86c9

Ini akan membuka file, Anda akan menemukan detail komit yang Anda coba kembalikan, dan Anda dapat memberi nama komit baru Anda di sini, lalu simpan dan tutup file.

 Revert "new commit" This reverts commit 59c86c96a82589bad5ecba7668ad38aa684ab323. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Your branch is ahead of 'origin/master' by 4 commits. # (use "git push" to publish your local commits) # # Changes to be committed: # modified: dummyfile

Setelah Anda menyimpan dan menutup file, ini adalah output yang akan Anda dapatkan.

 $ git revert 59c86c9 [master af72b7a] Revert "new commit" 1 file changed, 1 insertion(+), 1 deletion(-)

Sekarang untuk membuat perubahan yang diperlukan, tidak seperti reset, revert telah melakukan satu lagi komit baru. Jika Anda memeriksa log lagi, Anda akan menemukan komit baru karena operasi pengembalian.

 $ git log --oneline af72b7a (HEAD -> master) Revert "new commit" 812335d add 3 files again 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

git kembali

Git log akan memiliki semua riwayat komit. Jika Anda ingin menghapus komit dari riwayat, maka revert bukanlah pilihan yang baik, tetapi jika Anda ingin mempertahankan perubahan komit dalam riwayat, maka revert adalah perintah yang sesuai alih-alih reset.

Git Rebase

Di Git, rebase adalah cara memindahkan atau menggabungkan komit dari satu cabang ke cabang lain. Sebagai pengembang, saya tidak akan membuat fitur saya di cabang master dalam skenario dunia nyata. Saya akan bekerja di cabang saya sendiri ('cabang fitur'), ​​dan ketika saya memiliki beberapa komit di cabang fitur saya dengan fitur yang ditambahkan, saya kemudian ingin memindahkannya ke cabang master.

Rebase terkadang bisa sedikit membingungkan untuk dipahami karena sangat mirip dengan penggabungan. Tujuan menggabungkan dan rebasing keduanya adalah untuk mengambil komit dari cabang fitur saya dan meletakkannya di cabang master atau cabang lainnya. Pertimbangkan, saya memiliki grafik yang terlihat seperti ini:

git rebase

Misalkan Anda bekerja dalam tim dengan pengembang lain. Dalam hal ini, Anda dapat membayangkan bahwa ini bisa menjadi sangat kompleks di mana Anda memiliki banyak pengembang lain yang bekerja pada cabang fitur yang berbeda, dan mereka telah menggabungkan beberapa perubahan. Ini menjadi membingungkan untuk dilacak.

Jadi, di sinilah rebase akan membantu. Kali ini, alih-alih melakukan git merge, saya akan melakukan rebase, di mana saya ingin mengambil dua komit cabang fitur saya dan memindahkannya ke cabang master. Sebuah rebase akan mengambil semua komit saya dari cabang fitur dan memindahkannya di atas komit cabang master. Jadi, di balik layar, git menduplikasi komit cabang fitur di cabang master.

git rebase 1

Pendekatan ini akan memberi Anda grafik garis lurus yang bersih dengan semua komit berturut-turut.

git kembali 2

Itu membuatnya mudah untuk melacak komit apa yang pergi ke mana. Bisa dibayangkan jika Anda berada dalam satu tim dengan banyak developer, semua commit masih berurutan. Jadi, sangat mudah untuk diikuti bahkan jika Anda memiliki banyak orang yang mengerjakan proyek yang sama pada waktu yang bersamaan.

Mari saya tunjukkan ini secara praktis.

Beginilah tampilan cabang master saya saat ini. Ini memiliki 4 komit.

 $ git log --oneline 812335d (HEAD -> master) add 3 files again 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

Saya akan menjalankan perintah di bawah ini untuk membuat dan beralih ke cabang baru yang disebut fitur, dan cabang ini akan dibuat dari komit ke-2, yaitu 59c86c9

 (master) $ git checkout -b feature 59c86c9 Switched to a new branch 'feature'

Jika Anda memeriksa log di cabang fitur, hanya ada 2 komit yang berasal dari master (jalur utama).

 (feature) $ git log --oneline 59c86c9 (HEAD -> feature) new commit e2f44fc (origin/master, origin/HEAD) test

Saya akan membuat fitur 1 dan mengkomitnya ke cabang fitur.

 (feature) $ vi feature1.txt (feature) $ git add . The file will have its original line endings in your working directory (feature) $ git commit -m 'feature 1' [feature c639e1b] feature 1 1 file changed, 1 insertion(+) create mode 100644 feature1.txt

Saya akan membuat satu fitur lagi, yaitu fitur 2, di cabang fitur dan mengkomitnya.

 (feature) $ vi feature2.txt (feature) $ git add . The file will have its original line endings in your working directory (feature) $ git commit -m 'feature 2' [feature 0f4db49] feature 2 1 file changed, 1 insertion(+) create mode 100644 feature2.txt

Sekarang, jika Anda memeriksa log cabang fitur, ia memiliki dua komit baru, yang saya jalankan di atas.

 (feature) $ git log --oneline 0f4db49 (HEAD -> feature) feature 2 c639e1b feature 1 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

Sekarang saya ingin menambahkan dua fitur baru ini ke cabang master. Untuk itu, saya akan menggunakan perintah rebase. Dari cabang fitur, saya akan melakukan rebase terhadap cabang master. Apa yang akan dilakukan adalah menambatkan kembali cabang fitur saya terhadap perubahan terbaru.

 (feature) $ git rebase master Successfully rebased and updated refs/heads/feature.

Sekarang saya akan melanjutkan dan memeriksa cabang master.

 (feature) $ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 3 commits. (use "git push" to publish your local commits)

Dan akhirnya, rebase cabang master dengan cabang fitur saya. Ini akan mengambil dua komit baru di cabang fitur saya dan memutar ulang mereka di atas cabang master saya.

 (master) $ git rebase feature Successfully rebased and updated refs/heads/master.

Sekarang jika saya memeriksa log di cabang master, saya dapat melihat dua komit dari cabang fitur saya telah berhasil ditambahkan ke cabang master saya.

 (master) $ git log --oneline 766c996 (HEAD -> master, feature) feature 2 c036a11 feature 1 812335d add 3 files again 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test

Itu semua tentang perintah reset, revert dan rebase di Git.

Kesimpulan

Itu semua tentang perintah reset, revert dan rebase di Git. Saya harap panduan langkah demi langkah ini bermanfaat. Sekarang, Anda tahu cara bermain-main dengan komitmen Anda sesuai kebutuhan menggunakan perintah yang disebutkan dalam artikel.