Bagaimana cara mengubah pesan komit yang ada dan tidak dicuri?


7664

Saya menulis hal yang salah dalam pesan komit.

Bagaimana saya bisa mengubah pesan? Komit belum didorong.


868
Bagi mereka yang agak baru untuk git: poin Laurie tentang belum mendorong adalah penting. Seperti rebasing, ini mengubah sejarah. Jika seseorang telah mengkloning / menarik dari repo Anda antara sejarah asli dan ditulis ulang maka mereka tidak akan dapat menarik setelah penulisan ulang (untuk cabang itu).
Pat Notz

Jawaban:


16132

Mengubah pesan komit terbaru

git commit --amend

akan membuka editor Anda, memungkinkan Anda untuk mengubah pesan komit dari komit terbaru. Selain itu, Anda dapat mengatur pesan komit langsung di baris perintah dengan:

git commit --amend -m "New commit message"

... Namun, ini dapat membuat pesan komit multi-baris atau koreksi kecil lebih rumit untuk dimasukkan.

Pastikan Anda tidak memiliki perubahan copy pekerjaan yang dipentaskan sebelum melakukan ini atau mereka akan berkomitmen juga. ( Perubahan yang tidak dipentaskan tidak akan dikomit.)

Mengubah pesan komit yang sudah Anda push ke cabang jauh Anda

Jika Anda sudah mendorong komit ke cabang jarak jauh Anda, maka - setelah mengubah komit Anda secara lokal (seperti dijelaskan di atas) - Anda juga harus memaksa mendorong komit dengan:

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

Peringatan: mendorong secara paksa akan menimpa cabang jarak jauh dengan keadaan cabang lokal Anda . Jika ada komit di cabang jarak jauh yang tidak Anda miliki di cabang lokal Anda, Anda akan kehilangan komit itu.

Peringatan: berhati-hatilah untuk mengubah komitmen yang telah Anda bagikan dengan orang lain. Amending berkomitmen pada dasarnya menulis ulang mereka untuk memiliki ID SHA yang berbeda , yang menimbulkan masalah jika orang lain memiliki salinan komitmen lama yang telah Anda tulis ulang. Siapa pun yang memiliki salinan komit lama perlu menyinkronkan pekerjaan mereka dengan komit baru Anda yang ditulis ulang, yang kadang-kadang bisa sulit, jadi pastikan Anda berkoordinasi dengan orang lain ketika mencoba untuk menulis ulang riwayat komitmen bersama, atau hanya menghindari penulisan ulang komitmen bersama sama sekali.


Lakukan rebase interaktif

Pilihan lain adalah menggunakan rebase interaktif. Ini memungkinkan Anda untuk mengedit pesan apa pun yang ingin Anda perbarui walaupun itu bukan pesan terbaru.

Untuk melakukan Git squash, ikuti langkah-langkah ini:

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

Setelah Anda menekan komitmen Anda - pilih e/runtuk mengedit pesan:

Masukkan deskripsi gambar di sini

Catatan penting tentang rebase interaktif

Saat Anda menggunakan git rebase -i HEAD~nmungkin ada lebih dari n komit. Git akan "mengumpulkan" semua komit di n komit terakhir, dan jika ada penggabungan di antara rentang itu Anda akan melihat semua komit juga, sehingga hasilnya adalah n +.

Tip yang bagus:

Jika Anda harus melakukannya selama lebih dari satu cabang dan Anda mungkin menghadapi konflik saat mengubah konten, atur git rereredan biarkan Git menyelesaikan konflik tersebut secara otomatis untuk Anda.


Dokumentasi


257
Namun git commit --amendtidak sekuat git rebase -i.
Jeffrey Jose

76
@jeffjose, Itu pasti tidak perlu. Juga, git commit --amenddapat memperbaiki (a?) Master komit.
strager

116
Jika Anda sudah mendorong, cukup tekan lagi:git push -f origin branchname
hughes

177
@hughes tidak git push -fsedikit berbahaya jika orang lain menggunakan repositori yang sama?
Armand

91
Jika Anda tidak ingin menulis ulang seluruh pesan komit, pilih git commit --amend -c HEAD. Ini akan membuka editor yang sudah diisi sebelumnya dengan pesan komit lama Anda, sehingga Anda dapat mengubahnya.
Sam

2506
git commit --amend -m "your new message"

7
Saya melakukan git commit --amend -m "Pesan baru", tetapi mendorong ke Github menghasilkan "Gabungkan perubahan jarak jauh sebelum mendorong lagi". Setelah menarik, komit - ubah, dan tekan lagi, pesan baru tidak muncul. Alih-alih, saya memiliki "Gabung 'master' cabang github.com:[myrepo]"
Dave Everitt

8
@DaveEveritt Anda kemungkinan besar mendorong komit Anda ke atas sebelum mencoba memperbaikinya.
Thorbjørn Ravn Andersen

12
@ Kyralessa tidak benar. Dalam bash, Anda dapat dengan mudah menulis pesan komit multiline dengan tidak menutup penawaran sampai selesai (memukul balik di akhir setiap baris dalam kutipan).
Hobs

32
Saya tidak mengerti bagaimana jawaban yang sangat mirip dengan ide utama dari jawaban yang ditulis dua tahun lalu dan juga jawaban yang diterima mendapat begitu banyak suara. Aneh. (tidak ada yang salah dengan jawabannya)
happy coder

7
@AmalMurali, yah. Maksud saya bukan tentang popularitas pertanyaan, atau kegunaan jawabannya. Tetapi jawaban khusus ini bukan jawaban tertua, juga tidak menawarkan wawasan lebih jauh ke dalam jawaban yang diterima. Tampaknya salinan bagian dari jawaban yang diterima. Itulah poin saya. BERSULANG!
happy coder

2376

Jika komit yang ingin Anda perbaiki bukan yang terbaru:

  1. git rebase --interactive $parent_of_flawed_commit

    Jika Anda ingin memperbaiki beberapa komit yang cacat, berikan induk dari yang tertua.

  2. Editor akan muncul, dengan daftar semua komitmen sejak yang Anda berikan.

    1. Ubah pickke reword(atau pada Git versi lama, menjadiedit ) di depan setiap komit yang ingin Anda perbaiki.
    2. Setelah Anda menyimpan, Git akan mengulang komit yang terdaftar.

  3. Untuk setiap komit Anda ingin reword , Git akan menjatuhkan Anda kembali ke editor Anda. Untuk setiap komit yang ingin Anda edit , Git menjatuhkan Anda ke dalam shell. Jika Anda berada di shell:

    1. Ubah komit dengan cara apa pun yang Anda suka.
    2. git commit --amend
    3. git rebase --continue

Sebagian besar urutan ini akan dijelaskan kepada Anda oleh output dari berbagai perintah saat Anda pergi. Sangat mudah; Anda tidak perlu mengingatnya - ingat saja bahwa git rebase --interactiveAnda dapat melakukan komitmen tidak peduli berapa lama mereka melakukannya.


Perhatikan bahwa Anda tidak ingin mengubah komit yang sudah Anda tekan. Atau mungkin Anda lakukan, tetapi dalam hal ini Anda harus sangat berhati-hati untuk berkomunikasi dengan semua orang yang mungkin telah menarik komitmen Anda dan melakukan pekerjaan di atas mereka. Bagaimana saya memulihkan / menyinkronkan kembali setelah seseorang mendorong rebase atau reset ke cabang yang diterbitkan?


39
Bisakah satu mengubah pesan dari komit pertama (yang tidak memiliki orang tua)?
13ren

27
Ini disebutkan dalam salah satu jawaban lain tetapi saya akan mencatatnya di sini. Sejak git 1.6.6 Anda dapat menggunakan reworddi tempat pickuntuk mengedit pesan log.
MitMaro

89
Kebetulan, $parent_of_flawed_commitsetara dengan $flawed_commit^.
Peeja

67
Jangan pernah melakukan ini (atau rebase secara umum) jika Anda sudah mendorong upstream!
Daniel Rinser

20
Gunakan -p( --preserve-merges) jika ada gabungan setelah komit cacat.
ahven

778

Untuk mengubah komit sebelumnya, buat perubahan yang Anda inginkan dan lakukan perubahan tersebut, lalu jalankan

git commit --amend

Ini akan membuka file di editor teks Anda yang mewakili pesan komit baru Anda. Itu dimulai diisi dengan teks dari pesan komit lama Anda. Ubah pesan komit seperti yang Anda inginkan, lalu simpan file dan keluar dari editor Anda untuk menyelesaikan.

Untuk mengubah komit sebelumnya dan menyimpan pesan log yang sama, jalankan

git commit --amend -C HEAD

Untuk memperbaiki komit sebelumnya dengan menghapus seluruhnya, jalankan

git reset --hard HEAD^

Jika Anda ingin mengedit lebih dari satu pesan komit, jalankan

git rebase -i HEAD~commit_count

(Ganti commit_count dengan jumlah komit yang ingin Anda edit.) Perintah ini meluncurkan editor Anda. Tandai komit pertama (yang ingin Anda ubah) sebagai "edit" dan bukan "pilih", lalu simpan dan keluar dari editor Anda. Buat perubahan yang ingin Anda komit dan kemudian jalankan

git commit --amend
git rebase --continue

Catatan: Anda juga dapat "Membuat perubahan yang Anda inginkan" dari editor yang dibuka oleh git commit --amend


18
git rebase -i HEAD~commit_countjuga akan memungkinkan Anda untuk mengubah pesan komit dari banyak komitmen yang Anda pilih. Tandai saja komit yang dipilih sebagai "reword", bukan "pick".
Joe

2
Bagaimana jika Anda tidak ingin melakukan rebase? Anda hanya ingin mengubah pesan yang lebih lama?
SuperUberDuper

3
git reset --hardmemusnahkan perubahan yang tidak dikomit. Silakan ganti --harddengan --soft.
belut ghEEz

1
Setuju, git reset --hardadalah perintah yang sepenuhnya sah, tetapi menyesatkan karena diberi pertanyaan. Anda menggunakan --hardjika Anda melakukan perubahan yang ingin Anda buang, bukan jika Anda salah ketik dalam pesan komit!
Soren Bjornstad

398

Seperti yang telah disebutkan, git commit --amendadalah cara untuk menimpa komit terakhir. Satu catatan: jika Anda ingin juga menimpa file , perintahnya adalah

git commit -a --amend -m "My new commit message"

4
Dan jika Anda tidak ingin menambahkan segala sesuatu, Anda dapat melakukan git add file.extkemudian hanyagit commit --amend
MalcolmOcean

358

Anda juga bisa menggunakannya git filter-branchuntuk itu.

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

Ini tidak semudah yang sepele git commit --amend , tetapi sangat berguna, jika Anda sudah memiliki beberapa penggabungan setelah pesan komit yang salah.

Perhatikan bahwa ini akan mencoba untuk menulis ulang setiap komit di antara HEADdan komit yang cacat, jadi Anda harus memilih msg-filterperintah Anda dengan sangat bijaksana ;-)


4
Apakah ada versi ini yang tidak mengubah komit jika regex tidak menemukan apa pun?
sjakubowski

3
AFAIK filter-branch --msg-filter akan menghasilkan commit baru dalam hal apa pun. Namun, Anda dapat memeriksa dalam filter-msg, jika sed berhasil dan menggunakan informasi ini ketika operasi cabang-filter berakhir untuk mengatur ulang pohon Anda ke ref / asli.
Markus

4
@ DavidVogue Ini hanya benar ketika menggunakan metode cabang-filter. ID komit setelah komit yang dimodifikasi tidak berubah jika Anda menggunakan rebase interaktif.
Markus

6
@Mark Ya mereka lakukan, mereka diharuskan. Id komit tergantung pada komit sebelumnya. Jika mereka tidak berubah, git tidak akan berguna.
Miles Rout

2
Anda butuh $flawed_commit^..HEAD, bukan $flawed_commit..HEAD. seperti yang dinyatakan oleh halaman manual: « Perintah hanya akan menulis ulang referensi positif yang disebutkan dalam baris perintah (misalnya jika Anda melewati a..b, hanya b yang akan ditulis ulang). »
Ángel

319

Saya lebih suka cara ini:

git commit --amend -c <commit ID>

Jika tidak, akan ada komit baru dengan ID komit baru.


7
Bagi saya, menggunakan perintah Anda di atas sebenarnya membuat komit baru dengan ID komit baru ditambah komit tambahan yang mengatakan "menggabungkan cabang" sebagai pesan komit default.
Jan

46
Mengubah selalu membuat komit baru dengan ID komit baru. ID komit adalah hash SHA dari isi komit, termasuk pesan komit dan cap waktu yang dituliskan / dikomit. Ini adalah fitur Git yang, kecuali tabrakan hash, memastikan bahwa dua komit dengan ID yang sama persis dengan komit yang sama, dengan konten, riwayat, dan sebagainya yang sama persis.
Emil Lundberg

7
Setuju dengan Emil. Selain itu, membaca dokumen - sepertinya semua "-c" tidak memberi tahu git pesan komit mana yang akan digunakan sebagai default / templat untuk komit baru Anda. Sebenarnya sudah akan melakukan "-c <commit ID>" secara default , jadi tidak perlu menentukannya.
Gal

2
Itu -cmelakukan beberapa hal. Ini menggunakan pesan lama secara default, tetapi juga menyalin informasi kepengarangan (orang dan waktu). -Cmelakukan hal yang sama kecuali itu tidak meminta Anda untuk mengedit pesan.
Joseph K. Strauss

1
Seperti @SantanuDey, itu tidak berhasil untuk saya. Saya mendapatfatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Andrew Grimm

312

Jika Anda menggunakan alat Git GUI, ada tombol bernama Amend commit terakhir . Klik tombol itu dan kemudian akan menampilkan file dan pesan komit terakhir Anda. Cukup edit pesan itu, dan Anda bisa mengkomitnya dengan pesan komit baru.

Atau gunakan perintah ini dari konsol / terminal:

git commit -a --amend -m "My new commit message"

4
Jawaban ini secara harfiah identik dengan yang lebih tua ini . Sudahkah Anda memeriksa jawaban yang ada sebelum memasok yang lain?
Dan Dascalescu

284

Anda bisa menggunakan Git rebasing . Misalnya, jika Anda ingin memodifikasi kembali untuk melakukan bbc643cd, jalankan

$ git rebase bbc643cd^ --interactive

Di editor default, ubah 'pilih' menjadi 'edit' di baris yang komitnya ingin Anda ubah. Buat perubahan Anda dan kemudian panggungkan dengan

$ git add <filepattern>

Sekarang kamu bisa menggunakannya

$ git commit --amend

untuk memodifikasi komit, dan setelah itu

$ git rebase --continue

untuk kembali ke komit kepala sebelumnya.


1
Jika Anda ingin memastikan perubahan Anda dari git commit --amendpengaruh Anda dapat menggunakan git showdan itu akan menampilkan pesan baru.
Steve Tauber

279
  1. Jika Anda hanya ingin mengubah pesan komit terakhir Anda, maka lakukan:

    git commit --amend
    

Itu akan menjatuhkan Anda ke editor teks Anda dan memungkinkan Anda mengubah pesan komit terakhir.

  1. Jika Anda ingin mengubah tiga terakhir komit pesan, atau salah satu pesan komit sampai saat itu, pasokan HEAD~3ke git rebase -iperintah:

    git rebase -i HEAD~3
    

6
Jawaban sebelumnya ini sudah mengatakan bahwa Anda dapat menggunakan git commit --amend, dan juga mengatakan bahwa Anda dapat menggunakan git rebase -i HEAD~commit_count, semua yang Anda lakukan adalah plug in 3untuk commit_count.

Diturunkan juga. Orang tidak perlu repot membaca jawaban yang ada .
Dan Dascalescu

261

Jika Anda harus mengubah pesan komit lama melalui beberapa cabang (yaitu, komit dengan pesan salah hadir di beberapa cabang) Anda mungkin ingin menggunakan:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Git akan membuat direktori sementara untuk menulis ulang dan juga membackup referensi lama di refs/original/.

  • -fakan menegakkan pelaksanaan operasi. Ini diperlukan jika direktori sementara sudah ada atau jika sudah ada referensi yang disimpan di bawah refs/original. Jika bukan itu masalahnya, Anda dapat menjatuhkan bendera ini.

  • -- memisahkan opsi cabang-filter dari opsi revisi.

  • --allakan memastikan bahwa semua cabang dan tag ditulis ulang.

Karena cadangan referensi lama Anda, Anda dapat dengan mudah kembali ke keadaan sebelum menjalankan perintah.

Katakanlah, Anda ingin memulihkan master Anda dan mengaksesnya di cabang old_master:

git checkout -b old_master refs/original/refs/heads/master

3
Jawaban ini tidak menjawab pertanyaan OP, karena mereka benar-benar tertarik untuk memperbaiki komit yang baru saja mereka lakukan. Saya secara teratur menggunakan git commit --amenduntuk memperbaiki komentar atau menambahkan file saya lupa git add, tapi hanya pernah sebelumnya saya sudah git pushed. Saya juga menggunakan git filter-branchketika saya benar-benar ingin mengacaukan riwayat versi, tetapi OP tidak menginginkan ini, jadi jawaban ini membutuhkan peringatan kesehatan yang besar - jangan coba ini di rumah, intip !!
kbro

226

Menggunakan

git commit --amend

Untuk memahaminya secara rinci, pos yang sangat baik adalah 4. Menulis Ulang Sejarah Git . Ini juga berbicara tentang kapan tidak digunakan git commit --amend .


2
Apakah ada cara yang baik untuk memperbaiki pesan komit yang sudah didorong ke repositori publik? Sejauh ini saya sampai pada kesimpulan bahwa, sekali terdesak, kesalahan ketik dan pemikiran pesan komit saya harus hidup selamanya.
stackunderflow

2
Singkatnya, NOPE! Tidak ada cara BAIK untuk menarik kembali sesuatu yang telah Anda dorong. Semua pencabutan BURUK pada tingkat yang lebih besar atau lebih kecil. Anda perlu mengadopsi disiplin bekerja di cabang di repositori pribadi Anda sendiri, melakukan banyak komitmen saat Anda menambahkan sedikit, menguji sedikit, mengubah sedikit. Kemudian gabungkan seluruh cabang Anda menjadi satu komit, tulis pesan komit baru yang menjelaskan perubahan keseluruhan, PROOFREAD, dan tekan.
kbro

1
Hanya untuk menunjukkan dengan jelas bahwa seseorang tidak harus membuat komit tunggal ketika kembali dari cabang fitur. Apa yang banyak orang lakukan adalah rebase pada cabang target (untuk membuat semuanya terlihat bersih) kemudian bergabung dengan opsi untuk menekan fast-forwarding. Setuju dengan poin utama berhati-hati sebelum Anda mendorong ke atas.
ShawnFumo

1
The git commit --amendjawaban sudah diberikan (beberapa kali) sebelum Anda menulis Anda. Mengapa Anda mempostingnya lagi? Jika Anda ingin menambahkan tautan ke "Riwayat Penulisan Ulang Git" Anda bisa mengedit salah satu jawaban yang ada, atau meninggalkan komentar.
Dan Dascalescu

199

Mengubah

Anda memiliki beberapa opsi di sini. Anda dapat melakukan

git commit --amend

selama ini komit terakhir Anda.

Rebase interaktif

Jika tidak, jika itu bukan komit terakhir Anda, Anda dapat melakukan rebase interaktif,

git rebase -i [branched_from] [hash before commit]

Kemudian di dalam rebase interaktif Anda cukup menambahkan edit ke komit itu. Ketika muncul, lakukan git commit --amenddan ubah pesan komit. Jika Anda ingin mundur sebelum komit itu, Anda juga bisa menggunakan git reflogdan menghapus komit itu. Kemudian Anda lakukan git commitlagi.


191

Jika ini adalah komit terakhir Anda, ubah saja komit:

git commit --amend -o -m "New commit message"

(Menggunakan bendera -o( --only) untuk memastikan Anda hanya mengubah pesan komit)


Jika itu adalah komit yang dikubur, gunakan rebase interaktif yang mengagumkan :

git rebase -i @~9   # Show the last 9 commits in a text editor

Temukan komit yang Anda inginkan, ubah pickke r( reword), dan simpan dan tutup file. Selesai!



Tutorial Miniatur Vim (atau, cara rebase hanya dengan 8 kali penekanan tombol 3jcwrEscZZ):

  • Jalankan vimtutorjika Anda punya waktu
  • hjkl sesuai dengan tombol gerakan
  • Semua perintah dapat diawali dengan "rentang", mis. 3jBergerak turun tiga baris
  • i untuk masuk ke mode penyisipan - teks yang Anda ketik akan muncul di file
  • Escatau Ctrlcuntuk keluar dari mode penyisipan dan kembali ke mode "normal"
  • u untuk membatalkan
  • Ctrlr untuk mengulang
  • dd, dw, dlUntuk menghapus garis, kata, atau huruf, masing-masing
  • cc, cw, clUntuk mengubah garis, kata, atau huruf, masing-masing (sama sepertiddi )
  • yy, yw, ylUntuk menyalin ( "yank") baris, kata, atau huruf, masing-masing
  • patau Pmenempel masing-masing setelah, atau sebelum posisi saat ini
  • :wEnter untuk menyimpan (menulis) file
  • :q!Enter untuk berhenti tanpa menyimpan
  • :wqEnteratau ZZuntuk menyimpan dan keluar

Jika Anda sering mengedit teks, maka beralihlah ke tata letak keyboard Dvorak , belajar mengetik, dan belajar Vim. Apakah ini sepadan dengan usaha? Iya.



ProTip ™: Jangan takut untuk bereksperimen dengan perintah "berbahaya" yang menulis ulang riwayat * - Git tidak menghapus komit Anda selama 90 hari secara default; Anda dapat menemukannya di reflog:

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* Hati-hati dengan opsi seperti --harddan --forcemeskipun - mereka dapat membuang data. * Juga, jangan menulis ulang sejarah di cabang mana pun Anda berkolaborasi.


3
Bagian vim sepenuhnya di luar topik, dan alih-alih mendorong pengguna untuk menghabiskan waktu belajar menggunakan editor misterius, mengapa tidak mengajari mereka sesuatu yang lebih sesuai topik, seperti cara mengatur editor git default untuk menjadi sesuatu yang ramah pengguna, seperti nano? Kita sedang berbicara tentang modifikasi sepele yang perlu dibuat ke file teks, bukan pengkodean hardcore yang akan menghasilkan perang api tentang editor teks "terbaik".
Dan Dascalescu

1
@DanDascalescu: Karena lebih cepat mempelajari Vim menggunakan instruksi di atas daripada melakukan beberapa rebases menggunakan nano. Seluruh alasan git membuka editor teks dan bukan antarmuka sendiri untuk rebasing adalah karena Vim ada: Vim ringan: diinstal secara default pada sebagian besar sistem, dan sangat mudah dipelajari cukup untuk melakukan rebase dengan mudah: misalnya ddjjpZZmemindahkan komit 2 ke bawah. Tidak ada yang aneh tentang pengetahuan Vim dasar; dibutuhkan 10 menit untuk menjadi lebih nyaman dengan Vim daripada nano.
Zaz

185

Jika Anda menggunakan Git GUI, Anda dapat mengubah komit terakhir yang belum didorong dengan:

Commit/Amend Last Commit

168

Saya menggunakan Git GUI sebanyak yang saya bisa, dan itu memberi Anda opsi untuk mengubah komit terakhir:

Centang kotak itu

Juga, git rebase -i origin/masteradalah mantra yang bagus yang akan selalu memberi Anda komitmen yang telah Anda lakukan di atas master, dan memberi Anda opsi untuk mengubah, menghapus, memesan ulang, atau squash. Tidak perlu menghubungi hash itu terlebih dahulu.


4
Bagaimana saya bisa sampai ke layar yang telah Anda tampilkan dalam contoh Anda?
Marwan مروان

2
Ini adalah bagian kanan bawah dari Windows Git Gui. Pilih saja sakelar 'Ubah Komit Terakhir', dan itu akan diisi dengan info komit terbaru.
wbdarby

138

Wow, jadi ada banyak cara untuk melakukan ini.

Namun cara lain untuk melakukan ini adalah dengan menghapus komit terakhir, tetapi simpan perubahannya sehingga Anda tidak akan kehilangan pekerjaan Anda. Anda kemudian dapat melakukan komit lain dengan pesan yang diperbaiki. Ini akan terlihat seperti ini:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

Saya selalu melakukan ini jika saya lupa menambahkan file atau melakukan perubahan.

Ingatlah untuk menentukan --softalih-alih --hard, jika tidak, Anda akan kehilangan komit sepenuhnya.


5
Ini melakukan hal yang sama persis seperti git commit --amendkecuali bahwa itu adalah proses 2 langkah.
Joseph K. Strauss

3
@ JosephK.Strauss Saya percaya mengubah komit juga membuat penulis komit asli dan informasi tanggal, memiliki komiter baru dan info tanggal secara terpisah. Saya tidak yakin pendekatan ini melakukan itu.
everton

4
@ EvertonAgner Anda benar. --amendakan menyimpan informasi penulis, tetapi pertanyaannya hanya meminta untuk mengubah pesan.
Joseph K. Strauss

131

Bagi siapa pun yang mencari Windows / Mac GUI untuk membantu mengedit pesan lama (yaitu bukan hanya pesan terbaru), saya akan merekomendasikan Sourcetree . Langkah-langkah untuk diikuti di bawah ini.

Sourcetree rebase interaktif

Untuk komit yang belum didorong ke remote:

  1. Pastikan Anda telah mengikat atau menyembunyikan semua perubahan saat ini (yaitu, jadi tidak ada file yang terdaftar di tab "Status File") - itu tidak akan berfungsi sebaliknya.
  2. Di tab "Log / Riwayat", klik kanan pada entri dengan garis di sebelahnya pada grafik di bawah komit yang ingin Anda edit dan pilih "Rebase anak-anak dari <commit ref> interaktif ..."
  3. Pilih seluruh baris untuk pesan komit yang ingin Anda ubah (klik kolom "Pesan") .
  4. Klik tombol "Edit Pesan".
  5. Edit pesan seperti yang diinginkan dalam dialog yang muncul lalu klik OK .
  6. Ulangi langkah 3-4 jika ada pesan komit lainnya untuk diubah.
  7. Klik OK: Rebasing akan dimulai. Jika semuanya baik-baik, output akan berakhir "Berhasil selesai". CATATAN: Saya terkadang melihat kegagalan ini Unable to create 'project_path/.git/index.lock': File exists.ketika mencoba mengubah beberapa pesan komit pada saat yang bersamaan. Tidak yakin persis apa masalahnya, atau apakah akan diperbaiki dalam versi Sourcetree yang akan datang, tetapi jika ini terjadi akan merekomendasikan untuk mengembalikannya satu per satu (lebih lambat tetapi tampaknya lebih dapat diandalkan).

... Atau ... untuk komitmen yang sudah didorong:

Ikuti langkah-langkah dalam jawaban ini , yang mirip dengan di atas, tetapi memerlukan perintah lebih lanjut untuk dijalankan dari baris perintah ( git push origin <branch> -f) untuk memaksa-mendorong cabang. Saya akan merekomendasikan membaca semuanya dan menerapkan kehati-hatian yang diperlukan!


dari semua jawaban - ini adalah yang paling tepat untuk semua pemula git ^^^ (gunakan program SourceTree gratis dan terapkan "Rebase anak-anak" pada komit sebelum yang ingin Anda edit)
kembalilah

127

Jika Anda hanya ingin mengedit komit terbaru, gunakan:

git commit --amend

atau

git commit --amend -m 'one line message'

Tetapi jika Anda ingin mengedit beberapa komit berturut-turut, Anda harus menggunakan rebasing sebagai gantinya:

git rebase -i <hash of one commit before the wrong commit>

Git mengedit rebase

Dalam sebuah file, seperti yang di atas, tulis edit/eatau salah satu opsi lain, dan tekan save and exit.

Sekarang Anda akan berada di komit yang salah pertama. Buat perubahan pada file, dan mereka akan secara otomatis dipentaskan untuk Anda. Tipe

git commit --amend

Simpan dan keluar dan ketik

git rebase --continue

untuk pindah ke pilihan berikutnya sampai selesai dengan semua pilihan Anda.

Perhatikan bahwa hal-hal ini mengubah semua hash SHA Anda setelah komit tertentu.


2
git rebase -i <hash dari satu commit sebelum commit salah> bekerja untuk saya. Terima kasih.
Viraths

127

Jika Anda hanya ingin mengubah pesan terakhir Anda, Anda harus menggunakan --onlybendera atau pintasannya -odengan commit --amend:

git commit --amend -o -m "New commit message"

Ini memastikan bahwa Anda tidak secara tidak sengaja meningkatkan komitmen Anda dengan hal-hal yang dipentaskan. Tentu saja yang terbaik adalah memiliki $EDITORkonfigurasi yang tepat . Kemudian Anda dapat meninggalkan -mopsi keluar, dan Git akan mengisi awal pesan komit dengan yang lama. Dengan cara ini dapat diedit dengan mudah.


1
Jawaban "atas" tidak menjawab pertanyaan. Itu hanya memberikan pengantar umum git commit --amend. Pertanyaannya sangat spesifik, karena itu lebih lama! = Lebih baik. Penyebutan -obendera yang tegas mungkin akan dimakamkan di sisa informasi. Saya juga tidak nyaman mengedit jawaban yang sudah memiliki banyak suara.
David Ongaro

2
Dikatakan bahwa Anda bebas mengedit jawaban teratas, karena ada bahaya nyata bahwa orang menggunakan itu sebagai jawaban "benar". Dapat dengan mudah mengubah amandemen Anda dengan hal-hal yang dipentaskan - itu terjadi pada saya, dan itu benar-benar menjengkelkan ketika Anda mendorongnya. Tapi tetap saja, kuantitas bukanlah jaminan untuk kebenaran. Baik dalam jumlah jawaban maupun dalam jumlah suara.
David Ongaro

1
Saya tidak akan mengatakan sejauh ini bahwa jawaban teratas adalah "salah" dan bahwa "tidak menjawab pertanyaan". Ini pasti berfungsi dan menjawab pertanyaan, Anda hanya perlu memastikan bahwa Anda tidak melakukan perubahan bertahap ketika Anda mencoba untuk mengubah. Tetapi saya mengerti maksud Anda tentang harus memperingatkan orang tentang hal itu. Saya akan mengeditnya nanti jika ada waktu.

1
Agar adil: meskipun --onlyopsi dengan --amendtersedia sejak git 1.3.0 itu tidak bekerja dengan benar sampai diperbaiki di 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Jadi jawaban bek kanan pada tahun 2008 mungkin akan menjadi sesuatu seperti: git stash; git commit --amend; git stash pop.
David Ongaro

103

Perbarui pesan komit terakhir yang salah dengan pesan komit baru dalam satu baris:

git commit --amend -m "your new commit message"

Atau, coba Git reset seperti di bawah ini:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

Menggunakan reset untuk membagi komit menjadi komit yang lebih kecil

git reset dapat membantu Anda membagi satu komit menjadi beberapa komit juga:

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

Di sini Anda telah berhasil membagi komit terakhir Anda menjadi dua komit.


3
Jika semua yang ingin Anda lakukan adalah mengedit pesan komit terakhir Anda, menggunakan soft reset untuk tujuan itu adalah over-kill . Cukup gunakan git commit --amend, persis seperti yang dikatakan di bagian atas pilih jawaban . Selain itu, git reset --soft HEAD^berfungsi secara identik dengan pengaturan ulang lunak dalam jawaban sebelumnya , karena mereka mengatur ulang kembali ke komit induk pertama.

3
Saya hanya ingin menambahkan git resetsolusi hanya untuk memberikan ide untuk membagi satu pesan komit menjadi beberapa pesan komit. Karena, saya telah menghadapi masalah itu ketika, saya mulai menggunakannya git. Terkadang, ini bisa sangat membantu. :)
przbadu

87

Pada pertanyaan ini ada banyak jawaban, tetapi tidak satupun dari mereka menjelaskan dengan sangat rinci bagaimana mengubah pesan komit yang lebih lama menggunakan Vim . Saya terjebak mencoba melakukan ini sendiri, jadi di sini saya akan menuliskan secara rinci bagaimana saya melakukan ini terutama untuk orang-orang yang tidak memiliki pengalaman dalam Vim!

Saya ingin mengubah lima komit terbaru yang sudah saya dorong ke server. Ini cukup 'berbahaya' karena jika orang lain sudah menarik dari ini, Anda dapat mengacaukan semuanya dengan mengubah pesan komit. Namun, ketika Anda mengerjakan cabang kecil Anda sendiri dan yakin tidak ada yang menariknya, Anda bisa mengubahnya seperti ini:

Katakanlah Anda ingin mengubah lima commit terakhir Anda, dan kemudian Anda ketik ini di terminal:

git rebase -i HEAD~5

* Di mana 5 adalah jumlah pesan komit yang ingin Anda ubah (jadi jika Anda ingin mengubah 10 komit terakhir, Anda ketikkan 10).

Perintah ini akan membawa Anda ke Vim di sana Anda dapat 'mengedit' riwayat komit Anda. Anda akan melihat lima komit terakhir di atas seperti ini:

pick <commit hash> commit message

Alih-alih pickAnda perlu menulis reword. Anda dapat melakukan ini di Vim dengan mengetik i. Itu membuat Anda masuk ke mode insert . (Anda melihat bahwa Anda sedang dalam mode insert dengan kata INSERT di bagian bawah.) Untuk komit Anda ingin perubahan, ketik rewordbukannyapick .

Maka Anda perlu menyimpan dan keluar dari layar ini. Anda melakukannya dengan terlebih dahulu masuk ke 'mode-perintah' dengan menekan Esctombol (Anda dapat memeriksa bahwa Anda berada dalam mode-perintah jika kata Sisipkan di bagian bawah telah hilang). Kemudian Anda bisa mengetikkan perintah dengan mengetik :. Perintah untuk menyimpan dan keluar adalah wq. Jadi, jika Anda mengetik :wqAnda berada di jalur yang benar.

Kemudian Vim akan membahas setiap pesan komit yang ingin Anda ulang, dan di sini Anda benar-benar dapat mengubah pesan komit. Anda akan melakukan ini dengan masuk ke mode penyisipan, mengubah pesan komit, masuk ke mode-perintah, dan menyimpan dan keluar. Lakukan ini lima kali dan Anda kehabisan Vim!

Kemudian, jika Anda sudah mendorong komitmen yang salah, Anda harus git push --forcemenimpanya. Ingatlah bahwa itu git push --forceadalah hal yang cukup berbahaya untuk dilakukan, jadi pastikan tidak ada yang menarik dari server karena Anda salah menekan komitmen!

Sekarang Anda telah mengubah pesan komit Anda!

(Seperti yang Anda lihat, saya tidak berpengalaman dalam Vim, jadi jika saya menggunakan 'istilah' yang salah untuk menjelaskan apa yang terjadi, jangan ragu untuk mengoreksi saya!)


4
<nitpick>Tidak ada "utas" di Stack Overflow, karena ini bukan forum diskusi, hanya ada "pertanyaan", "jawaban", dan "pos". </nitpick>. Juga, tidak semua versi Vim sama, tidak semua versi akan membiarkan Anda menghapus karakter dalam mode penyisipan (masuk akal, kan?). Jika Anda ingin selalu dapat menghapus karakter di Vim, Xdan xakan melakukannya (sedikit xmenghapus karakter di depan kursor, Xakan menghapus di belakang). Jika Anda melakukan kesalahan, Anda dapat menggunakan uberulang kali untuk membatalkan. Akhirnya, radalah singkatan untuk rewordeditor rebase interaktif.

1
Untuk mengubah kata dalam vim cwdiketik di awal (meskipun pertanyaannya bukan tentang vim, saya setuju).
Yaroslav Nikitenko

Anda tidak perlu menggunakan kekejian itu . Anda dapat mengatur git editor Anda menjadi sesuatu yang waras dan mudah digunakan, seperti nanoatau mcedit Midnight Commander.
Dan Dascalescu

79

Anda dapat menggunakan git-rebase-reword

Ini dirancang untuk mengedit komit (tidak hanya bertahan) dengan cara yang sama commit --amend

$ git rebase-reword <commit-or-refname>

Itu dinamai setelah aksi rebase interaktif untuk mengubah komit: "reword". Lihat posting ini dan pria -bagian mode-interaktif

Contoh:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

6
Ini memerlukan menginstal program eksternal. Menurut pendapat saya, akan lebih baik untuk belajar menggunakan alat bawaan dan alias lebih efektif. Saya akan mengetik: g c; g rb -i @~9(komit dan rebase), pindahkan komit baru ke tempat yang saya inginkan, ubah commitke f( fixup), dan simpan. Jika Anda menginginkan sesuatu yang lebih cepat dari itu, Anda bisa alias git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Zaz

79

Saya telah menambahkan alias recidan recmuntuk recommit (amend)itu. Sekarang saya bisa melakukannya dengan git recmatau git recm -m:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

57

Saya menyadari bahwa saya telah mendorong komit dengan kesalahan ketik di dalamnya. Untuk membatalkan, saya melakukan hal berikut:

git commit --amend -m "T-1000, advanced prototype"
git push --force

Peringatan: memaksa mendorong perubahan Anda akan menimpa cabang jarak jauh dengan cabang lokal Anda. Pastikan Anda tidak akan menimpa apa pun yang ingin Anda simpan. Juga berhati-hatilah untuk memaksakan komit yang diubah (ditulis ulang) jika ada orang lain yang berbagi cabang dengan Anda, karena mereka harus menulis ulang sejarah mereka sendiri jika mereka memiliki salinan komit lama yang baru saja Anda tulis ulang.


7
Tidak ada yang pernah "ditimpa" di git. Dalam hal ini penunjuk cabang akan disetel ke komit baru Anda dan komit lama akan basi jika tidak ada referensi yang tersisa dan itu mungkin akan dibersihkan setelah beberapa minggu. (Sampai saat itu orang lain masih dapat menemukan dan merujuknya, misalnya dengan melihat ke dalam reflog.)
David Ongaro

51

Saya suka menggunakan yang berikut ini:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

46

Jika Anda belum mendorong kode ke cabang jarak jauh Anda ( GitHub / Bitbucket ), Anda dapat mengubah pesan komit pada baris perintah seperti di bawah ini.

 git commit --amend -m "Your new message"

Jika Anda bekerja pada cabang tertentu, lakukan ini:

git commit --amend -m "BRANCH-NAME: new message"

Jika Anda sudah mendorong kode dengan pesan yang salah, dan Anda harus berhati-hati saat mengubah pesan. Yaitu, setelah Anda mengubah pesan komit dan mencoba mendorongnya lagi, Anda akhirnya memiliki masalah. Untuk membuatnya lancar, ikuti langkah-langkah ini.

Harap baca seluruh jawaban saya sebelum melakukannya.

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

Catatan penting: Saat Anda menggunakan push paksa secara langsung, Anda mungkin berakhir dengan masalah kode yang sedang dikerjakan pengembang lain di cabang yang sama. Jadi untuk menghindari konflik tersebut, Anda perlu menarik kode dari cabang Anda sebelum melakukan push force :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

Ini adalah praktik terbaik saat mengubah pesan komit, jika sudah didorong.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.