Saya gagal dalam sejarah saya dan ingin melakukan beberapa perubahan. Masalahnya adalah, saya memiliki komit dengan dua perubahan yang tidak terkait, dan komit ini dikelilingi oleh beberapa perubahan lain dalam sejarah lokal saya (non-push).
Saya ingin memisahkan komit ini sebelum mendorongnya, tetapi sebagian besar panduan yang saya lihat berkaitan dengan pemisahan komit terbaru Anda, atau perubahan lokal yang tidak dikomit. Apakah layak untuk melakukan ini pada sebuah komit yang terkubur dalam sejarah sedikit, tanpa harus "melakukan kembali" komitmen saya sejak saat itu?
Jawaban:
Ada panduan untuk membagi komitmen di halaman rebase . Ringkasan singkatnya adalah:
Lakukan rebase interaktif termasuk komit target (mis.
git rebase -i <commit-to-split>^ branch
) Dan tandai untuk diedit.Saat rebase mencapai komit itu, gunakan
git reset HEAD^
untuk mengatur ulang sebelum komit, tetapi pertahankan pohon kerja Anda tetap utuh.Tambahkan perubahan secara bertahap dan komit, buat komitmen sebanyak yang diinginkan.
add -p
dapat bermanfaat untuk menambahkan hanya beberapa perubahan dalam file yang diberikan. Gunakancommit -c ORIG_HEAD
jika Anda ingin menggunakan kembali pesan komit asli untuk komit tertentu.Jika Anda ingin menguji apa yang Anda lakukan (ide bagus!) Gunakan
git stash
untuk menyembunyikan bagian yang belum Anda lakukan (ataustash --keep-index
bahkan sebelum Anda melakukannya), uji, kemudiangit stash pop
untuk mengembalikan sisanya ke pohon kerja. Terus membuat komitmen sampai Anda mendapatkan semua modifikasi yang dilakukan, yaitu memiliki pohon kerja yang bersih.Jalankan
git rebase --continue
untuk melanjutkan menerapkan komit setelah komit sekarang-split.sumber
git rebase -i <sha1_of_the_commit_to_split>^ branch
. Dangit gui
merupakan alat yang bagus untuk tugas pemisahan, yang dapat digunakan untuk menambahkan berbagai bagian file ke dalam berbagai komitmen.git add -p
, yang bisa melakukan lebih dari yanggit gui
bisa di departemen ini (terutama mengedit bakhil, pementasan segalanya mulai dari cowok saat ini, dan mencari bakhil oleh regex).Inilah cara melakukannya dengan Magit .
Katakan komit ed417ae adalah yang ingin Anda ubah; itu berisi dua perubahan yang tidak terkait dan dimakamkan di bawah satu atau lebih komit. Tekan
ll
untuk menampilkan log, dan navigasikan ke ed417ae:Kemudian tekan
r
untuk membuka pop-up rebasedan
m
untuk memodifikasi komit pada titik.Perhatikan bagaimana
@
ada sekarang di komit yang ingin Anda bagi - itu berarti HEAD sekarang di komit itu:Kami ingin memindahkan KEPALA ke orang tua, jadi navigasikan ke orang tua (47e18b3) dan tekan
x
(magit-reset-quickly
, pastio
jika Anda menggunakanevil-magit
) dan masukkan untuk mengatakan "ya saya maksud komit pada titik". Log Anda sekarang akan terlihat seperti:Sekarang, tekan
q
untuk pergi ke status Magit biasa, kemudian gunakanu
perintah unstage biasa untuk menghapus apa yang tidak masuk dalam komit pertama, komitc
sisanya seperti biasa, kemudians
tage danc
abaikan apa yang terjadi di komit kedua, dan ketika dilakukan: tekanr
untuk membuka popup rebasedan yang lainnya
r
untuk melanjutkan, dan Anda selesai!ll
sekarang menunjukkan:sumber
Untuk membagi komit
<commit>
dan menambahkan komit baru sebelum ini , dan simpan tanggal penulis<commit>
, - langkah-langkahnya sebagai berikut:Edit komit sebelumnya
<commit>
NB: mungkin juga perlu diedit
<commit>
.Cherry memilih
<commit>
ke dalam indeksReset secara interaktif perubahan yang tidak diperlukan dari indeks dan reset pohon kerja
Sebagai alternatif, cukup sembunyikan perubahan yang tidak dibutuhkan secara interaktif:
git stash push -p -m "tmp other changes"
Buat perubahan lain (jika ada) dan buat komit baru
Secara opsional, ulangi item 2-4 untuk menambahkan lebih banyak komitmen menengah.
Lanjutkan rebasing
sumber
Ada versi yang lebih cepat jika Anda hanya ingin mengekstraksi konten hanya dari satu file. Ini lebih cepat karena rebase interaktif sebenarnya tidak interaktif lagi (dan tentu saja bahkan lebih cepat jika Anda ingin mengekstrak dari komit terakhir, maka tidak perlu rebase sama sekali)
the_file
. Tutupthe_file
. Itu satu-satunya edisi yang Anda butuhkan, sisanya hanya perintah git.Tahap penghapusan dalam indeks:
Kembalikan baris yang baru saja Anda hapus kembali ke file tanpa mempengaruhi indeks !
"SHA1" adalah komit yang ingin Anda ekstrak dari:
Buat yang kedua, komitmen baru dengan konten yang akan diekstrak dipulihkan oleh langkah 3:
Jangan edit, jangan berhenti / lanjutkan - terima saja segalanya:
Tentu saja bahkan lebih cepat ketika komit untuk mengekstrak dari adalah komit terakhir:
Jika Anda menggunakan
magit
maka langkah 4, 5 dan 6 adalah tindakan tunggal: Komit, Perbaikan instansumber
Jika Anda belum mendorong, gunakan saja
git rebase
. Lebih baik lagi, gunakangit rebase -i
untuk memindahkan komit secara interaktif. Anda dapat memindahkan komit yang menyinggung ke depan, lalu membaginya sesuka Anda dan memindahkan tambalan kembali (jika perlu).sumber