Cara membatalkan "git commit -mend" dilakukan alih-alih "git commit"

Saya tidak sengaja mengubah fiksasi saya sebelumnya. Akhir harus terpisah untuk menyimpan riwayat perubahan yang dibuat oleh saya ke file tertentu.

Apakah ada cara untuk membatalkan komit terakhir? Jika saya melakukan sesuatu seperti git reset --hard HEAD^ , komit pertama juga dibatalkan.

(Saya belum mengklik direktori yang dihapus)

819
22 сент. ditetapkan oleh Jesper Rønn-Jensen pada 22 Sep 2009-09-22 12:56 '09 pada 12:56 2009-09-22 12:56
@ 7 jawaban

Yang perlu Anda lakukan adalah membuat komit baru dengan detail yang sama dengan komit HEAD saat ini, tetapi dengan induk seperti pada HEAD versi sebelumnya. git reset --soft akan memindahkan pointer ke cabang sehingga komit berikutnya dilakukan di atas komit lain, dari mana cabang saat ini berada.

 # Move the current head so that it pointing at the old commit # Leave the index intact for redoing the commit. # HEAD@{1} gives you "the commit that HEAD pointed at before # it was moved to where it currently points at". Note that this is # different from HEAD~1, which gives you "the commit that is the # parent node of the commit that HEAD is currently pointing to." git reset --soft HEAD@{1} # commit the current tree using the commit details of the previous # HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the # previous command. It now pointing at the erroneously amended commit.) git commit -C HEAD@{1} 
1418
22 сент. balasan yang diberikan oleh Charles Bailey 22 Sep 2009-09-22 13:23 '09 pada pukul 13:23 2009-09-22 13:23

gunakan ref-log :

 git branch fixing-things HEAD@{1} git reset fixing-things 

Anda hanya harus memiliki semua perubahan yang dimodifikasi di copy pekerjaan Anda dan komit lagi

untuk melihat daftar lengkap tipe indeks git reflog sebelumnya

88
22 сент. balasan diberikan knittl 22 Sep 2009-09-22 13:02 '09 pada 13:02 2009-09-22 13:02

Temukan perubahan yang diperbaiki:

 git log --reflog 

Catatan Anda dapat menambahkan --patch untuk melihat isi komit untuk kejelasan. Sama seperti git reflog .

kemudian atur u>

 git reset SHA1 --hard 

Catatan: Ganti SHA1 dengan komit hash Anda yang sebenarnya. Perhatikan juga bahwa perintah ini akan kehi> perubahan yang tidak dikomit, sehingga Anda dapat menyalinnya lebih awal.

Kemudian ceri pilih perbaikan lain yang Anda butuhkan:

 git cherry-pick SHA1 
19
27 марта '16 в 4:56 2016-03-27 04:56 jawabannya diberikan kenorb 27 Maret '16 pada 4:56 2016-03-27 04:56

Anda selalu dapat membagi komit, dari manual

  • Mulai reboot interaktif dengan git rebase -i commit ^, di mana komit adalah komit yang ingin Anda bagi. Bahkan, rentang komit apa pun akan bertindak jika mengandung komit ini.
  • Tandai perbaikan yang ingin Anda bagi dengan tindakan edit.
  • Ketika perlu mengedit pesan ini, lakukan git reset HEAD ^. Efeknya adalah bahwa KEPALA digulung u>
  • Sekarang tambahkan perubahan ke indeks yang ingin Anda miliki pada komit pertama. Anda dapat menggunakan git add (mungkin interaktif) atau git -gui (atau keduanya) untuk ini.
  • Komit indeks saat ini saat ini dengan pesan komit. Sekarang
  • U>
  • Lanjutkan reboot dengan git rebase -continue.
18
22 сент. jawaban yang diberikan oleh Arkaitz Jimenez 22 Sep 2009-09-22 13:01 '09 pada pukul 01:01 2009-09-22 13:01

Mungkin Anda bisa menggunakan git reflog untuk mendapatkan dua commit sebelum perubahan dan setelah perubahan.

Kemudian gunakan git diff before_commit_id after_commit_id > d.diff untuk mendapatkan perbedaan antara perubahan dan setelah perubahan.

Kemudian gunakan git checkout before_commit_id untuk kembali sebelum git checkout before_commit_id

Dan penggunaan terakhir dari git apply d.diff untuk menerapkan perubahan nyata.

Ini menyelesaikan masalah saya.

10
20 сент. jawabannya diberikan utzcoz 20 sept . 2016-09-20 15:39 '16 pada 3:39 sore 2016-09-20 15:39

Mungkin perlu dicatat bahwa jika Anda masih di editor Anda dengan pesan komit, Anda dapat menghapus pesan komit dan itu akan membatalkan perintah git commit --amend .

4
03 марта '17 в 21:45 2017-03-03 21:45 Jawaban Justin Schulz adalah 03 Maret '17 pada 21:45 2017-03-03 21:45
  • Periksa cabang sementara dengan komit terakhir

    git branch temp HEAD@{1}

  • Setel u>

    git reset temp

  • Sekarang Anda akan memiliki semua file dengan fiksasi, serta dengan fiksasi sebelumnya. Periksa status semua file.

    git status

  • Setel u>

    git reset myfile1.js (seterusnya)

  • U>

    git commit -C HEAD@{1}

  • Tambahkan dan kunci file Anda untuk komit baru.

-1
04 марта '16 в 10:28 2016-03-04 10:28 jawabannya diberikan Priyanshu Chauhan 04 Maret 16 di 10:28 2016-03-04 10:28

Pertanyaan lain tentang tag atau Ajukan Pertanyaan