git: batalkan komit di tengah mengetik pesan

131

Saya di tengah-tengah melakukan. Saya telah mengetik pesan komit saya di vim. Sekarang saya ingat saya perlu mengubah sesuatu. Saya menyadari bahwa ada opsi lain untuk mencapai apa yang saya inginkan, tetapi saya ingin tahu apakah ada cara untuk membatalkan komit tetapi masih menyimpan pesan komit yang saya ketikkan sejauh ini.

Alexander Bird
sumber

Jawaban:

85

Iya. Tulis pesan komit ke file yang berbeda ( :w /some/other/path.txt). Kemudian keluar dari editor tanpa menyimpan ( :q!). Jika sebelumnya Anda menyimpan file ke jalur aslinya, hapus semuanya dan tulis file kosong terlebih dahulu (pesan komit kosong akan membatalkan komit).

Sekarang, ketika Anda siap untuk melakukan "untuk real", gunakan file pesan yang Anda simpan di jalur alternatif.

Bergantian, salin pesan komit ke salah satu buffer vim.

Perlu dicatat bahwa Anda benar-benar tidak perlu melakukan ini sama sekali : commit --amendmemungkinkan Anda mengubah komit setelah dibuat, jadi solusi mudahnya adalah menghasilkan komit dengan apa yang Anda miliki dan kemudian memperbaikinya sebelum mendorong. Anda bahkan bisa menyelesaikan komit dalam kondisi rusak, reset HEAD~(mengatur ulang Anda ke status copy pekerjaan Anda sebelum komit), memperbaiki copy pekerjaan Anda, dan kemudian commit -a -c HEAD@{1}menggunakan pesan komit lama.

Borealid
sumber
7
Catatan: Keluar vim menggunakan ": q!" tidak akan membatalkan komit jika ada pesan konflik penggabungan yang diisi otomatis. Sebagai gantinya komit akan berlanjut dan pesan tidak akan mencantumkan file yang mengalami konflik.
stephenbez
write the empty file (an empty commit message will abort the commit)sebagian bekerja seperti pesona, terima kasih!
Саша Давиденко
182

Jika editor Anda dapat keluar dengan kode kesalahan - Git akan membatalkan komit. Saat menggunakan VIM, ketikkan

:cq

untuk keluar dengan kode kesalahan non-nol dan batalkan komit.

nimrodm
sumber
5
Ini adalah trik yang bagus untuk membatalkan commit --amendkarena Anda harus menghapus pesan komit yang ada dan :wq.
Alex Jasmin
2
Trik yang bagus! Namun pertanyaannya adalah bagaimana cara menyimpan pesan komit, bukan menghapusnya.
Elijah Lynn
jadi bagaimana svn berhasil melakukan ini? apa yang terlihat di samping kode keluar?
Chaim Geretz
1
hebat ketika Anda melakukan rebase interaktif alias squashing commit
hellatan
menyelamatkan hidup saya ketika saya melakukan git commit --amendalih - alih git rebase --continuesaat rebase.
Weishi Zeng
68

Jika Anda telah membuka vim untuk menulis pesan komit Anda, hapus saja baris yang tidak dimulai dengan # dan git akan membatalkan komit Anda

Aborting commit due to empty commit message.
zetta
sumber
11
Ini sangat berguna ketika Anda ingin membatalkan git commit --amend.
edsko
1
Pertanyaannya adalah bagaimana cara membatalkan komit tetapi menyimpan pesan komit. Menghapus baris yang tidak dimulai dengan # secara efektif menghapus pesan komit, bukan menyimpan pesan komit. Tidak yakin bagaimana ini memiliki begitu banyak upvotes.
Elijah Lynn
2
ggdGakan memotong semua konten pesan, maka lain kali Anda menjalankannya, vimAnda bisa hanya Pteks yang Anda potong sebelumnya.
oromoiluig
bekerja menggunakan nano, ctrl + k semua baris lalu simpan dan keluar akan dibatalkan
Juh_
9

Meskipun Anda dapat membatalkan komit, pendekatan lain adalah mengubah komit sesudahnya. Cukup komit pekerjaan Anda saat ini, kemudian buat perubahan tambahan apa pun yang Anda inginkan git add, lalu jalankan git commit --amend. Anda akan ditempatkan kembali ke dalam editor pesan komit, dan ketika Anda menyimpan, komit tersebut akan diamandemen untuk menyertakan perubahan tambahan dan pesan komit baru Anda.

omong kosong
sumber
7

Iya itu mungkin. Untuk melakukan komit, editor Anda HARUS menulis pesan komit ke file .git/COMMIT_EDITMSGdan keluar dengan kode status 0.

Jadi jika Anda menggunakan VI / VIM, Anda mungkin ingin melakukan yang berikut ...

  1. Tulis pesan komit Anda.
  2. Simpan pesan komit dengan :w(secara default ini akan menyimpan konten saat ini ke .git/COMMIT_EDITMSG)
  3. Keluar dari editor dengan kesalahan :cq
  4. ... melakukan apa yang harus Anda lakukan ... bahkan menambah / menghapus file ke area pementasan.
  5. Lanjutkan dengan mengedit pesan komit yang ada dengan git commit -eF .git/COMMIT_MESSAGE

The -F /path/to/fileakan mengisi editor dengan konten yang diberikan dari / path / ke / file. Namun, secara default ini akan langsung melakukan komit, kecuali jika Anda memberikan -ebendera tambahan untuk mengedit .

Rudolf Tucek
sumber
ini berfungsi, tetapi kurang disukai karena 1) mengasumsikan saya CWD adalah di mana folder .git adalah 2) Saya menggunakan worktrees git , dan dengan worktrees git, .git sebenarnya adalah file yang mengatakan di mana sebenarnya folder .git berada.
Alexander Bird
@AlexanderBird ini tidak benar ... ketika Anda ingin mengambil pesan komit lama di langkah 5), Anda hanya perlu menentukan jalur relatif (misalkan Anda berada di /foo/bar/direktori, relatif dari root proyek) sepertigit commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek
@AlexanderBird keren, belum memperhatikan dengan fitur beberapa pohon yang bekerja di git. Terima kasih atas petunjuknya! Saya percaya satu-satunya downside pada hal ini adalah, Anda harus menyimpan gambaran umum di kepala Anda, yang mencegah Anda fokus pada kode aktual. Dan hanya untuk mengambil pesan komit di "tempat saya tinggalkan` itu agak berat :)
Rudolf Tucek
1
@AlexanderBird maka alih-alih :wlakukan :sav committmpdangit commit -eF committmp
Hashbrown
0

Saya biasanya membuat komitmen dengan IntelliJmenggunakan terminal yang disediakan. Sayangnya komit saya manual:

git commit -m'my message' // etc

jadi satu-satunya hal yang saya pikir aman untuk dilakukan hanyalah menutup jendela terminal! Sorot teks Anda jika Anda ingin menyimpannya, lalu salin, lalu tutup jendela terminal.

SovietFrontier
sumber
-2

jawaban @bdonlan baik untuk pertanyaan ini, tetapi saya akan menunjukkan situasi di mana Anda mungkin menginginkan solusi yang lebih baik.

Katakanlah Anda ingin menambahkan perubahan ke komit terakhir. Jadi Anda lakukan seperti yang disarankan @bdolan:

git add files
git commit --amend

Bayangkan saat menulis pesan baru, Anda menyesal menambahkan file-file itu ke komit itu. Masalahnya adalah Anda terjebak dengan pesan komit yang sudah disimpan dan keluar dari editor (dengan atau tanpa menyimpan) akan menambahkan perubahan itu ke komit terakhir. Mengembalikan ke titik Anda sebelumnya sebelum tindakan ini mengharuskan Anda untuk membagi komit terakhir - saya yakin Anda ingin menghindarinya.

Caranya adalah dengan menyimpan dan keluar dari editor sementara itu hanya memiliki garis yang dimulai dengan #atau tanpa garis sama sekali. Ketika Anda keluar, Anda akan disambut dengan pesan:

Aborting commit due to empty commit message.

Dan Anda belum mengubah komit terakhir sama sekali.

Doron Behar
sumber
Jika saya mengerti apa yang Anda katakan adalah masalah, maka Anda salah; seperti yang ditunjukkan di sini: git commit; vim ....; git commit --amend; git reset HEAD@{1}. Yaitu: jika saya ingin "membatalkan" amandemen, maka saya tidak perlu membagi komit sebelumnya. objek komit yang HEAD sebelum diubah disimpan sebagai HEAD@{1}. Selain itu, zetta sudah menyarankan untuk menghapus semua baris non-komentar.
Alexander Bird