Pertanyaan Bagaimana cara membatalkan commit terbaru di Git?


Saya tidak sengaja melakukan kesalahan pada file Git, tapi saya belum mendorong komitmen ke server.

Bagaimana saya dapat membatalkannya dari repositori lokal?


17794
2017-07-28 22:22


asal


Jawaban:


Batalkan commit dan ulangi

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Ini yang ingin Anda batalkan
  2. Ini meninggalkan pohon kerja Anda (keadaan file Anda di disk) tidak berubah tetapi membatalkan komit dan meninggalkan perubahan yang Anda lakukan tidak bertumpuk (sehingga mereka akan muncul sebagai "Perubahan tidak dipentaskan untuk melakukan" di git status, dan Anda harus menambahkannya lagi sebelum melakukan). Jika kamu hanya ingin menambahkan lebih banyak perubahan pada commit sebelumnya, atau ubah pesan commit1, Anda bisa menggunakan git reset --soft HEAD~ sebagai gantinya, yang seperti git reset HEAD~ (dimana HEAD~ sama dengan HEAD~1) tetapi biarkan perubahan yang ada dipentaskan.
  3. Lakukan koreksi pada file pohon yang berfungsi.
  4. git add apa pun yang ingin Anda sertakan dalam komitmen baru Anda.
  5. Lakukan perubahan, gunakan kembali pesan commit lama. reset menyalin kepala lama ke .git/ORIG_HEAD; commit dengan -c ORIG_HEAD akan membuka editor, yang pada awalnya berisi pesan log dari commit lama dan memungkinkan Anda untuk mengeditnya. Jika Anda tidak perlu mengedit pesan, Anda bisa menggunakan -C pilihan.

Namun waspadalah jika Anda telah menambahkan perubahan baru pada indeks, menggunakan commit --amend akan menambahkannya ke commit sebelumnya.

Jika kode sudah didorong ke server Anda dan Anda memiliki izin untuk menimpa histori (rebase), maka:

git push origin master --force

Anda juga dapat melihat jawaban ini:

Bagaimana cara memindahkan HEAD kembali ke lokasi sebelumnya? (Kepala terpisah)

Jawaban di atas akan menunjukkan kepada Anda git reflog yang digunakan untuk mencari tahu apa SHA-1 yang ingin Anda kembalikan. Setelah Anda menemukan titik yang ingin Anda batalkan untuk menggunakan urutan perintah seperti yang dijelaskan di atas.


1 Namun, perlu diketahui bahwa Anda tidak perlu me-reset ke commit sebelumnya jika Anda hanya membuat kesalahan dalam Anda komit pesan. Pilihan yang lebih mudah adalah git reset (untuk mengganti semua perubahan yang Anda buat sejak saat itu) dan kemudian git commit --amend, yang akan membuka editor pesan commit default Anda yang telah diisi sebelumnya dengan pesan commit terakhir.


19231
2018-06-16 17:27



Membatalkan komitmen sedikit menakutkan jika Anda tidak tahu cara kerjanya. Tapi sebenarnya sangat mudah jika Anda mengerti.

Katakanlah Anda memiliki ini, di mana C adalah HEAD Anda dan (F) adalah status file Anda.

   (F)
A-B-C
    ↑
  master

Yang kamu ingin nuke melakukan C dan tidak pernah melihatnya lagi. Anda melakukan ini:

git reset --hard HEAD~1

Hasilnya adalah:

 (F)
A-B
  ↑
master

Sekarang B adalah KEPALA. Karena kamu dulu --hard, file Anda disetel ulang ke statusnya di commit B.

Ah, tapi anggaplah bahwa C bukan bencana, tapi hanya sedikit. Yang kamu ingin batalkan commit tetapi pertahankan perubahan Anda untuk sedikit mengedit sebelum Anda melakukan commit yang lebih baik. Mulai lagi dari sini, dengan C sebagai HEAD Anda:

   (F)
A-B-C
    ↑
  master

Anda dapat melakukan ini, meninggalkan --hard:

git reset HEAD~1

Dalam hal ini hasilnya adalah:

   (F)
A-B-C
  ↑
master

Dalam kedua kasus, HEAD hanyalah penunjuk ke commit terakhir. Ketika Anda melakukan git reset HEAD~1, Anda memberitahu Git untuk memindahkan pointer HEAD kembali satu komit. Tetapi (kecuali Anda menggunakannya --hard) Anda meninggalkan file Anda sebagaimana adanya. Jadi sekarang git status menunjukkan perubahan yang telah Anda periksa ke C. Anda tidak kehilangan apapun!

Untuk sentuhan ringan, Anda bahkan bisa batalkan commit Anda tetapi tinggalkan file dan file Anda indeks:

git reset --soft HEAD~1

Ini tidak hanya meninggalkan file Anda sendiri, bahkan meninggalkan Anda indeks sendirian. Saat kamu melakukan git status, Anda akan melihat bahwa file yang sama berada dalam indeks seperti sebelumnya. Faktanya, tepat setelah perintah ini, Anda bisa melakukannya git commit dan Anda akan mengulangi komitmen yang sama yang baru saja Anda miliki.

Satu hal lagi: Misalkan Anda menghancurkan komit seperti pada contoh pertama, tetapi kemudian menemukan Anda membutuhkannya? Nasib sial, kan?

Tidak, ada masih cara untuk mendapatkannya kembali. Mengetik git reflog dan Anda akan melihat daftar (sebagian) commit shas yang telah Anda pindahkan. Temukan komitmen yang Anda hancurkan, dan lakukan ini:

git checkout -b someNewBranchName shaYouDestroyed

Anda sekarang telah membangkitkan komitmen itu. Komit tidak benar-benar dihancurkan di Git selama 90 hari, jadi Anda biasanya dapat kembali dan menyelamatkan yang tidak Anda maksudkan untuk disingkirkan.


9726
2018-05-29 18:16



Ini butuh waktu saya untuk mencari tahu, jadi mungkin ini akan membantu seseorang ...

Ada dua cara untuk "membatalkan" commit terakhir Anda, tergantung pada apakah Anda sudah membuat komitmen Anda publik (didorong ke repositori jarak jauh Anda):

Cara membatalkan commit lokal

Katakanlah saya berkomitmen secara lokal, tetapi sekarang ingin menghapus komitmen itu.

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

Untuk mengembalikan semuanya kembali seperti sebelum komit terakhir, kita perlu reset ke komit sebelumnya HEAD:

git reset --soft HEAD^     # use --soft if you want to keep your changes
git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made

Sekarang git log akan menunjukkan bahwa commit terakhir kami telah dihapus.

Cara membatalkan komitmen publik

Jika Anda sudah membuat komit Anda menjadi publik, Anda akan ingin membuat commit baru yang akan "mengembalikan" perubahan yang Anda buat dalam commit sebelumnya (HEAD saat ini).

git revert HEAD

Perubahan Anda sekarang akan dikembalikan dan siap untuk Anda komit:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Untuk info lebih lanjut, periksa Git Basics - Undoing Things


1744
2018-05-29 18:13



Tambahkan / hapus file untuk mendapatkan sesuatu sesuai keinginan Anda:

git rm classdir
git add sourcedir

Kemudian ubah komitmen:

git commit --amend

Sebelumnya, komit yang salah akan diedit untuk mencerminkan keadaan indeks baru - dengan kata lain, itu akan menjadi seperti Anda tidak pernah membuat kesalahan di tempat pertama.

Perhatikan bahwa Anda hanya harus melakukan ini jika Anda belum mendorong. Jika Anda telah mendorong, maka Anda hanya harus melakukan perbaikan secara normal.


1623
2017-07-31 09:39



git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

atau

git reset --hard HEAD~1

Peringatan: Perintah di atas akan secara permanen menghapus modifikasi pada .java file (dan file lainnya) yang ingin Anda komit.

Itu hard reset untuk HEAD-1 akan mengatur copy pekerjaan Anda ke keadaan komit sebelum Anda melakukan kesalahan.


875
2018-05-25 16:04



Untuk mengubah commit terakhir

Ganti file dalam indeks:

git rm --cached *.class
git add *.java

Lalu, jika itu adalah cabang pribadi, merubah komit:

git commit --amend

Atau, jika itu adalah cabang bersama, buat komitmen baru:

git commit -m 'Replace .class files with .java files'


(untuk mengubah komit sebelumnya, gunakan yang luar biasa rebase interaktif)


ProTip: Tambah *.class ke a gitignore untuk menghentikan ini terjadi lagi.


Untuk mengembalikan komit

Mengubah komitmen adalah solusi ideal jika Anda perlu mengubah komitmen terakhir, tetapi solusi yang lebih umum adalah reset.

Anda dapat mereset git ke commit dengan:

git reset @~N

Dimana N adalah jumlah commit sebelumnya HEAD, dan @~ me-reset ke commit sebelumnya.

Jadi, alih-alih mengubah komitmen, Anda bisa menggunakan:

git reset @~
git add *.java
git commit -m "Add .java files"

Periksa git help reset, khususnya bagian-bagiannya --soft  --mixed dan --hard, untuk pemahaman yang lebih baik tentang apa yang dilakukannya.

Reflog

Jika Anda mengacaukan, Anda selalu dapat menggunakan reflog untuk menemukan komitmen yang dijatuhkan:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



677
2018-01-31 07:06



Menggunakan git revert commit-id

Untuk mendapatkan ID komit, gunakan saja git log


547
2017-12-13 10:18



Jika Anda berencana membatalkan komitmen lokal sepenuhnya, apa pun perubahan yang Anda lakukan pada commit, dan jika Anda tidak khawatir tentang hal itu, lakukan saja perintah berikut.

git reset --hard HEAD^1

(Perintah ini akan mengabaikan seluruh commit Anda dan perubahan Anda akan hilang sepenuhnya dari pohon kerja lokal Anda). Jika Anda ingin membatalkan commit Anda, tetapi Anda ingin perubahan Anda di area stage (sebelum melakukan seperti setelahnya) git add) kemudian lakukan perintah berikut.

git reset --soft HEAD^1

Sekarang file Anda berkomitmen masuk ke area pementasan. Misalkan jika Anda ingin unstage file, karena Anda perlu mengedit beberapa conent yang salah, maka lakukan perintah berikut

git reset HEAD

Sekarang file-file yang berkomitmen berasal dari area yang dipentaskan ke area yang tidak diubah. Sekarang file sudah siap untuk diedit, jadi apa pun yang Anda ubah, Anda ingin mengedit dan menambahkannya dan membuat komitmen baru / segar.

Lebih


440
2018-04-06 13:58



Jika Anda memiliki Git Extras terinstal, Anda dapat menjalankan git undo untuk membatalkan commit terbaru. git undo 3 akan membatalkan 3 commit terakhir.


430
2017-10-25 03:41



Saya ingin membatalkan 5 commit terakhir di repositori bersama kami. Saya mencari id revisi yang ingin saya kembalikan. Lalu saya mengetikkan yang berikut ini.

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

398



Saya lebih suka menggunakannya git rebase -i untuk pekerjaan ini, karena daftar yang bagus muncul di mana saya dapat memilih komit untuk disingkirkan. Mungkin tidak searah dengan jawaban lain di sini, tapi itu hanya terasa benar.

Pilih berapa banyak komit yang ingin Anda daftar, lalu aktifkan seperti ini (untuk mendaftar tiga terakhir)

git rebase -i HEAD~3

Daftar contoh

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Kemudian git akan menghapus commit untuk setiap baris yang Anda hapus.


380