Saya ingin menghapus entri log komit terpilih dari pohon komit linier, sehingga entri tidak ditampilkan di log komit.
Pohon komit saya terlihat seperti:
R--A--B--C--D--E--HEAD
Saya ingin menghapus entri B dan C agar tidak ditampilkan di log komit, tetapi perubahan dari A ke D harus dipertahankan. Mungkin dengan memperkenalkan komit tunggal, sehingga B dan C menjadi BC dan pohon itu terlihat seperti.
R--A--BC--D--E--HEAD
Atau, idealnya, setelah A datang D langsung. D 'mewakili perubahan dari A ke B, B ke C dan C ke D.
R--A--D'--E--HEAD
Apakah ini mungkin? jika ya, bagaimana?
Ini adalah proyek yang cukup baru sehingga tidak memiliki cabang seperti sekarang, karenanya tidak ada penggabungan juga.
rebase
dapat menghapus yang lama / membuat komitmen baru. Saya tidak tahu apa artinya "komit entri log".git log
"komit log" git-scm.com/docs/git-log . Dan saya ingin menyingkirkan dua entri dari log itu - bukan perubahannya.Jawaban:
git-rebase (1) melakukan hal itu.
git awsome-ness [git rebase --interactive] berisi contoh.
git-rebase
pada komitmen publik (jarak jauh).commit
ataustash
perubahan Anda saat ini).$EDITOR
.pick
sebelumC
danD
olehsquash
. Ini akan menggabungkan C dan D menjadi B. Jika Anda ingin menghapus komit maka cukup hapus barisnya.Jika Anda tersesat, ketikkan:
sumber
git rebase -i D [A]
?push -f
perubahan Anda. Jangan lakukan itu jika Anda tidak bekerja sendirian.git-rebase
mesin manual dan wayback untuk posting blog.sumber
Berikut adalah cara untuk menghapus id komit tertentu dengan hanya mengetahui id komit yang ingin Anda hapus.
Perhatikan bahwa ini sebenarnya menghapus perubahan yang diperkenalkan oleh komit.
sumber
Untuk memperluas jawaban JF Sebastian:
Anda dapat menggunakan git-rebase untuk dengan mudah membuat semua jenis perubahan pada histori komit Anda.
Setelah menjalankan git rebase --interactive Anda mendapatkan yang berikut di $ EDITOR Anda:
Anda dapat memindahkan garis untuk mengubah urutan komit dan menghapus garis untuk menghapus komit itu. Atau Anda dapat menambahkan perintah untuk menggabungkan (squash) dua komit menjadi komit tunggal (komit sebelumnya adalah komit di atas), edit komit (apa yang diubah), atau reword komit pesan.
Saya pikir memilih berarti Anda ingin membiarkan komit itu sendirian.
(Contoh dari sini )
sumber
Anda dapat secara non-interaktif menghapus B dan C dalam contoh Anda dengan:
atau secara simbolis,
Perhatikan bahwa perubahan dalam B dan C tidak akan menjadi dalam D; mereka akan pergi .
sumber
Satu lagi cara,
pilih hash yang ingin Anda gunakan sebagai basis, dan perintah di atas harus membuatnya interaktif sehingga Anda dapat menekan semua pesan teratas (Anda harus meninggalkan yang tertua)
sumber
Saya menemukan proses ini jauh lebih aman dan lebih mudah untuk dipahami dengan membuat cabang lain dari SHA1 dari A dan memetik perubahan yang diinginkan sehingga saya bisa memastikan saya puas dengan penampilan cabang baru ini. Setelah itu, mudah untuk menghapus cabang lama dan mengganti nama yang baru.
sumber
Baru saja mengumpulkan jawaban semua orang: (m baru to git plz gunakan hanya untuk referensi)
git rebase untuk menghapus semua commit
log git
git rebase -i KEPALA ~ 1
Maka layar akan terlihat seperti ini:
Di sini, ubah baris pertama sesuai kebutuhan Anda (menggunakan perintah yang tercantum di atas yaitu 'jatuhkan' untuk menghapus komit dll.) Setelah selesai mengedit tekan ': x' untuk menyimpan dan keluar dari editor (ini hanya untuk editor vim)
Lalu
git push
Jika ini menunjukkan masalah maka Anda perlu mendorong perubahan ke paksa (ITS SANGAT KRITIS: jangan paksa mendorong jika Anda bekerja dalam tim)
git push -f asal
sumber
Anda dapat menggunakan git cherry-pick untuk ini. 'cherry-pick' akan menerapkan komit ke cabang Anda sekarang.
lalu lakukan
kemudian terapkan komit D dan E.
Ini akan mengabaikan komit B dan C. Setelah mengatakan bahwa mungkin tidak mungkin untuk menerapkan komit D ke cabang tanpa B, begitu YMMV.
sumber
reset --hard
, bukanrebase --hard
(yang tidak ada)