Bagaimana cara mengubah komit tanpa mengubah pesan komit (menggunakan kembali yang sebelumnya)?

657

Apakah ada cara untuk mengubah komit tanpa vi(atau Anda $EDITOR) muncul dengan opsi untuk mengubah pesan komit Anda, tetapi hanya menggunakan kembali pesan sebelumnya?

Sridhar Sarnobat
sumber
6
Saya akan membatalkan pertanyaan saya sendiri setelah belajar dengan susah payah kejahatan diubah.
Sridhar Sarnobat
28
Selama Anda mematuhi peraturan tertentu (seperti tidak mengubah sesuatu yang sudah didorong), tidak ada alasan mengapa mengubah harus menjadi hal yang buruk.
paullb
3
Amandemen komit tidak boleh digunakan untuk komit pekerjaan yang berselang selama satu perubahan logis. Untuk itu Anda harus berkomitmen secara lokal dengan benar dan kemudian labu komit sejarah setelah selesai (@ Sridhar-Sarnobat)
DBCerigo
3
Saya sepenuhnya setuju @DBCerigo. Satu-satunya situasi yang saya anggap amandemen berguna adalah ketika saya lupa untuk mem-stage file di komit sebelumnya (misalnya karena itu baru dan jadi tidak otomatis dipentaskan ketika menjalankan git commit -a) dan ingin melakukan surut secara retroaktif.
Sridhar Sarnobat
1
Amandemen waktu lain berguna bahkan jika Anda mengenali bahaya mengubah sejarah adalah jika Anda tidak puas dengan pesan komit terbaru Anda dan ingin mengulanginya tanpa harus rebase.
Sridhar Sarnobat

Jawaban:

1011

Sejak git versi 1.7.9 Anda juga dapat menggunakan git commit --amend --no-edituntuk mendapatkan hasil Anda.

Perhatikan bahwa ini tidak akan mencakup metadata dari komit lainnya seperti cap waktu yang mungkin atau mungkin tidak penting bagi Anda.

Shaggie
sumber
42
Anda juga dapat membuatnya lebih mudah untuk default ke flag --no-edit dengan menambahkan alias: "amend = commit -a --amend --no-edit"
Jherico
1
@ Jherico saya sarankan menghapus -a. Tolong lakukan komitmen atom, lebih mudah untuk meninjau atau rebase :)
frouo
120

git commit -C HEAD --amendakan melakukan apa yang Anda inginkan. The -Cpilihan mengambil metadata dari komit lain.

Andy Ross
sumber
15
Hanya untuk menambah jawaban Andy. Jika ini adalah sesuatu yang sering Anda lakukan maka Anda dapat mengatur alias untuk menggunakannya git config --global alias.amend 'commit --amend -C HEAD'. Anda kemudian dapat menggunakan git amendsebagai jalan pintas.
mikej
9
Ayo guys, jangan malas, tingkatkan git dan gunakan perintah bawaan yang disarankan Shaggle! Ditambah satu untuk opsi -C.
Dimitris Baltas
4
Tidak hanya cap waktu, tetapi juga informasi kepengarangan!
user1338062
3
@RyanCastner Memang, komentar yang Anda rujuk berasal dari 2013. Dengan versi git yang saya jalankan saat ini --amend,, bahkan tanpa opsi lain, mempertahankan tanggal penulis (tetapi mengubah tanggal komit). Karena itu, saya telah menghapus komentar lama saya.
Ruben Verborgh
2
Sebenarnya jawaban ini berharga dengan cara yang berbeda walaupun itu bukan jawaban yang diterima. Berbeda dengan jawaban yang lain, Anda tidak harus menggunakan —amend. Anda dapat membuat komit baru tetapi menggunakan pesan yang sama dengan komit sebelumnya. Itu mungkin kedengarannya tidak berguna tetapi pesan komit saya secara default ketika saya hanya menyimpan pekerjaan saya tanpa harus memikirkan pesan komit yang bagus, saya terus menggunakan kembali pesan tersebut—message=“Work in progress (untested)”
Sridhar Sarnobat
67

Kemungkinan lain (konyol) adalah git commit --amend <<< :wqjika Anda memiliki vi (m) sebagai $EDITOR.

galva
sumber
39
Bahkan jika itu tidak perlu untuk kasus penggunaan ini, saya tidak tahu Anda dapat mengirim ke vim. Itu membuka beberapa kemungkinan yang menarik. Tip yang bagus.
Sridhar Sarnobat
6
... <<< ZZmungkin mengetik lebih sedikit;)
Ruslan
6
..dan bahkan kurang - ... <<< :x:)
skwisgaar
3
Saya tidak berpikir itu konyol. Ini adalah cara yang bagus untuk meningkatkan alur kerja untuk setiap perintah yang terbuka vi.
B Tujuh
12
kurung sudut tiga. itu baru.
oligofren
16

Untuk memperluas jawaban yang diterima, Anda juga dapat melakukan:

git commit --amend --no-edit -a

untuk menambahkan file yang saat ini diubah.

Rambatino
sumber
11

Menggunakan jawaban yang diterima untuk membuat alias

 oops = "!f(){ \
    git add -A; \
    if [ \"$1\" == '' ]; then \
        git commit --amend --no-edit; \
    else \
        git commit --amend \"$@\"; \
    fi;\
}; f"

maka kamu bisa melakukannya

git oops

dan itu akan menambahkan semuanya, dan mengubah menggunakan pesan yang sama

atau

git oops -m "new message"

untuk mengubah mengganti pesan

aljgom
sumber