CATATAN: Jawaban ini mengubah SHA1s, jadi berhati-hatilah menggunakannya pada cabang yang telah didorong. Jika Anda hanya ingin memperbaiki ejaan nama atau memperbarui email lama, git memungkinkan Anda melakukan ini tanpa menulis ulang riwayat menggunakan .mailmap
. Lihat jawaban saya yang lain .
Menggunakan Interaktif Rebase
Anda bisa melakukannya
git rebase -i -p <some HEAD before all of your bad commits>
Kemudian tandai semua komit buruk Anda sebagai "edit" di file rebase. Jika Anda juga ingin mengubah komit pertama Anda, Anda harus menambahkannya secara manual sebagai baris pertama dalam file rebase (ikuti format dari baris lain). Kemudian, ketika git meminta Anda untuk mengubah setiap commit, lakukan
git commit --amend --author "New Author Name <email@address.com>"
edit atau tutup saja editor yang terbuka, lalu lakukan
git rebase --continue
untuk melanjutkan rebase.
Anda bisa melewatkan membuka editor sama sekali di sini dengan menambahkan --no-edit
sehingga perintahnya adalah:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Komit tunggal
Seperti yang dicatat oleh beberapa komentator, jika Anda hanya ingin mengubah komit terbaru, perintah rebase tidak diperlukan. Kerjakan saja
git commit --amend --author "New Author Name <email@address.com>"
Ini akan mengubah penulis menjadi nama yang ditentukan, tetapi committer akan diatur ke pengguna yang dikonfigurasi di git config user.name
dan git config user.email
. Jika Anda ingin mengatur committer ke sesuatu yang Anda tentukan, ini akan mengatur penulis dan committer:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Catatan tentang Menggabungkan Komit
Ada sedikit cacat dalam respons awal saya. Jika ada komitmen gabungan antara saat ini HEAD
dan Anda <some HEAD before all your bad commits>
, maka git rebase
akan meratakannya (dan omong-omong, jika Anda menggunakan permintaan tarik GitHub, akan ada banyak komitmen gabungan dalam riwayat Anda). Hal ini seringkali dapat menyebabkan sejarah yang sangat berbeda (karena perubahan duplikat mungkin "diubah"), dan dalam kasus terburuk, hal itu dapat menyebabkan git rebase
Anda meminta untuk menyelesaikan konflik penggabungan yang sulit (yang kemungkinan sudah diselesaikan dalam komitmen gabungan). Solusinya adalah dengan menggunakan -p
bendera git rebase
, yang akan mempertahankan struktur penggabungan sejarah Anda. Halaman untuk git rebase
memperingatkan bahwa menggunakan -p
dan -i
dapat menyebabkan masalah, tetapi dalamBUGS
bagian yang bertuliskan "Mengedit melakukan dan menulis ulang pesan komit mereka akan berfungsi dengan baik."
Saya telah menambahkan -p
perintah di atas. Untuk kasus di mana Anda baru saja mengubah komit terbaru, ini bukan masalah.