Mengubah pesan git commit setelah push (mengingat tidak ada yang menarik dari jarak jauh)

982

Saya telah membuat git melakukan commit dan dorongan berikutnya. Saya ingin mengubah pesan komit. Jika saya mengerti dengan benar, ini tidak disarankan karena seseorang mungkin telah menarik dari repositori jarak jauh sebelum saya membuat perubahan seperti itu. Bagaimana jika saya tahu tidak ada yang menarik?

Apakah ada cara untuk melakukan ini?

K_U
sumber
Apa yang sudah kamu coba? Dengan asumsi Anda tahu cara mengubah pesan komit, dan kemudian mencoba dan mendorong, Git akan memberi tahu Anda apa yang perlu Anda lakukan untuk mewujudkannya.
Andrew Marshall
1
Lihat jawaban untuk pertanyaan "Bagaimana cara saya mengedit pesan komit yang salah di git (saya sudah mendorong)?" stackoverflow.com/a/457396/444639
Mike Rylander
4
Mendeklarasikannya - Pertanyaan Google tentang git commit Peringkat no 1!
Manish Shrivastava
Jika Anda mengubah HEAD commit dan push biasanya (tanpa - force) maka secara mengejutkan itu tidak gagal. Pesan HEAD commit diperbarui dengan Id komit yang diubah. Ini berarti ID komit lainnya kecuali KEPALA tetap utuh. Saya perhatikan perilaku ini dengan versi git 2.8.1.
irsis

Jawaban:

1374

Mengubah sejarah

Jika ini adalah komit terbaru, Anda bisa melakukan ini:

git commit --amend

Ini memunculkan editor dengan pesan komit terakhir dan memungkinkan Anda mengedit pesan. (Anda dapat menggunakan -mjika Anda ingin menghapus pesan lama dan menggunakan yang baru.)

Mendorong

Dan kemudian ketika Anda mendorong, lakukan ini:

git push --force-with-lease <repository> <branch>

Atau Anda dapat menggunakan "+":

git push <repository> +<branch>

Atau Anda dapat menggunakan --force:

git push --force <repository> <branch>

Hati-hati saat menggunakan perintah ini.

  • Jika orang lain mendorong perubahan ke cabang yang sama, Anda mungkin ingin menghindari menghancurkan perubahan itu. The --force-with-leasepilihan adalah yang paling aman, karena akan membatalkan jika ada perubahan hulu (

  • Jika Anda tidak menentukan cabang secara eksplisit, Git akan menggunakan pengaturan push standar. Jika pengaturan push standar Anda adalah "cocok", maka Anda dapat menghancurkan perubahan pada beberapa cabang secara bersamaan.

Menarik / mengambil sesudahnya

Siapa pun yang sudah menarik sekarang akan mendapatkan pesan kesalahan, dan mereka harus memperbarui (dengan asumsi mereka tidak melakukan perubahan apa pun sendiri) dengan melakukan sesuatu seperti ini:

git fetch origin
git reset --hard origin/master # Loses local commits

Hati-hati saat menggunakan reset --hard. Jika Anda memiliki perubahan pada cabang, perubahan itu akan dihancurkan.

Catatan tentang memodifikasi riwayat

Data yang dihancurkan benar-benar hanya pesan komit lama, tetapi --forcetidak tahu itu, dan dengan senang hati akan menghapus data lain juga. Jadi anggap --forcesebagai "Saya ingin menghancurkan data, dan saya tahu pasti data apa yang sedang dihancurkan." Tetapi ketika data yang dihancurkan dilakukan, Anda sering dapat memulihkan komit lama dari reflog — data tersebut sebenarnya yatim piatu, bukan hancur (meskipun komit yatim dihapus secara berkala).

Jika Anda tidak berpikir Anda menghancurkan data, maka menjauhlah dari --force... hal-hal buruk mungkin terjadi .

Inilah sebabnya mengapa --force-with-leaseagak lebih aman.

Dietrich Epp
sumber
13
Berhati-hatilah dengan "perbaikan" itu, seolah-olah mereka memiliki komitmen lokal yang tidak dicuri mereka akan "hilang" ( hilang benar-benar berarti yatim piatu , tetapi memulihkannya tidak jelas).
Andrew Marshall
1
Anda mungkin ingin menentukan nama cabang saat Anda menekan - memaksa, jika tidak, Anda mungkin mendorong lebih dari yang Anda harapkan.
user693960
1
@ user693960: Git hanya akan mendorong apa yang Anda konfigurasikan untuk mendorong.
Dietrich Epp
10
Cukup git push --forcetanpa opsi <repositori> dan <branch> juga berfungsi, jika Anda mengatur upstream Anda.
ahnbizcad
2
Bisakah Anda memberi contoh <repository>? Apakah itu origin? org/repo? Atau adil repo?
MikeSchinkel
440

Hanya mengatakan :

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

lalu

git push --force
Manish Shrivastava
sumber
8
Dalam kasus saya git push origin <BRANCH-NAME>tidak berhasil, saya harus menggunakan git push --forceseperti yang dijelaskan dalam jawaban yang diterima.
Gabriel
1
ini tidak bekerja untuk saya. Harus kita git push --force, atau dorongan itu tidak melewati.
ahnbizcad
4
@ ahnbizcad, itu harus bekerja. Pastikan saja nama cabang sudah benar.
William
3
Saya mendukung kesederhanaan dalam penjelasan Anda! Saya menggunakannya lebih sering
Vasikos
3
Saya berhasil menerapkan perintah ini hanya setelah "sementara tidak melindungi" cabang saya, yang terjadi pada proyek saya yang di-host GitLab. Jika Anda memiliki masalah ini, sebelum menerapkan perintah ini, silakan merujuk ke stackoverflow.com/a/32267118/1423345 ini untuk "membuka proteksi" cabang, dan Anda dapat "melindunginya" lagi setelah selesai mengubah pesan commit :)
John
262

Untuk mengedit komit selain yang terbaru:

Langkah1 : git rebase -i HEAD~nuntuk melakukan rebase interaktif untuk nkomit terakhir yang terpengaruh. (yaitu jika Anda ingin mengubah pesan komit 3 kembali, lakukangit rebase -i HEAD~3 )

git akan memunculkan editor untuk menangani komit itu, perhatikan perintah ini:

#  r, reword = use commit, but edit the commit message

itulah tepatnya yang kita butuhkan!

Langkah2 : Ubah pickker untuk komitmen yang ingin Anda perbarui pesan. Jangan repot-repot mengubah pesan komit di sini, itu akan diabaikan. Anda akan melakukannya pada langkah berikutnya. Simpan dan tutup editor.

Perhatikan bahwa jika Anda mengedit 'paket' rebase Anda namun itu tidak memulai proses membiarkan Anda mengubah nama file, jalankan:

git rebase --continue

Jika Anda ingin mengubah editor teks yang digunakan untuk sesi interaktif (mis. Dari default vi ke nano), jalankan:

GIT_EDITOR=nano git rebase -i HEAD~n

Langkah 3 : Git akan memunculkan editor lain untuk setiap revisi yang Anda masukkan rsebelumnya. Perbarui pesan komit sesuka Anda, lalu simpan dan tutup editor.

Langkah4 : Setelah semua komit, pesan diperbarui. Anda mungkin ingin lakukan git push -funtuk memperbarui remote.

Jinsong Li
sumber
21
Jawaban ini harus diterima karena memberikan kemungkinan untuk mengubah komitmen lain daripada komitmen terbaru, tidak seperti jawaban yang diterima. Kamu menyelamatkan hariku. Terima kasih!
xZero
1
Pilih n = 3 untuk 3 komit terakhir:git rebase -i HEAD~3
HeikoS
Jika Anda mengedit rebase 'rencana' Anda namun itu tidak memulai proses untuk membiarkan Anda mengganti nama file, jalankan git rebase --continue. Dan jika Anda ingin mengubah editor teks yang digunakan untuk sesi interaktif (mis. Dari default vike nano), jalankan GIT_EDITOR=nano git rebase -i HEAD~n.
Jamie Birch
Saya mengedit ini untuk menambahkan lebih banyak info. Silakan lihat. Ini adalah jawaban untuk apa yang ingin saya lakukan, tetapi saya menggulirnya karena tidak memiliki header.
Kip
Saya telah membuat sunting yang disarankan untuk memasukkan komentar berguna dari @JamieBirch ke dalam jawabannya, mungkin ingin meninjau.
Notts90 mendukung Monica
44

Gunakan dua langkah ini di konsol:

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

lalu

git push -f

Selesai :)

Abdul Rizwan
sumber
Terima kasih, apakah itu langkah-langkah hanya untuk mengubah komentar terakhir atau dapatkah itu digunakan untuk komentar yang lebih lama juga?
Jay
@ Mohon maaf atas keterlambatan balasan, langkah-langkah ini hanya untuk mengubah pesan komit terakhir.
Abdul Rizwan
19

Perlu dicatat bahwa jika Anda menggunakan push --forcedengan referensi mutiple, mereka SEMUA akan dimodifikasi sebagai hasilnya. Pastikan untuk memperhatikan di mana repo git Anda dikonfigurasi untuk mendorong ke. Untungnya ada sedikit cara untuk menjaga prosesnya, dengan menetapkan satu cabang untuk diperbarui. Baca dari halaman git man:

Perhatikan bahwa --force berlaku untuk semua referensi yang didorong, karenanya menggunakannya dengan push.default yang disetel untuk mencocokkan atau dengan beberapa tujuan push yang dikonfigurasikan dengan remote. *. Push mungkin menimpa referensi selain cabang saat ini (termasuk referensi lokal yang di belakang rekan jauh mereka). Untuk memaksakan dorongan ke satu cabang saja, gunakan tanda + di depan refspec untuk mendorong (mis. Git push origin + master untuk memaksa dorongan ke cabang master).

Steve Benner
sumber
3
Catatan yang sangat penting.
peterh
tidak ada jawaban force yang berfungsi untuk saya, karena saya tidak memiliki izin ForcePush di server. Sebaliknya, saya ingin melakukan komit yang mengubah pesan komit sebelumnya. Saya bisa menulis "pesan komit diubah" ke bagian komentar komit itu.
nurettin
11

Jika Anda ingin memodifikasi lebih tua komit, bukan yang terakhir, Anda akan perlu menggunakan rebaseperintah seperti yang dijelaskan di sini, Github halaman bantuan , pada Mengamandemen pesan yang lebih tua atau beberapa pesan komit bagian

Carlos
sumber
11

Perintah 1 .

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

Kemudian,

Perintah 2 .

git push origin --force
Teo Choong Ping
sumber
8
git commit --amend

kemudian edit dan ubah pesan di jendela saat ini. Setelah itu lakukan

git push --force-with-lease
Beu
sumber
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 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 seperti 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
rob_7cc
sumber
merampok, ini terlihat menjanjikan. dapatkah Anda menunjukkan perintah yang diperlukan untuk melakukan "errata commit". hanya posting ini yang muncul di google dengan persyaratan ini.
Jim
1
"Errata commit" hanyalah sebuah komit normal dengan pesan yang merujuk komit yang salah sebelumnya, mendokumentasikan dan memberikan koreksi untuk kesalahan sebelumnya. git commit -m “fixed feature A”(Mari kita asumsikan git memberikan ini ID komit dari e3ab7312 ... ... (kemudian Anda menyadari pesan Anda salah, jadi sekarang buat perubahan yang tidak penting pada file seperti menambahkan spasi ke file readme, atau gunakan —allow-emptyopsi git). .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc
1
... jika nanti Anda perlu mencari referensi git log untuk "fitur B", komit errata akan muncul, tetapi pesan errata komit berisi referensi ke ID komit asli yang memberikan keterlacakan penuh. BTW istilah "errata commit" tidak ada yang istimewa (tidak ada perintah "errata" atau opsi di git) ... itu hanya terminologi saya untuk komit normal yang memberikan koreksi ke komit sebelumnya yang memiliki kesalahan / kesalahan ketik.
rob_7cc
merampok, itu bekerja dengan baik. Saya dapat menambahkan komit kosong baru dengan deskripsi yang benar, yang menunjuk ke komit asli, dengan menggunakan SHA. sekarang, keduanya ditampilkan di 'git chain' saya untuk modul. Terima kasih!
Jim
Saya senang itu berhasil untuk Anda. Saya menggunakan teknik yang sama untuk memperbaiki kesalahan dalam melakukan pesan. Sebagai alternatif, saya baru saja menemukan git notes Ini akan melayani tujuan yang sama dengan "errata commit". Cukup tambahkan catatan ke komit sebelumnya untuk membubuhi keterangan atau memperbaiki kesalahan dalam pesan komit: https://git-scm.com/docs/git-notes
rob_7cc
0

Ini bekerja dengan baik untuk saya,

git checkout asal / nama cabang

jika Anda sudah berada di cabang maka lebih baik melakukan tarik atau rebase

git pull

atau

git -c core.quotepath=false fetch origin --progress --prune

Nanti Anda cukup menggunakan

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

atau jika Anda ingin membuka editor teks maka gunakan

git commit --amend

Saya akan lebih suka menggunakan editor teks jika Anda memiliki banyak komentar. Anda dapat mengatur editor teks pilihan Anda dengan perintah

git config --global core.editor your_preffered_editor_here

Bagaimanapun, ketika Anda selesai mengubah pesan komit, simpan dan keluar

dan kemudian jalankan

git push --force

Dan kamu sudah selesai

Hasasn
sumber
0

informasi tambahan untuk masalah yang sama jika Anda menggunakan pipa bitbucket

edit pesan Anda

git commit --amend

dorong ke bagian

git push --force <repository> <branch>

kemudian tambahkan --force ke perintah push Anda di pipa

git ftp push --force

Ini akan menghapus komit Anda sebelumnya dan mendorong komit Anda saat ini.

menghapus --force setelah dorongan pertama

Saya mencobanya pada pipa bitbucket dan berfungsi dengan baik

Abdallah Awwad Alkhwaldah
sumber