Panduan Git Tingkat Lanjut: Git Stash, Reset, Rebase, dan Lainnya
Diterbitkan: 2022-03-11Setiap pengembang harus memiliki pemahaman yang baik tentang kontrol versi, dan Git telah menjadi standar de-facto untuk kontrol versi dalam pengembangan perangkat lunak.
Namun seringkali, pengembang hanya mempelajari beberapa perintah sederhana dan mengabaikan kekuatan sejarah Git dan hal-hal lain yang dapat dilakukan Git untuk membuat Anda jauh lebih efisien. Misalnya, mengelola rilis sangat mudah dengan Git menggunakan git tag
.
Saya mengambil kursus lanjutan di Git online (dengan Github) dan mulai mengajar kelas Git pemula bersama dengan Github. Ketika saya melihat tidak banyak artikel teknis tentang fitur Git favorit saya, saya langsung mengambil kesempatan untuk membagikannya dengan sesama pengembang. Dalam posting ini, Anda akan belajar bagaimana memanfaatkan fungsi Git lanjutan berikut:
-
git stash
, yang membuat penyimpanan lokal sementara dari kode Anda -
git reset
, yang memungkinkan Anda merapikan kode sebelum melakukan komit -
git bisect
, fungsi yang memungkinkan Anda untuk mencari komit buruk -
git squash
, yang memungkinkan Anda untuk menggabungkan komit Anda -
git rebase
, yang memungkinkan untuk menerapkan perubahan dari satu cabang ke cabang lainnya
Git Stash
Git stash memungkinkan Anda untuk menyimpan kode Anda tanpa membuat komit. Bagaimana ini berguna? Gambarkan skenario berikut:
Anda telah membuat tiga komit yang rapi dan rapi, tetapi Anda juga memiliki beberapa kode yang tidak dikomit yang cukup berantakan; Anda tidak akan ingin mengkomitnya tanpa menghapus kode debug Anda terlebih dahulu. Kemudian, untuk beberapa alasan, Anda tiba-tiba harus mengerjakan tugas lain dan harus berpindah cabang. Hal ini sering terjadi jika Anda berada di cabang main
Anda, dan Anda lupa membuat cabang baru untuk fitur Anda. Saat ini, kode Anda terlihat seperti ini:
$ git status On branch my-feature Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss no changes added to commit (use "git add" and/or "git commit -a")
$ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; }
Saat Anda menjalankan git stash
, kode yang tidak dikomit menghilang tanpa dikomit. Menyimpan seperti menyimpan komit lokal sementara ke cabang Anda. Tidak mungkin untuk mendorong simpanan ke repositori jarak jauh, jadi simpanan hanya untuk penggunaan pribadi Anda sendiri.
$ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color
Cabang Anda sekarang muncul seperti saat Anda membuat komit terakhir Anda. Sekarang, Anda dapat dengan aman mengubah cabang tanpa kehilangan kode atau komit yang berantakan. Saat Anda beralih kembali ke cabang Anda dan menjalankan git stash list
, Anda akan melihat daftar simpanan yang terlihat seperti ini:
$ git stash list stash@{0}: WIP on my-feature: 49ee696 Change text color
Anda dapat dengan mudah menerapkan kembali konten yang disimpan dengan menjalankan git stash apply
. Anda juga dapat menerapkan simpanan tertentu (jika Anda telah menyimpan lebih dari sekali) dengan menjalankan git stash apply stash@{1}
('1' menunjukkan yang kedua sebelum simpanan terakhir). Berikut adalah contoh menyimpan lebih dari satu komit dan menerapkan simpanan yang berbeda:
$ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; } $ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..b63c664 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; } $ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color
$ git stash list stash@{0}: WIP on my-feature: 49ee696 Change text color stash@{1}: WIP on my-feature: 49ee696 Change text color stash@{2}: WIP on my-feature: 49ee696 Change text color $ git stash apply stash@{2} On branch my-feature Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss no changes added to commit (use "git add" and/or "git commit -a")
git stash apply stash@{2}
telah menerapkan kode simpanan tertua, ketika kami mengubah warna teks menjadi merah.
$ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; }
Jika Anda memutuskan untuk tidak melakukan pekerjaan Anda setelah Anda memulihkan simpanan, Anda dapat menjalankan git checkout .
, yang mengatur ulang semua kode yang tidak dikomit.
Sebagai contoh lain tentang cara menggunakan Git stash: katakanlah Anda memiliki beberapa file baru, salah satunya memiliki bug. Biarkan semua kecuali file bug yang dicurigai tidak dipentaskan (kode harus dipentaskan untuk disimpan), maka Anda dapat menyimpan file itu dan memecahkan masalah. Jika file simpanan tidak menjadi masalah, Anda dapat memulihkan simpanan tersebut.
$ git status On branch my-feature Untracked files: (use "git add <file>..." to include in what will be committed) css/colors.scss nothing added to commit but untracked files present (use "git add" to track)
$ git add css/colors.scss $ git stash Saved working directory and index state WIP on my-feature: 0d8deef delete colors $ git status On branch my-feature nothing to commit, working tree clean $ git stash apply stash@{0} On branch my-feature Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: css/colors.scss
Anda juga dapat membawa komit simpanan Anda ke cabang fitur baru atau cabang debugging dengan menggunakan git stash branch
:
$ git status On branch my-feature Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss no changes added to commit (use "git add" and/or "git commit -a") $ git stash Saved working directory and index state WIP on my-feature: 66f3f3b Add colors file $ git stash branch debugging-branch M css/common.scss Switched to a new branch 'debugging-branch' Unstaged changes after reset: M css/common.scss On branch debugging-branch Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss Dropped refs/stash@{0} (d140624f60d8deef7bceb0d11fc80ed4fd47e0a1)
Perhatikan bahwa ketika Anda telah menerapkan simpanan, simpanan tidak dihapus. Anda dapat menghapus simpanan satu per satu dengan menggunakan git drop
, atau menghapus semua simpanan dengan menggunakan git stash clear
:
$ git stash list stash@{0}: WIP on my-feature: 66f3f3b Add colors file stash@{1}: WIP on my-feature: 0d8deef delete colors stash@{2}: WIP on my-feature: 49ee696 Change text color $ git stash drop stash@{2} Dropped stash@{2} (8ed6d2ce101aa2e28c8ccdc94cb12df8e5c468d6) $ git stash list stash@{0}: WIP on my-feature: 66f3f3b Add colors file stash@{1}: WIP on my-feature: 0d8deef delete colors $ git stash clear $ git stash list $
Atur Ulang Git
Jika Anda menemukan diri Anda dalam situasi di mana Anda secara tidak sengaja melakukan beberapa kode yang berantakan, Anda dapat melakukan reset "lunak". Ini berarti bahwa kode tersebut muncul seolah-olah belum di-commit. Kemudian Anda dapat merapikan kode Anda di IDE Anda sebelum membuat komit yang lebih bersih. Untuk melakukan ini, Anda dapat menjalankan git reset --soft HEAD~1
. Ini akan mengatur ulang komit terbaru. Anda dapat mengatur ulang lebih dari satu komit dengan mengubah nomor setelah ~
misalnya git reset --soft HEAD~2
.
$ git reset --soft HEAD~1 $ git status On branch debugging-branch Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: css/common.scss Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss
$ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: $grey; + color: red; background-color: #f00; }
Reset Git sedikit lebih membingungkan, terutama saat mengajar pengguna Git baru. Soft reset harus dicadangkan untuk kesalahan asli sedangkan simpanan dapat digunakan untuk menukar kode masuk dan keluar.
Anda juga dapat melakukan hard reset ( git reset --hard HEAD~1
). Jenis reset ini pada dasarnya menghapus komit terakhir Anda. Anda harus sangat berhati-hati dalam melakukan hard reset, terutama jika Anda mendorong cabang Anda, karena tidak ada cara untuk memulihkan komit Anda.
Git Membagi
Alat Git favorit saya adalah git bisect
. Saya hanya membutuhkannya beberapa kali tetapi ketika saya melakukannya, itu sangat berharga! Saya terutama menggunakannya pada basis kode besar di mana ada masalah di mana tidak ada yang menemukan akar penyebabnya, bahkan setelah beberapa debugging yang kuat.
git bisect
pada dasarnya melakukan pencarian biner antara dua komit yang diberikan dan kemudian memberi Anda detail komit tertentu. Pertama-tama Anda harus memberi Git komit yang baik, di mana Anda tahu fungsionalitas Anda berfungsi, dan komit yang buruk. Perhatikan bahwa selama Anda memiliki satu komit baik dan satu komit buruk, komit dapat terpisah bertahun-tahun (walaupun semakin jauh ke masa lalu, semakin sulit jadinya!).
Hal yang paling menyenangkan tentang git bisect
adalah bahwa Anda biasanya tidak benar-benar tahu siapa yang menulis komit kereta saat Anda memulai. Kegembiraan mencari tahu di mana bug itu diperkenalkan telah lebih dari sekali menyebabkan beberapa rekan kerja berkerumun di sekitar komputer saya!
Untuk memulai, periksa cabang buggy dan temukan komit yang baik. Anda harus menelusuri riwayat komit Anda dan menemukan hash komit, lalu memeriksa komit spesifik itu dan menguji cabang Anda. Setelah Anda menemukan tempat yang baik dan buruk untuk bekerja, Anda dapat menjalankan git bisect
.
Dalam skenario ini, teks berwarna merah di situs web yang kami buat ini (meskipun bisa menggunakan desainer UI) tetapi kami tidak tahu bagaimana atau kapan itu dibuat merah. Ini adalah contoh yang sangat sederhana, dalam skenario kehidupan nyata Anda mungkin memiliki masalah yang kurang jelas, misalnya formulir tidak terkirim/berfungsi.
Saat kita menjalankan git log
, kita dapat melihat daftar komit untuk dipilih.
$ git log commit a3cfe7f935c8ad2a2c371147b4e6dcd1a3479a22 (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Update .gitignore file for .DS_Store commit 246e90977790967f54e878a8553332f48fae6edc Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:51:23 2021 +0100 Change styling of page commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit 032a41136b6653fb9f7d81aef573aed0dac3dfe9 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:42:57 2021 +0100 Change text color commit 246e90977790967f54e878a8553332f48fae6edc Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:41:23 2021 +0100 delete colors commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:07:36 2021 +0100 ...
Jika saya membuka halaman web saya pada hash komit terbaru, teksnya berwarna merah, jadi saya tahu saya punya masalah.
Sekarang kita mulai membagi dua dan memberi tahu Git bahwa kita memiliki komit yang buruk.
$ git bisect start $ git bisect bad 8d4615b9a963ef235c2a7eef9103d3b3544f4ee1
Sekarang kita kembali ke masa lalu untuk mencoba dan menemukan komit di mana teksnya tidak berwarna merah. Di sini saya mencoba memeriksa komit pertama saya ...
$ git checkout ce861e4c6989a118aade031020fd936bd28d535b Note: checking out 'ce861e4c6989a118aade031020fd936bd28d535b'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at ce861e4 Add CSS styles
…dan menyegarkan halaman web…
Teksnya tidak lagi merah, jadi ini adalah komitmen yang bagus! Semakin baru komit, yaitu, semakin dekat dengan komit buruk, semakin baik:
$ git checkout d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Previous HEAD position was ce861e4c6989a118aade031020fd936bd28d535b Add CSS styles HEAD is now at d647ac4 Change text color
Git sekarang akan memberi tahu Anda berapa banyak komit yang harus dicari sebelum menemukan yang tepat. Jumlah komit yang akan dilintasi Git tergantung pada berapa banyak komit di antara komit baik dan buruk (semakin lama waktu, semakin banyak Git perlu iterasi).
Sekarang, Anda perlu menguji cabang Anda lagi dan melihat apakah masalah Anda telah hilang. Terkadang ini bisa sedikit merepotkan jika Anda memperbarui modul secara teratur, karena Anda mungkin perlu menginstal ulang modul node pada repositori front end Anda. Jika ada pembaruan basis data, Anda mungkin juga perlu memperbaruinya.
git bisect
secara otomatis memeriksa komit di tengah komit baik dan buruk Anda. Ini dia memperkirakan satu langkah untuk menemukan komit yang buruk.
$ git bisect good 1cdbd113cad2f452290731e202d6a22a175af7f5 Bisecting: 1 revision left to test after this (roughly 1 step) [ce861e4c6989a118aade031020fd936bd28d535b] Add CSS styles $ git status HEAD detached at ce861e4 You are currently bisecting, started from branch '8d4615b'. (use "git bisect reset" to get back to the original branch)
Segarkan halaman, dan lihat apakah masalah Anda telah hilang. Masalahnya masih ada, jadi kami memberi tahu Git bahwa ini masih merupakan komit yang buruk. Tidak perlu merujuk hash komit kali ini karena Git akan menggunakan komit yang telah Anda periksa. Kita perlu mengulangi proses ini sampai Git melewati semua langkah yang mungkin.
$ git bisect bad Bisecting: 0 revisions left to test after this (roughly 0 steps) [cbf1b9a1be984a9f61b79ae5f23b19f66d533537] Add second paragraph to page
Segarkan halaman, dan masalah kami hilang lagi, jadi ini adalah komitmen yang baik:

Pada tahap ini Git telah menemukan komit buruk pertama:
$ git bisect good ce861e4c6989a118aade031020fd936bd28d535b is the first bad commit commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Add CSS styles :000000 100644 0000000000000000000000000000000000000000 092bfb9bdf74dd8cfd22e812151281ee9aa6f01a M css
Sekarang kita dapat menggunakan git show
untuk menunjukkan komit itu sendiri dan mengidentifikasi masalahnya:
$ git show ce861e4c6989a118aade031020fd936bd28d535b commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Add CSS styles diff --git a/css/base.scss b/css/base.scss index e69de29..26abf0f 100644 --- a/css/base.scss +++ b/css/base.scss @@ -1,7 +1,7 @@ body { background-color: $white; margin: 0px; line-height: 20px; - color: $grey; + color: red; }
Setelah selesai, Anda dapat menjalankan git bisect reset
untuk mengatur ulang cabang Anda ke kondisi kerja normal.
Semakin dekat komit, semakin mudah Git dapat menemukan masalahnya, tetapi saya sudah mengambil 10 langkah sebelumnya dan masih menemukan komit buruk dengan mudah. Itu tidak dijamin berhasil, tetapi itu telah menemukan masalah sebagian besar waktu bagi saya. Selamat, sekarang Anda adalah arkeolog kode!
Menekan Komitmen Anda
Saya sebelumnya bekerja penuh waktu pada proyek sumber terbuka untuk organisasi global dan saya dengan cepat belajar betapa pentingnya menekan—atau menggabungkan—komit Anda. Saya pikir itu adalah kebiasaan yang sangat baik untuk dilakukan, bahkan jika majikan Anda tidak mengharuskannya. Ini sangat mempertimbangkan pengembang lain yang perlu meninjau dan mengedit fitur yang telah Anda buat nanti.
Mengapa menghancurkan komitmen Anda?
- Lebih mudah bagi kontributor untuk membaca repositori Anda. Bayangkan jika Anda memiliki daftar komit seperti ini:
- Terapkan penggeser korsel
- Tambahkan gaya ke carousel
- Tambahkan tombol ke carousel
- Perbaiki masalah aneh di IE dengan carousel
- Sesuaikan margin di carousel
Jauh lebih mudah untuk memasukkan ini ke dalam satu komit yang mengatakan "Tambahkan korsel ke beranda".
- Ini mendorong Anda untuk menjaga agar pesan komit Anda dapat dimengerti dan relevan jika setiap kali Anda membuat permintaan tarik, Anda harus meremas komit Anda menjadi satu. Berapa kali Anda melihat komit berjudul "WIP", "perbaikan bug untuk halaman login", atau "perbaiki kesalahan ketik"? Penting untuk memiliki nama komit yang relevan, misalnya "Perbaikan bug untuk halaman login #444 - perbaiki kedipan karena fungsi $scope hilang".
Alasan Anda mungkin tidak ingin menghentikan komit Anda mungkin karena Anda sedang mengerjakan fitur yang sangat mendetail dan panjang, dan ingin menyimpan riwayat harian untuk diri sendiri jika Anda menemukan bug di kemudian hari. Maka fitur Anda lebih mudah untuk di-debug. Namun, ketika memeriksa fitur Anda ke cabang utama Anda dan Anda yakin itu bebas bug, masih masuk akal untuk melakukan squash.
Dalam skenario ini, saya telah membuat lima komit, tetapi semuanya terkait dengan satu fitur. Pesan komit saya juga terkait erat dengan kelayakan untuk dipisahkan—semua komit saya adalah tentang menata halaman untuk fitur baru ini:
$ git log commit a8fbb81d984a11adc3f72ce27dd0c39ad24403b7 (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 11:16:10 2021 +0100 Import colors commit e2b3ddd5e8b2cb1e61f88350d8571df51d43bee6 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 11:15:32 2021 +0100 Add new color commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit c005d9ceeefd4a8d4e553e825fa40aaafdac446e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 09:59:57 2021 +0100 Add CSS styles commit 9e046b7df59cef07820cc90f694fabc666731bd2 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 09:56:28 2021 +0100 Add second paragraph to page commit 5aff973577d67393d914834e8af4c5d07248d628 Author: Ursula Clarke <[email protected]> Date: Mon Jan 10 16:04:22 2021 +0100 Add colors CSS file and edit background color
Anda juga dapat menggunakan git merge --squash
, tetapi saya pikir lebih jelas menggunakan rebase
karena ketika Anda memilih komit, lebih mudah untuk melihat deskripsi komit. Jika Anda menjalankan git merge --squash
, pertama-tama Anda harus melakukan hard reset pada komit Anda ( git reset --hard HEAD~1
), dan mudah menjadi bingung dengan berapa banyak komit yang perlu Anda lakukan. Saya menemukan git rebase
lebih visual.
Mulailah dengan menjalankan git rebase -i --root
dan editor teks default Anda pada baris perintah akan terbuka dengan daftar komit Anda:
pick eb1eb3c Update homepage pick 5aff973 Add colors CSS file and edit background color pick 9e046b7 Add second paragraph to page pick c005d9c Add CSS styles pick d647ac4 Change text color pick e2b3ddd Add new color pick a8fbb81 Import colors # Rebase a8fbb81 onto b862ff2 (7 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
Anda mungkin hanya ingin menekan beberapa komit terakhir Anda, dalam hal ini Anda dapat menjalankan git rebase -i HEAD~3
dan disajikan dengan tiga komit terakhir Anda:
pick eb1eb3c Update homepage pick 5aff973 Add colors CSS file and edit background color pick 9e046b7 Add second paragraph to page # Rebase b862ff2..9e046b7 onto b862ff2 (3 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
Sekarang kita dapat memasukkan semua komit ke komit pertama seperti yang ditunjukkan di bawah ini.
pick eb1eb3c Update homepage squash 5aff973 Add colors CSS file and edit background color squash 9e046b7 Add second paragraph to page # Rebase b862ff2..9e046b7 onto b862ff2 (3 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
Saat Anda menyimpan file, Git akan membuka pesan komit Anda untuk diedit.
# This is a combination of 3 commits. # This is the 1st commit message: Update homepage # This is the commit message #2: Add colors CSS file and edit background color # This is the commit message #3: Add second paragraph to page # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Wed Jan 13 18:31:28 2021 +0100 # # interactive rebase in progress; onto b862ff2 # Last commands done (3 commands done): # squash 5aff973 Add colors CSS file and edit background color # squash 9e046b7 Add second paragraph to page # No commands remaining. # You are currently rebasing branch 'main' on 'b862ff2'. # # Changes to be committed: # new file: .gitignore # new file: css/base.css # new file: css/base.scss # new file: css/colors.css # new file: css/colors.css.map # new file: css/colors.scss # new file: css/common.css # new file: css/common.scss # new file: index.html #
Saat kita melakukan rebase, kita juga bisa mengedit deskripsi commit agar lebih mudah dibaca.
Implement new design for homepage. Add .gitignore file for Sass folder. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. #
Simpan file ini lagi dan selesai! Ketika kita melihat lagi pada log Git, kita dapat melihat hanya ada satu komit bersih.
[detached HEAD 574ec7e] Implement new design for homepage. Add .gitignore file for Sass folder. Date: Wed Jan 13 18:31:28 2021 +0100 10 files changed, 215 insertions(+) create mode 100644 .gitignore create mode 100644 css/base.css create mode 100644 css/base.scss create mode 100644 css/colors.css create mode 100644 css/colors.css.map create mode 100644 css/colors.scss create mode 100644 css/common.css create mode 100644 css/common.scss create mode 100644 index.html create mode 100644 verylargefile.txt Successfully rebased and updated refs/heads/main. $ git log commit 574ec7e5d7d7a96427e049cad9806cdef724aedd (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Wed Jan 13 18:31:28 2021 +0100 Implement new design for homepage. Add .gitignore file for Sass folder.
Git Rebase
Pengembang biasanya ragu untuk menggunakan git rebase
karena mereka tahu bahwa rebase dapat digunakan untuk menghapus file secara permanen dari basis kode Anda.
Seperti yang kita lihat di atas, git rebase
dapat digunakan untuk menyimpan kode Anda dan merapikannya serta menghapus - tetapi bagaimana jika Anda benar-benar ingin menghapus file secara permanen dari riwayat?
Saya pernah menyaksikan skenario di mana seorang anggota tim pengembangan kami secara tidak sengaja melakukan file yang sangat besar ke basis kode. Itu adalah bagian dari cabang yang jauh lebih besar sehingga file besar tidak diperhatikan dalam tinjauan kode dan salah diperiksa ke cabang utama. Ini menjadi masalah setiap kali ada yang ingin mengkloning ulang repositori - butuh waktu lama untuk mengunduh! Dan tentu saja, file yang dimaksud tidak diperlukan. Itu tidak akan menjadi masalah jika file tersebut adalah komit terakhir ke cabang utama - dalam hal ini Anda bisa menjalankan hard reset ( git reset --hard HEAD~1
) dan memaksa Dorong cabang.
Demikian juga, jika file adalah satu-satunya perubahan dalam komit yang diberikan, Anda bisa menghapus seluruh komit dengan menjalankan git reset --hard <commit-id>
. Namun, dalam skenario kami, file besar dikomit bersama kode lain yang ingin kami simpan dalam riwayat, sebagai komit kedua hingga terakhir.
Setelah Anda menemukan komit yang merepotkan, periksa menggunakan git checkout
dan hash komit:
$ git checkout ce861e4c6989a118aade031020fd936bd28d535b Note: checking out 'ce861e4c6989a118aade031020fd936bd28d535b'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at ce861e4 Add CSS styles
Hapus file, atau edit kode Anda, dan biarkan kode (atau file) yang ingin Anda simpan tetap utuh.
$ rm verylargefile.txt $ git status HEAD detached at ce861e4 Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: verylargefile.txt no changes added to commit (use "git add" and/or "git commit -a")
Pastikan Anda menjalankan git add -A
sehingga file Anda yang terhapus dipentaskan dan Git tahu untuk menghapusnya. Sekarang jalankan git commit --amend -v
dan Git akan meminta Anda untuk mengedit pesan commit Anda.
Setelah ini, jalankan git rebase --onto HEAD <commit-id> main
. Di sinilah Anda bisa menemukan beberapa konflik gabungan, artinya ada konflik antara komit baru Anda dan kode lama. Git akan meminta Anda untuk menyelesaikan konflik:
$ git add -A $ git status HEAD detached at ce861e4 Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: verylargefile.txt $ git commit --amend -v [detached HEAD 7c9516a] Add CSS styles Date: Thu Jan 14 14:43:54 2021 +0100 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 css/common.css.map delete mode 100644 verylargefile.txt $ git status HEAD detached from ce861e4 nothing to commit, working tree clean $ git rebase --onto HEAD ce861e4 First, rewinding head to replay your work on top of it... Fast-forwarded HEAD to HEAD.
Jika Anda membuka file di editor teks Anda, Anda akan melihat bahwa Git telah menandai dua versi file indeks. Anda hanya perlu menghapus satu atau mengedit satu untuk menyimpan perubahan yang Anda suka.
<p> Toptal was created by engineers. We are entrepreneurs, all passionate about working with top tech talent and exciting companies from all over the world. </p> <<<<<<< HEAD <p> Toptal connects the top 3% of freelance talent all over the world. </p> </main> </body> </html> ======= </main> </body> </html> >>>>>>> Add index file
Kode antara <<<<<<< HEAD
dan garis tanda sama dengan adalah satu versi, dan kode antara tanda sama dengan dan >>>>>>> Add index file
adalah versi dari komit “Tambah file indeks” . Jadi Anda dapat melihat bahwa satu versi memiliki paragraf tambahan "Toptal menghubungkan 3% talenta lepas teratas di seluruh dunia," sementara yang lain tidak.
Simpan file yang diedit dan jalankan git add filename
diikuti oleh git rebase --continue
. Jika tidak ada perubahan, Anda juga dapat menjalankan git rebase --skip
. Perlu beberapa saat untuk melakukan rebasing jika ada banyak komit antara komit "file besar" Anda dan komit terbaru di main.
Bersabarlah, dan jika Anda berada dalam tim besar, pastikan untuk mendapatkan pendapat kedua! Sangat penting untuk berkonsultasi dengan orang yang menulis komit yang Anda gabungkan, jika memungkinkan.
Ingatlah bahwa perubahan gabungan relevan dengan komit tertentu dalam riwayat, dan bukan perubahan terbaru Anda. Yaitu jika Anda mengedit komit dari saat teks di situs Anda adalah Arial, dan sekarang Verdana, Anda harus tetap menyimpan komit itu dengan riwayat Arial sebagai font face.
Perhatikan juga bahwa jika Git melihat spasi atau karakter akhir baris, itu dapat menyebabkan konflik penggabungan, jadi berhati-hatilah!
Lebih dari Sekedar Berkomitmen dan Menarik
Git lebih kuat daripada yang dipikirkan banyak pengembang. Jika Anda memperkenalkan seorang pemula, pastikan untuk memberi mereka beberapa tip tentang fitur-fitur yang sangat berharga ini. Itu membuat alur kerja lebih efisien.
Ingin mempelajari lebih lanjut tentang Git? Lihatlah halaman Kiat dan Praktik Git Toptal.