Apakah ada cara untuk mengedit pesan komit di GitHub?


129

Apakah ada cara untuk mengedit pesan komit setelah melakukan dan mendorong ke GitHub? Saya melihat bahwa ada 'tambahkan catatan' serta komentar inline, tetapi tidak ada pengeditan aktual dari pesan komit. Ada juga 'amit commit' di ekstensi git tetapi itu tidak mengedit pesan yang ada.


Anda dapat mencoba mengembalikan komit (lihat beberapa opsi dalam pertanyaan SO ini: stackoverflow.com/questions/4114095/... ) - hanya pastikan Anda mencadangkan perubahan kode terlebih dahulu sehingga Anda tidak akan kehilangan komit demi komentar!
Traveling Tech Guy

Jawaban:


183
  1. git rebase -i <commit hash you want to change>^

    Ini akan membuka editor default Anda (biasanya ) dengan daftar commit dan tindakan untuk masing-masing. Secara default, tindakannya adalah pick.

  2. Untuk komitmen apa pun yang ingin Anda ubah pesannya, ubah pickke reword.

  3. Simpan dan keluar (in vi:) :wq.

  4. Untuk setiap komit tersebut, Anda akan mendapatkan editor untuk mengedit pesan komit. Ubah sesuai keinginan Anda, simpan dan keluar.

    Setelah selesai mengedit semua pesan komit, Anda akan kembali ke command prompt, dan memiliki pohon baru dengan pesan yang diperbarui.

  5. Anda sekarang dapat mengunggahnya ke github dengan menggunakan git push origin --force.

Jika Anda hanya perlu memperbaiki komit terakhir Anda, Anda dapat mengganti langkah 1-4 dengan git commit --amend.


3
@ MatthewPeters Saya berasumsi harus ada jalan, tapi saya tidak tahu - saya menggunakan commandline secara langsung.
Mureinik

4
Tampaknya Anda tidak dapat menentukan <commit hash yang ingin Anda ubah>, tetapi Anda perlu menentukan hash dari commit sebelumnya yang ingin Anda ubah atau gunakan HEAD ~ x di mana x adalah jumlah komit dari HEAD di mana item yang ingin Anda ubah berada.
ssc327

3
@ ssc327 Perhatikan bahwa saya a di ^sana - saya memang menyarankan rebasing pada induk dari komit yang ingin Anda ubah.
Mureinik

2
@Murenik Anda benar, saya entah bagaimana melewatkan melihat ^
ssc327

1
@deadfish Menggunakan baris perintah Windows, Anda harus mengetik ^^untuk mengakhiri perintah dengan ^ misalnya literal : git rebase -i 2c747b32^^
Wyck

35

Di Intellij Idea Anda dapat melakukannya dengan mudah.

  1. Buka Kontrol Versi (Riwayat)
  2. Pilih tab log
  3. Pilih komit untuk mengubah komentar
  4. tekan F2 (Mac fn + F2), dan perbarui pesan komit Anda

1
Tidak berfungsi jika Anda sudah mendorong ke jarak jauh.
pembayaran

8
Anda harus mengeksekusi git push origin --forcesetelah itu seperti yang disarankan dalam jawaban @ Mureinik.
Dan Macák

1
Opsi "reword" dinonaktifkan jika komit telah didorong.
huyz

1
Untuk melakukannya dengan Intellij IDEA untuk komit yang didorong, Anda harus mulai dengan rebase interaktif terlebih dahulu (seperti yang akan Anda lakukan dari baris perintah Git). Untuk melakukan rebase, klik kanan pada proyek Anda -> "Git" item menu -> "Repository" -> "rebase ..." (item menu terakhir). Masukkan SHA dari komit sebelum yang ingin Anda modifikasi di bidang "Ke" dan klik "Rebase". Anda kemudian akan mendapatkan prompt rebase interaktif. Pilih "reword" di dropbox tindakan di sebelah komit yang ingin Anda modifikasi dan klik tombol "Mulai rebasing" (lanjutan di komentar berikutnya)
jplandrain

1
(lanjutan) Anda kemudian akan disajikan prompt teks untuk setiap komit yang ingin Anda modifikasi. Setelah pesan log diubah, Anda dapat menerapkan modifikasi lebih lanjut (perhatikan bahwa sekarang opsi "reword" tidak diklik lagi). Setelah selesai, Anda kemudian dapat mendorong paksa modifikasi Anda untuk menyimpulkan rebase interaktif. Seluruh proses sebenarnya persis sama dengan jawaban @Mureinik yang melakukannya dari baris perintah.
jplandrain

3

Tempat:

jika git-grafik Anda terlihat seperti ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192dan b7ec061hash komit dari target-commit dan parent-commit, secara terpisah)

Larutan:

Anda cukup mengetik instruksi berikut ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Penjelasan:

  1. git reset --soft b7ec061 akan menyimpan perubahan file Anda dan mengatur ulang ke parent-commit (mis. b7ec061)
  2. git commit -m "..." akan membuat komit baru secara lokal
  3. git push -f akan mendorong komit baru Anda ke server dan mengganti yang lama (mis. df9c192)

2

Pilihan lain adalah membuat "errata commit" tambahan (dan mendorong) yang mereferensikan objek komit yang berisi kesalahan - komit errata baru juga menyediakan koreksi. Komit errata adalah komit tanpa perubahan kode substantif tetapi pesan komit penting - misalnya, tambahkan satu karakter spasi ke file readme Anda dan komit perubahan itu dengan pesan komit penting, atau gunakan opsi git --allow-empty. Ini tentu saja lebih mudah dan lebih aman daripada rebasing, itu tidak mengubah sejarah yang sebenarnya, dan itu membuat pohon cabang bersih (menggunakanamendjuga merupakan pilihan yang baik jika Anda mengoreksi komit terbaru, tetapi komit errata mungkin merupakan pilihan yang baik untuk komit yang lebih lama). Hal semacam ini sangat jarang terjadi sehingga hanya mendokumentasikan kesalahan sudah cukup baik. Di masa mendatang, jika Anda perlu mencari melalui git log untuk kata kunci fitur, komit asli (keliru) tidak boleh muncul karena kata kunci yang salah digunakan dalam komit asli (kesalahan ketik asli) - namun, kata kunci akan muncul di komit errata yang kemudian akan mengarahkan Anda ke komit asli yang memiliki kesalahan ketik. Ini sebuah contoh:

$ git log
komit 0c28141c68adae276840f17ccd4766542c33cf1d
Penulis: Pertama Terakhir 
Tanggal: Rab 8 Agustus 15:55:52 2018 -0600

    Errata melakukan:
    Komit ini tidak memiliki perubahan kode substantif.
    Komit ini disediakan hanya untuk mendokumentasikan koreksi terhadap pesan komit sebelumnya.
    Ini berkaitan dengan melakukan objek e083a7abd8deb5776cb304fa13731a4182a24be1
    Pesan komit asli salah:
        Warna latar belakang diubah menjadi merah
    Koreksi (* ubah yang disorot *):
        Mengubah warna latar belakang menjadi * biru *

komit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Penulis: Pertama Terakhir 
Tanggal: Rabu 8 Agustus 15:43:16 2018 -0600

    Beberapa pesan komit sementara

komit e083a7abd8deb5776cb304fa13731a4182a24be1
Penulis: Pertama Terakhir 
Tanggal: Rab 8 Agustus 13:31:32 2018 -0600

    Warna latar belakang diubah menjadi merah

Pasti aman, tetapi banyak teks untuk dibaca. Saya lebih suka menulis ulang sejarah :)
pkalinow

0

Jawaban @Mureinik bagus tapi tidak bisa dimengerti oleh pemula.

Metode pertama:

  1. Jika Anda hanya ingin mengedit pesan komit terbaru, maka Anda hanya perlu git commit --amend, Anda akan melihat:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Seperti yang Anda lihat, komit pesan di atas tanpa awalan perintah seperti pick, ini sudah menjadi halaman edit dan Anda dapat langsung mengedit pesan teratas dan menyimpan & keluar , mis .:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Lalu lakukan git push -u origin master --forceatau <how you push normally> --force. Kuncinya di sini adalah --force.

Metode kedua:

  1. Anda dapat melihat hash komit oleh git logatau mengekstrak dari url repositori, contoh dalam kasus saya adalah881129d771219cfa29e6f6c2205851a2994a8835

  2. Maka Anda dapat melakukan git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835atau git rebase -i HEAD^(jika terbaru)

  3. Anda akan melihat:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. Tetapi jika Anda melihat noopmaka Anda mungkin salah mengetik, mis. Jika Anda melakukan git rebase -i 881129d771219cfa29e6f6c2205851a2994a88yang hilang ^pada akhirnya, Anda lebih baik keluar dari editor tanpa menyimpan dan mencari tahu alasannya:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Jika tidak ada noopmasalah, maka cukup mengubah kata pickuntuk reword, lain hanya tetap (Anda tidak mengedit pesan commit pada saat ini), misalnya:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Simpan & keluar akan melihat halaman edit mirip dengan metode # 1:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Edit pesan di atas, sama seperti metode # 1 dan simpan & keluar, misalnya:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Sekali lagi, sama seperti metode # 1, lakukan git push -u origin master --forceatau <how you push normally> --force. Kuncinya di sini adalah --force.

Untuk info lebih lanjut silakan baca dokumen .

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.