Dari jawaban lain di sini, saya agak bingung dengan bagaimana git rebase -i
bisa digunakan untuk menghapus komit, jadi saya harap tidak apa-apa untuk menuliskan test case saya di sini (sangat mirip dengan OP).
Berikut ini adalah bash
skrip yang dapat Anda tempel untuk membuat repositori tes di /tmp
folder:
set -x
rm -rf /tmp/myrepo*
cd /tmp
mkdir myrepo_git
cd myrepo_git
git init
git config user.name me
git config user.email me@myself.com
mkdir folder
echo aaaa >> folder/file.txt
git add folder/file.txt
git commit -m "1st git commit"
echo bbbb >> folder/file.txt
git add folder/file.txt
git commit -m "2nd git commit"
echo cccc >> folder/file.txt
git add folder/file.txt
git commit -m "3rd git commit"
echo dddd >> folder/file.txt
git add folder/file.txt
git commit -m "4th git commit"
echo eeee >> folder/file.txt
git add folder/file.txt
git commit -m "5th git commit"
Pada titik ini, kami memiliki file.txt
konten berikut:
aaaa
bbbb
cccc
dddd
eeee
Pada titik ini, KEPALA berada pada komit ke-5, KEPALA ~ 1 akan menjadi ke-4 - dan KEPALA ~ 4 akan menjadi komit ke-1 (jadi KEPALA ~ 5 tidak akan ada). Katakanlah kita ingin menghapus komit ke-3 - kita dapat mengeluarkan perintah ini di myrepo_git
direktori:
git rebase -i HEAD~4
( Perhatikan bahwa git rebase -i HEAD~5
hasil dengan "fatal: Membutuhkan satu revisi; HEAD hulu tidak valid ~ 5". ) Editor teks (lihat tangkapan layar di jawaban @Dennis ' ) akan terbuka dengan konten ini:
pick 5978582 2nd git commit
pick 448c212 3rd git commit
pick b50213c 4th git commit
pick a9c8fa1 5th git commit
# Rebase b916e7f..a9c8fa1 onto b916e7f
# ...
Jadi kami mendapatkan semua komitmen sejak (tetapi tidak termasuk ) KEPALA yang kami minta ~ 4. Hapus baris pick 448c212 3rd git commit
dan simpan file; Anda akan mendapatkan respons ini dari git rebase
:
error: could not apply b50213c... 4th git commit
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".
Could not apply b50213c... 4th git commit
Pada titik ini buka myrepo_git / folder/file.txt
dalam editor teks; Anda akan melihatnya telah dimodifikasi:
aaaa
bbbb
<<<<<<< HEAD
=======
cccc
dddd
>>>>>>> b50213c... 4th git commit
Pada dasarnya, git
melihat bahwa ketika KEPALA sampai komit ke-2, ada konten aaaa
+ bbbb
; dan kemudian ia memiliki patch cccc
+ dddd
yang ditambahkan yang tidak tahu cara menambahkan ke konten yang ada.
Jadi di sini git
tidak dapat memutuskan untuk Anda - Anda yang harus membuat keputusan: dengan menghapus komit ke-3, Anda tetap menyimpan perubahan yang diperkenalkan olehnya (di sini, baris cccc
) - atau Anda tidak. Jika tidak, cukup hapus baris tambahan - termasuk cccc
- dalam folder/file.txt
menggunakan editor teks, sehingga terlihat seperti ini:
aaaa
bbbb
dddd
... lalu simpan folder/file.txt
. Sekarang Anda dapat mengeluarkan perintah berikut dalam myrepo_git
direktori:
$ nano folder/file.txt # text editor - edit, save
$ git rebase --continue
folder/file.txt: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add
Ah - sehingga untuk tanda bahwa kita sudah memecahkan konflik, kita harus git add
yang folder/file.txt
, sebelum melakukan git rebase --continue
:
$ git add folder/file.txt
$ git rebase --continue
Di sini editor teks terbuka lagi, menunjukkan baris 4th git commit
- di sini kita memiliki kesempatan untuk mengubah pesan komit (yang dalam hal ini dapat diubah secara bermakna 4th (and removed 3rd) commit
atau serupa). Katakanlah Anda tidak ingin - jadi keluar saja dari editor teks tanpa menyimpan; setelah Anda melakukannya, Anda akan mendapatkan:
$ git rebase --continue
[detached HEAD b8275fc] 4th git commit
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.
Pada titik ini, sekarang Anda memiliki riwayat seperti ini (yang juga dapat Anda periksa dengan say gitk .
atau alat lain) dari isi folder/file.txt
(dengan, tampaknya, stempel waktu yang tidak berubah dari komitmen asli):
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| dddd
| +eeee
Dan jika sebelumnya, kami memutuskan untuk mempertahankan garis cccc
(isi dari komit ke-3 yang kami hapus), kami akan memiliki:
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +cccc
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| cccc
| dddd
| +eeee
Nah, ini adalah jenis bacaan yang saya harap akan saya temukan, untuk mulai mempelajari cara git rebase
kerjanya dalam menghapus komitmen / revisi; jadi harap itu bisa membantu orang lain juga ...