Anda harus menggunakan indeks. Setelah melakukan reset campuran (" git reset HEAD ^"), tambahkan set perubahan pertama ke dalam indeks, kemudian komit. Kemudian lakukan sisanya.
Anda dapat menggunakan " git add " untuk menempatkan semua perubahan yang dibuat dalam file ke indeks. Jika Anda tidak ingin membuat setiap modifikasi yang dibuat dalam file, hanya beberapa di antaranya, Anda dapat menggunakan "git add -p".
Mari kita lihat sebuah contoh. Misalkan saya memiliki file bernama myfile, yang berisi teks berikut:
something
something else
something again
Saya memodifikasinya di komit terakhir saya sehingga sekarang terlihat seperti ini:
1
something
something else
something again
2
Sekarang saya memutuskan bahwa saya ingin membaginya menjadi dua, dan saya ingin penyisipan baris pertama berada di komit pertama, dan penyisipan baris terakhir berada di komit kedua.
Pertama saya kembali ke induk HEAD, tetapi saya ingin menyimpan modifikasi dalam sistem file, jadi saya menggunakan "git reset" tanpa argumen (yang akan melakukan apa yang disebut reset "campuran"):
$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2
Sekarang saya menggunakan "git add -p" untuk menambahkan perubahan yang ingin saya komit ke indeks (= saya tahap mereka). "git add -p" adalah alat interaktif yang menanyakan Anda tentang perubahan apa pada file yang harus ditambahkan ke indeks.
$ git add -p myfile
diff --git a/myfile b/myfile
index 93db4cb..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,5 @@
+1
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,s,e,?]? s # split this section into two!
Split into 2 hunks.
@@ -1,3 +1,4 @@
+1
something
something else
something again
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y # yes, I want to stage this
@@ -1,3 +2,4 @@
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,K,g,e,?]? n # no, I don't want to stage this
Lalu saya melakukan perubahan pertama ini:
$ git commit -m "Added first line"
[master cef3d4e] Added first line
1 files changed, 1 insertions(+), 0 deletions(-)
Sekarang saya dapat melakukan semua perubahan lainnya (yaitu angka "2" yang dimasukkan di baris terakhir):
$ git commit -am "Added last line"
[master 5e284e6] Added last line
1 files changed, 1 insertions(+), 0 deletions(-)
Mari kita periksa log untuk melihat komitmen apa yang kita miliki:
$ git log -p -n2 | cat
Commit 5e284e652f5e05a47ad8883d9f59ed9817be59d8
Author: ...
Date: ...
Added last line
Diff --git a/myfile b/myfile
Index f9e1a67..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -2,3 +2,4 @@
something
something else
something again
+2
Commit cef3d4e0298dd5d279a911440bb72d39410e7898
Author: ...
Date: ...
Added first line
Diff --git a/myfile b/myfile
Index 93db4cb..f9e1a67 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,4 @@
+1
something
something else
something again
git reset [--patch|-p] <commit>
yang dapat Anda gunakan untuk menyelamatkan Anda dari masalah keharusangit add -p
setelah mengatur ulang. Apakah saya benar? Menggunakan git 1.7.9.5.Tujuan:
splitme
) menjadi dua.Rencana:
splitme
.splitme
.Langkah rebase (1 & 7) dapat dilewati jika
splitme
komit terbaru.Jika saya ingin file split dilakukan terlebih dahulu, saya akan rebase -i lagi dan beralih urutan
sumber
git reset HEAD^
adalah potongan puzzle yang hilang. Bekerja dengan baik-p
juga. Terima kasih!-- $files
argumennyagit reset
. Dengan lintasan yang dilewati,git reset
pulihkan file-file itu ke keadaan komit yang direferensikan tetapi tidak mengubah komit apa pun. Jika Anda meninggalkan jalur, maka Anda "kehilangan" komit yang ingin Anda ubah di langkah berikutnya.git reset HEAD^ -- .
. Sangat mengejutkan, ini bukan perilakugit reset HEAD^
.Untuk mengubah komit saat ini menjadi dua komit, Anda dapat melakukan sesuatu seperti berikut ini.
Antara:
Ini membatalkan komit terakhir tetapi membiarkan semuanya dipentaskan. Anda kemudian dapat menghapus stage file-file tertentu:
Opsional mengembalikan sebagian file-file itu:
Buat komit pertama yang baru:
Tahap dan komit sisa perubahan dalam komit kedua:
Atau:
Batalkan dan hapus panggung semua perubahan dari komit terakhir:
Selektif putaran perubahan pertama:
Melakukan:
Komit sisa perubahan:
(Pada langkah mana pun, jika Anda membatalkan ikatan komit yang menambahkan file baru dan ingin menambahkan ini ke komit kedua Anda harus menambahkannya secara manual karena
commit -a
hanya tahapan perubahan pada file yang sudah dilacak.)sumber
Jalankan
git gui
, pilih tombol radio "Amend last commit", dan unstage (Commit> Unstage From Commit, atau Ctrl- U) perubahan yang Anda tidak ingin komit pertama. Saya pikir itu cara termudah untuk melakukannya.Hal lain yang bisa Anda lakukan adalah memilih cherry perubahan tanpa melakukan (
git cherry-pick -n
) dan kemudian secara manual atau dengangit gui
memilih perubahan yang diinginkan sebelum melakukan.sumber
--hard adalah yang membunuh perubahan Anda.
sumber
Saya terkejut tidak ada yang menyarankan
git cherry-pick -n forum
. Ini akan membuat perubahan dariforum
komit terbaru tetapi tidak komit - Anda kemudian dapatreset
menghilangkan perubahan yang tidak Anda butuhkan dan komit yang ingin Anda simpan.sumber
Metode double-revert-squash
git checkout HEAD~1 -- files with unwanted changes
dangit commit
. Jika tidak, file dengan perubahan campuran dapat sebagian dipentaskangit reset file
dangit add -p file
sebagai langkah perantara.) Sebut ini kembalikan .git revert HEAD
- Buat komitmen lain, yang menambahkan kembali perubahan yang tidak diinginkan. Ini adalah pengembalian gandagit rebase -i HEAD~3
). Komit ini sekarang menjadi bebas dari perubahan yang tidak diinginkan, untuk komit yang kedua.Manfaat
sumber
Karena Anda memetik ceri, Anda dapat:
cherry-pick
dengan--no-commit
opsi yang ditambahkan.reset
dan gunakanadd --patch
,add --edit
atau hanyaadd
untuk menampilkan apa yang ingin Anda simpan.commit
perubahan bertahap.--reuse-message=<old-commit-ref>
atau--reedit-message=<old-commit-ref>
opsi kecommit
perintah.reset --hard
.Cara lain, mempertahankan atau mengedit pesan komit asli:
cherry-pick
komit asli seperti biasa.add
untuk melakukan tahap pembalikan.commit --amend
untuk efek pembalikan pada komit yang dipetik cherry.sumber
Ini mungkin solusi lain yang ditargetkan untuk kasus-kasus di mana ada komit besar dan sejumlah kecil file perlu dipindahkan ke komit baru. Ini akan berfungsi jika satu set
<path>
file harus diekstraksi dari komit terakhir di HEAD dan semua dipindahkan ke komit baru. Jika diperlukan banyak komitmen, solusi lain dapat digunakan.Pertama buat tambalan ke area yang dipentaskan dan tidak dipentaskan yang akan berisi perubahan untuk mengembalikan kode sebelum modifikasi dan setelah modifikasi masing-masing:
Untuk memahami apa yang akan terjadi (panah dan komentar bukan bagian dari perintah):
Kembalikan
<path>
perubahan pada komit terakhir:Buat komit baru dengan
<path>
perubahan:Ini memiliki efek membuat komit baru yang berisi perubahan yang diambil dari komit terakhir.
sumber