Bagaimana cara membatalkan komitmen lokal terbaru di Git?

21064

Saya tidak sengaja melakukan file yang salah ke Git , tapi saya belum mendorong komit ke server.

Bagaimana saya bisa membatalkan komit dari repositori lokal?

Peter Mortensen
sumber
138
Sebelum Anda memposting jawaban baru, pertimbangkan sudah ada 65+ jawaban untuk pertanyaan ini. Pastikan jawaban Anda berkontribusi apa yang tidak ada di antara jawaban yang ada.
Sazzad Hissain Khan
91
Anda tahu apa yang dibutuhkan git? git undo, itu dia. Maka reputasi yang dimiliki git untuk menangani kesalahan yang dibuat oleh kita hanyalah manusia yang menghilang. Terapkan dengan mendorong kondisi saat ini pada git stack sebelum menjalankan gitperintah apa pun . Ini akan memengaruhi kinerja, jadi yang terbaik adalah menambahkan tanda konfigurasi apakah akan mengaktifkannya.
Yimin Rong
11
@YiminRong Itu bisa dilakukan dengan aliasfitur Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliases
Edric
3
@RomainValeri - Cara yang sama membatalkan bekerja di tempat lain.
Yimin Rong
1
@YiminRong Tidak membelinya. Orang-orang masih akan meraba-raba dan membatalkan berbagai hal agar tidak dibatalkan. Tetapi yang lebih penting, git reflogsudah dekat dengan apa yang Anda gambarkan, tetapi memberi pengguna lebih banyak kontrol pada apa yang harus dilakukan (tidak) dilakukan. Tapi tolong, tidak, "undo" tidak berfungsi sama di mana-mana, dan orang-orang akan berharap banyak hal yang berbeda untuk dicapai fitur tersebut. Batalkan komit terakhir? Membatalkan tindakan terakhir? Jika aksi terakhir adalah push, undo how tepatnya, (reset dan push) atau (revert and push)?
RomainValeri

Jawaban:

22862

Batalkan komit dan ulang

$ 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 tidak melakukan apa-apa pada pohon kerja Anda (keadaan file Anda pada disk), tetapi membatalkan komit dan membiarkan perubahan yang Anda lakukan tidak bertahap (sehingga mereka akan muncul sebagai "Perubahan tidak dipentaskan untuk komit" di git status, jadi Anda harus tambahkan lagi sebelum melakukan). Jika Anda hanya ingin menambahkan lebih banyak perubahan pada komit sebelumnya, atau mengubah pesan komit 1 , Anda dapat menggunakannya git reset --soft HEAD~sebagai gantinya, yaitu seperti git reset HEAD~2 tetapi membiarkan perubahan yang ada dipentaskan.
  3. Buat koreksi untuk file pohon yang berfungsi.
  4. git add apa pun yang ingin Anda sertakan dalam komit baru Anda.
  5. Komit perubahan, menggunakan kembali pesan komit lama. resetmenyalin kepala lama ke .git/ORIG_HEAD; commitdengan -c ORIG_HEADakan membuka editor, yang awalnya berisi pesan log dari komit lama dan memungkinkan Anda untuk mengeditnya. Jika Anda tidak perlu mengedit pesan, Anda bisa menggunakan -Copsi.

Berhati-hatilah, jika Anda telah menambahkan perubahan baru ke indeks, menggunakan commit --amendakan menambahkannya ke komit Anda sebelumnya.

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

git push origin master --force

Anda juga dapat melihat jawaban ini:

Bagaimana saya bisa memindahkan HEAD kembali ke lokasi sebelumnya? (Kepala terpisah) & Undo berkomitmen

Jawaban di atas akan menunjukkan kepada Anda git reflog,yang digunakan untuk mencari tahu apa itu 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, perhatikan bahwa Anda tidak perlu mengatur ulang ke komit sebelumnya jika Anda hanya membuat kesalahan dalam pesan komit Anda . Opsi yang lebih mudah adalah git reset(untuk tidak menampilkan perubahan yang telah Anda buat sejak itu) dan kemudian git commit --amend, yang akan membuka editor pesan komit default Anda yang sudah diisi sebelumnya dengan pesan komit terakhir.

2 HEAD~ sama dengan HEAD~1. Juga, lihat Apa KEPALA di git? . Akan sangat membantu jika Anda ingin menghentikan beberapa komitmen.

Mark Amery
sumber
472
Dan jika komit adalah ke cabang yang salah, Anda dapat git checkout theRightBranchdengan semua tahapan perubahan. Seperti yang harus saya lakukan.
Frank Shearar
490
Jika Anda bekerja di DOS, git reset --soft HEAD^Anda tidak perlu menggunakannya git reset --soft HEAD~1. ^ Adalah karakter lanjutan dalam DOS sehingga tidak akan berfungsi dengan baik. Juga, --softadalah default, sehingga Anda dapat menghilangkannya jika Anda suka dan hanya mengatakan git reset HEAD~1.
Ryan Lundy
119
Pengguna zsh mungkin mendapatkan: zsh: no matches found: HEAD^- Anda harus melarikan diri ^ iegit reset --soft HEAD\^
tnajdek
7
Jawabannya tidak benar jika, katakanlah secara tidak sengaja, git commit -adikeluarkan ketika -aseharusnya ditinggalkan. Dalam hal ini, lebih baik jangan tinggalkan --soft(yang akan menghasilkan --mixeddefault) dan kemudian Anda dapat mengembalikan perubahan yang ingin Anda komit.
dmansfield
6
@IcyBrk git add adalah sebuah perintah. git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ashraf.Shk786
10734

Membatalkan komit agak menakutkan jika Anda tidak tahu cara kerjanya. Tetapi sebenarnya sangat mudah jika Anda mengerti.

Katakan Anda memilikinya, di mana C adalah KEPALA Anda dan (F) adalah status file Anda.

   (F)
A-B-C
    ↑
  master

Anda ingin nuke melakukan C dan tidak pernah melihatnya lagi dan kehilangan semua perubahan dalam file yang dimodifikasi secara lokal . Anda melakukan ini:

git reset --hard HEAD~1

Hasilnya adalah:

 (F)
A-B
  ↑
master

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

Ah, tapi anggap komit C bukan bencana, tapi hanya sedikit. Anda ingin membatalkan komit tetapi simpan perubahan Anda untuk sedikit pengeditan sebelum Anda melakukan komit yang lebih baik. Mulai lagi dari sini, dengan C sebagai KEPALA 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, KEPALA hanyalah penunjuk ke komit terbaru. Ketika Anda melakukan git reset HEAD~1, Anda memberi tahu Git untuk memindahkan pointer HEAD kembali satu komit. Tetapi (kecuali jika Anda menggunakan --hard) Anda meninggalkan file Anda seperti sebelumnya. Jadi sekarang git statustunjukkan perubahan yang Anda periksa ke C. Anda belum kehilangan apa-apa!

Untuk sentuhan paling ringan, Anda bahkan dapat membatalkan komit tetapi meninggalkan file dan indeks Anda :

git reset --soft HEAD~1

Ini tidak hanya meninggalkan file Anda sendiri, bahkan meninggalkan indeks Anda sendiri. Ketika Anda melakukannya git status, Anda akan melihat bahwa file yang sama ada dalam indeks seperti sebelumnya. Bahkan, tepat setelah perintah ini, Anda bisa melakukannya git commitdan Anda akan mengulangi komit yang sama yang baru saja Anda miliki.

Satu hal lagi: Misalkan Anda menghancurkan komit seperti pada contoh pertama, tetapi kemudian ternyata Anda membutuhkannya ? Keberuntungan yang berat, bukan?

Tidak, masih ada cara untuk mendapatkannya kembali. Ketik git reflogdan Anda akan melihat daftar koma (parsial) shas (yaitu, hash) yang telah Anda gunakan. Cari komit yang Anda hancurkan, dan lakukan ini:

git checkout -b someNewBranchName shaYouDestroyed

Anda sekarang telah menghidupkan kembali komit itu. Komit tidak benar-benar dihancurkan di Git selama sekitar 90 hari, jadi Anda biasanya dapat kembali dan menyelamatkan yang tidak ingin Anda singkirkan.

Ryan Lundy
sumber
15
WASPADALAH! Ini mungkin tidak melakukan apa yang Anda harapkan jika komit Anda yang salah adalah penggabungan (maju cepat)! Jika kepala Anda berada di komit gabungan (ex: fitur cabang digabung menjadi master), git reset --hard~1akan mengarahkan cabang master ke komit terakhir di dalam cabang fitur. Dalam hal ini ID komit khusus harus digunakan alih-alih perintah relatif.
Chris Kerekes
90
Kehilangan poin penting: Jika komit tersebut sebelumnya 'didorong' ke remote, operasi 'undo' apa pun, sesederhana apa pun, akan menyebabkan rasa sakit dan penderitaan luar biasa bagi pengguna yang memiliki komitmen ini di salinan lokal mereka, ketika mereka melakukan 'git pull' di masa depan. Jadi, jika komit sudah 'didorong', lakukan ini sebagai git: git revert <bad-commit-sha1-id> asal git push:
FractalSpace
12
@FractalSpace, itu tidak akan menyebabkan "rasa sakit dan penderitaan yang luar biasa." Saya telah melakukan beberapa dorongan paksa saat menggunakan Git dengan sebuah tim. Yang diperlukan hanyalah komunikasi.
Ryan Lundy
14
@Kyralessa Di tempat kerja saya, mengacaukan alur kerja seluruh tim dan kemudian memberi tahu mereka cara memperbaiki sh * t tidak disebut 'komunikasi'. git history re-write adalah operasi destruktif yang mengakibatkan pemecatan bagian repo. Bersikeras pada penggunaannya, sementara alternatif yang jelas dan aman tersedia tidak bertanggung jawab.
FractalSpace
14
Saya ingin nuke komit dan tidak pernah melihatnya lagi. Saya menggunakan contoh Anda dengan --hardtetapi apa yang tidak saya sadari adalah bahwa semua perubahan saya yang tidak dipentaskan di pohon kerja saya juga nuked! Saya akan mengkomit file-file ini sebagai bagian dari komit nanti. Sekarang sepertinya tidak mungkin untuk mendapatkan kembali file-file ini - saya bahkan mencoba solusi yang Anda posting reflogtetapi ini tidak mengembalikan perubahan yang sebelumnya tidak dipentaskan.
Adam Burley
2129

Ada dua cara untuk "membatalkan" komit terakhir Anda, tergantung pada apakah Anda telah membuat komit Anda publik (didorong ke repositori jauh Anda):

Cara membatalkan komit lokal

Katakanlah saya berkomitmen secara lokal, tetapi sekarang saya 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 semula sebelum komit terakhir, kita perlu ke resetkomit 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 logakan menunjukkan bahwa komit terakhir kami telah dihapus.

Cara membatalkan komitmen publik

Jika Anda telah membuat komitmen Anda menjadi publik, Anda akan ingin membuat komit baru yang akan "mengembalikan" perubahan yang Anda buat pada komit 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 informasi lebih lanjut, lihat Git Basics - Undoing Things .

Andrew
sumber
101
Saya menemukan jawaban ini paling jelas. git revert HEAD^bukan yang sebelumnya, adalah yang sebelumnya dari yang sebelumnya. Saya lakukan: git revert HEADdan kemudian mendorong lagi dan itu berhasil :)
nacho4d
Jika Git bertanya, "Lebih?" ketika Anda mencoba perintah ini, gunakan sintaks alternatif pada jawaban ini: stackoverflow.com/a/14204318/823470
tar
1745

Tambah / hapus file untuk mendapatkan hal-hal seperti yang Anda inginkan:

git rm classdir
git add sourcedir

Kemudian ubah komit:

git commit --amend

Komit yang salah dan sebelumnya akan diedit untuk mencerminkan status indeks baru - dengan kata lain, itu akan seperti Anda tidak pernah melakukan kesalahan sejak awal.

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

omong kosong
sumber
2
FYI: Ini menghapus semua file saya dan saya kehilangan perubahan.
egorlitvinenko
UPD: Namun, saya sudah mengembalikannya menggunakan reflog. Tetapi kwitansi tidak berfungsi untuk komit awal.
egorlitvinenko
1
Gunakan git rm --cacheduntuk menyimpan file dalam sistem file dan hanya menghapusnya dari indeks git!
xuiqzy
1016
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 .javafile (dan file lain) yang ingin Anda komit.

The hard resetuntuk HEAD-1akan mengatur copy pekerjaan Anda ke negara dari komit sebelum salah Anda komit.

Lennart Koopmann
sumber
19
git commit -a -m ""atau git commit -am ""secara alami! :]
trejder
Penggunaan 'jalan pintas' lain dari simpanan; jika Anda ingin menghapus semuanya (undo git add), adil git stash, lalugit stash pop
seanriordan08
778

Untuk mengubah komit terakhir

Ganti file dalam indeks:

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

Kemudian, jika itu adalah cabang pribadi, ubah komit:

git commit --amend

Atau, jika itu cabang bersama, buat komit baru:

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


( Untuk mengubah komit sebelumnya , gunakan rebase interaktif yang mengagumkan .)


ProTip ™: Tambahkan *.classke gitignore untuk menghentikan ini terjadi lagi.


Untuk mengembalikan komit

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

Anda dapat mengatur ulang Git ke komit apa pun dengan:

git reset @~N

Di mana Njumlah komit sebelumnya HEAD, dan @~reset ke komit sebelumnya.

Jadi, alih-alih mengubah komit, Anda dapat menggunakan:

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

Lihat git help reset, khususnya bagian --soft --mixeddan --hard, untuk pemahaman yang lebih baik tentang apa yang dilakukannya.

Reflog

Jika Anda berantakan, 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


Zaz
sumber
2
Bagi mereka yang membaca di masa depan - harap dicatat bahwa itu git revertadalah perintah terpisah - yang pada dasarnya 'me-reset' satu komisi.
BKSpurgeon
682

Gunakan git revert <commit-id>.

Untuk mendapatkan ID komit, cukup gunakan git log.

Jaco Pretorius
sumber
15
Apa artinya itu, ceri memilih komit? Dalam kasus saya, saya berada di cabang yang salah ketika saya mengedit file. Saya melakukannya kemudian menyadari bahwa saya berada di cabang yang salah. Menggunakan "git reset --soft HEAD ~ 1" membuat saya kembali tepat sebelum komit, tetapi sekarang jika saya checkout cabang yang benar, bagaimana cara membatalkan perubahan ke file di cabang yang salah tetapi membuatnya (dengan nama yang sama file) di cabang yang benar?
astronombang
Saya hanya dimanfaatkan git revert commit-idbekerja seperti pesona. Tentu saja Anda harus mendorong perubahan Anda.
Casey Robinson
8
Saya yakin itu adalah git cherry-pick <<erroneous-commit-sha>>@astronomerdave. Dari, Tn. Hampir-2-Tahun-Terlambat-ke-Partai.
Tom Howard
@ Kris: Alih-alih menggunakan cherry-pick, gunakan rebase. Karena sudah maju memetik ceri
Eugen Konkov
Saya akan menggunakan pengembalian hanya jika saya sudah mendorong komit saya. Kalau tidak, reset adalah opsi yang lebih baik. Jangan lupa bahwa revert menciptakan komit baru, dan biasanya ini bukan tujuannya.
Hola Soy Edu Feliz Navidad
532

Jika Anda berencana untuk membatalkan komit lokal sepenuhnya, apa pun yang Anda ubah Anda lakukan pada komit, dan jika Anda tidak khawatir tentang hal itu, lakukan saja perintah berikut.

git reset --hard HEAD^1

(Perintah ini akan mengabaikan seluruh komit Anda dan perubahan Anda akan hilang sepenuhnya dari pohon kerja lokal Anda). Jika Anda ingin membatalkan komit Anda, tetapi Anda ingin perubahan Anda di area pementasan (sebelum komit seperti setelah git add) maka lakukan perintah berikut.

git reset --soft HEAD^1

Sekarang file berkomitmen Anda datang ke area pementasan. Misalkan jika Anda ingin mengungguli file, karena Anda perlu mengedit beberapa konten yang salah, maka lakukan perintah berikut

git reset HEAD

Sekarang file yang dikomit untuk datang dari area yang dipentaskan ke area yang tidak dipentaskan. Sekarang file siap diedit, jadi apa pun yang Anda ubah, Anda ingin pergi mengedit dan menambahkannya dan membuat komit baru / baru.

Lebih

Madhan Ayyasamy
sumber
13
@ SMR, Dalam contoh Anda, semua menunjuk ke HEAD saat ini saja. KEPALA ^ = KEPALA ^ 1. Serta KEPALA ^ 1 = KEPALA ~ 1. Saat Anda menggunakan HEAD ~ 2, ada perbedaan antara simbol ~ dan ^. Jika Anda menggunakan ~ 2 berarti "orang tua pertama dari orang tua pertama," atau "kakek-nenek".
Madhan Ayyasamy
501

Jika Anda menginstal Git Extras , Anda dapat menjalankan git undountuk membatalkan komit terbaru. git undo 3akan membatalkan tiga komitmen terakhir.

nickf
sumber
470

Saya ingin membatalkan lima komitmen terakhir di repositori bersama kami. Saya mencari id revisi yang ingin saya kembalikan. Lalu saya mengetik 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 [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>
neoneye
sumber
25
Menulis ulang sejarah di repositori bersama umumnya merupakan ide yang sangat buruk. Saya berasumsi Anda tahu apa yang Anda lakukan, saya hanya berharap pembaca di masa depan juga melakukannya.
Brad Koch
Ya rollback itu berbahaya. Pastikan copy pekerjaan Anda dalam kondisi yang diinginkan sebelum Anda mendorong. Ketika mendorong maka komit yang tidak diinginkan akan dihapus secara permanen.
neoneye
6
"Sama seperti di dunia nyata, jika Anda ingin menulis ulang sejarah, Anda memerlukan konspirasi: semua orang harus 'terlibat' dalam konspirasi (setidaknya setiap orang yang tahu tentang sejarah, yaitu setiap orang yang pernah menarik dari cabang) . " Sumber: stackoverflow.com/a/2046748/334451
Mikko Rantalainen
440

Saya lebih suka menggunakan git rebase -iuntuk pekerjaan ini, karena daftar yang bagus muncul di mana saya dapat memilih komitmen untuk menyingkirkan. Mungkin tidak secara langsung seperti beberapa jawaban lain di sini, tetapi rasanya benar .

Pilih berapa banyak komit yang ingin Anda daftarkan, kemudian panggil seperti ini (untuk mendaftar tiga terakhir)

git rebase -i HEAD~3

Daftar sampel

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

Kemudian Git akan menghapus komit untuk setiap baris yang Anda hapus.

Steven Penny
sumber
422

Cara memperbaiki komit lokal sebelumnya

Gunakan git-gui (atau yang serupa) untuk melakukan a git commit --amend. Dari GUI Anda dapat menambah atau menghapus file individual dari komit. Anda juga dapat mengubah pesan komit.

Cara membatalkan komit lokal sebelumnya

Setel ulang cabang Anda ke lokasi sebelumnya (misalnya, menggunakan gitkatau git rebase). Kemudian gunakan kembali perubahan Anda dari salinan yang disimpan. Setelah pengumpulan sampah di repositori lokal Anda, itu akan seperti komit yang tidak diinginkan tidak pernah terjadi. Untuk melakukan semua itu dalam satu perintah, gunakan git reset HEAD~1.

Kata peringatan : Penggunaan sembrono git resetadalah cara yang baik untuk membuat copy pekerjaan Anda dalam keadaan membingungkan. Saya merekomendasikan agar Git pemula menghindari ini jika mereka bisa.

Cara membatalkan komitmen publik

Lakukan reverse cherry pick ( git-revert ) untuk membatalkan perubahan.

Jika Anda belum menarik perubahan lain ke cabang Anda, Anda bisa melakukan ...

git revert --no-edit HEAD

Kemudian dorong cabang Anda yang diperbarui ke repositori bersama.

Riwayat komit akan menampilkan kedua komit, secara terpisah .


Advanced: Koreksi cabang pribadi di repositori publik

Ini bisa berbahaya - pastikan Anda memiliki salinan cabang setempat untuk diperbaiki.

Perhatikan juga: Anda tidak ingin melakukan ini jika ada orang lain yang bekerja di cabang.

git push --delete (branch_name) ## remove public version of branch

Bersihkan cabang Anda secara lokal lalu ...

git push origin (branch_name)

Dalam kasus normal, Anda mungkin tidak perlu khawatir tentang riwayat komit cabang pribadi Anda masih asli. Hanya mendorong komit tindak lanjut (lihat 'Cara membatalkan komitmen publik' di atas), dan kemudian, lakukan penggabungan squash untuk menyembunyikan sejarah.

mulia
sumber
8
gitk --all $(git reflog | cut -c1-7)&mungkin membantu untuk menemukan revisi sebelumnya jika Anda ingin membatalkan komit '- ubah'.
nobar
4
Perlu dicatat bahwa jika Anda mencoba untuk menghapus informasi rahasia sebelum mendorong ke repositori bersama, melakukan pengembalian tidak akan membantu Anda, karena informasi tersebut masih dalam sejarah di komit sebelumnya. Jika Anda ingin memastikan perubahan tidak pernah terlihat oleh orang lain, Anda perlu menggunakangit reset
Jherico
Saya pikir 'pribadi' / 'publik' akan lebih tepat menjadi 'lokal' / 'jauh'.
nobar
Mengoreksi cabang pribadi di repositori jarak jauh juga dapat dilakukan dengan mudahgit push origin (branch_name) --force
nobar
336

Jika Anda ingin membatalkannya secara permanen dan Anda telah mengkloning beberapa repositori

ID komit dapat dilihat oleh

git log 

Maka Anda bisa melakukan -

git reset --hard <commit_id>

git push origin <branch_name> -f
poorva
sumber
Bagaimana jika Anda tidak menggunakan "<commit_id>" dan cukup menggunakan "git reset --hard"? Saya biasanya hanya ingin menyingkirkan pembaruan terbaru saya yang belum saya komit dan kembali ke komit terbaru yang saya buat, dan saya selalu menggunakan "git reset --hard".
Jaime Montoya
3
@JaimeMontoya Untuk membatalkan perubahan terbaru yang dapat Anda gunakan git reset --hard, tetapi jika Anda harus menghapus dengan keras komitmen "n" terakhir, Anda menentukan SHA
poorva
334

Jika Anda telah melakukan sampah tetapi tidak mendorong,

git reset --soft HEAD~1

KEPALA ~ 1 adalah singkatan untuk komit sebelum kepala. Atau Anda dapat merujuk ke SHA-1 dari hash jika Anda ingin mengatur ulang. Opsi --soft akan menghapus komit tetapi akan meninggalkan semua file Anda yang diubah "Perubahan untuk dikomit", seperti yang dikatakan status git.

Jika Anda ingin menyingkirkan perubahan apa pun untuk melacak file di pohon kerja sejak komit sebelum kepala gunakan " --hard " sebagai gantinya.

ATAU

Jika Anda sudah mendorong dan seseorang menarik yang biasanya kasus saya, Anda tidak dapat menggunakan git reset . Namun Anda dapat melakukan git revert ,

git revert HEAD

Ini akan membuat komit baru yang membalikkan semua yang diperkenalkan oleh komit tidak disengaja.

santos_mgr
sumber
Saya dalam kasus ke-2, tetapi ketika saya melakukan "git revert HEAD" ia mengatakan "error: Commit [ID] adalah penggabungan tetapi opsi no -m diberikan. Fatal: revert gagal". Ada saran?
metaforge
2
Mungkin perlu disebutkan bahwa alih-alih HEAD~1Anda bisa menggunakan hash yang sebenarnya seperti yang ditampilkan oleh git log --statatau oleh git reflog- berguna ketika Anda perlu 'membatalkan' lebih dari satu komit.
ccpizza
284

Pada SourceTree (GUI untuk GitHub), Anda dapat mengklik kanan komit dan melakukan 'Komit Balik'. Ini harus membatalkan perubahan Anda.

Di terminal:

Anda dapat menggunakan:

git revert

Atau:

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 your changes.
Varun Parakh
sumber
263

Satu perintah:

git reset --soft 'HEAD^' 

Sangat bagus untuk membatalkan komit lokal terakhir!

Manish Shrivastava
sumber
11
Saya perlu menulis git reset --soft "HEAD ^" dengan tanda kutip ganda, karena saya menulisnya dari command prompt Windows.
Ena
253

Setel ulang dengan melakukan perintah di bawah ini menggunakan git:

git reset --soft HEAD~1

Jelaskan: apa yang git resetdilakukan, itu pada dasarnya resetuntuk komit yang ingin Anda kembalikan, maka jika Anda menggabungkannya dengan --softkunci, itu akan kembali, tetapi simpan perubahan dalam file Anda, sehingga Anda kembali ke panggung dimana file baru saja ditambahkan, HEADadalah kepala cabang dan jika Anda gabungkan dengan ~1(dalam hal ini Anda juga menggunakan HEAD^), itu akan kembali hanya satu komit yang Anda inginkan ...

Saya membuat langkah-langkah pada gambar di bawah ini secara lebih rinci untuk Anda, termasuk semua langkah yang mungkin terjadi dalam situasi nyata dan melakukan kode:

Bagaimana cara membatalkan commit terakhir di Git?

Alireza
sumber
239

Bagaimana cara membatalkan komit Git terakhir?

Untuk mengembalikan semuanya ke cara sebelum komit terakhir, kita perlu mengatur ulang ke komit sebelum HEAD.

  1. Jika Anda tidak ingin menyimpan perubahan yang Anda buat:

    git reset --hard HEAD^
    
  2. Jika Anda ingin menyimpan perubahan Anda:

    git reset --soft HEAD^
    

Sekarang periksa git log Anda. Ini akan menunjukkan bahwa komit terakhir kami telah dihapus.

Ranjithkumar Ravi
sumber
193

"Setel ulang pohon kerja ke komit terakhir"

git reset --hard HEAD^ 

"Bersihkan file yang tidak dikenal dari pohon yang bekerja"

git clean    

lihat - Referensi Cepat Git

CATATAN: Perintah ini akan menghapus komit Anda sebelumnya, jadi gunakan dengan hati-hati! git reset --hardlebih aman.

Ravi_Parmar
sumber
190

Gunakan reflog untuk menemukan keadaan yang benar

git reflog

reflog sebelumnya REFLOG SEBELUM RESET

Pilih reflog yang benar (f3cb6e2 dalam kasus saya) dan ketik

git reset --hard f3cb6e2

Setelah itu repo HEAD akan diatur ulang ke HEADid atur ulang efek LOG SETELAH RESET

Akhirnya reflog terlihat seperti gambar di bawah ini

reflog setelah FINAL REFLOG

Shubham Chaudhary
sumber
164

Lari pertama:

git reflog

Ini akan menunjukkan kepada Anda semua tindakan yang mungkin telah Anda lakukan di repositori Anda, misalnya, melakukan, menggabungkan, menarik, dll.

Lalu lakukan:

git reset --hard ActionIdFromRefLog
U. Ali
sumber
155

Batalkan komit terakhir:

git reset --soft HEAD^ atau git reset --soft HEAD~

Ini akan membatalkan komit terakhir.

Di sini --softberarti mengatur ulang ke pementasan.

HEAD~atau HEAD^sarana untuk pindah ke komit sebelum KEPALA.


Ganti komit terakhir ke komit baru:

git commit --amend -m "message"

Ini akan menggantikan komit terakhir dengan komit baru.

akshay_rahar
sumber
153

Cara lain:

Periksa cabang yang ingin Anda kembalikan, lalu setel ulang copy pekerjaan lokal Anda kembali ke komit yang Anda inginkan menjadi yang terbaru pada server jarak jauh (semuanya setelah itu akan pergi bye-bye). Untuk melakukan ini, di SourceTree I klik kanan pada dan pilih "Reset BRANCHNAME ke komit ini".

Kemudian navigasikan ke direktori lokal repositori Anda dan jalankan perintah ini:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Ini akan menghapus semua komit setelah yang sekarang di repositori lokal Anda tetapi hanya untuk satu cabang itu.

CommaToast
sumber
144

Ketik git logdan temukan kode hash komit terakhir dan kemudian masukkan:

git reset <the previous co>
Peter Mortensen
sumber
139

Dalam kasus saya, saya secara tidak sengaja melakukan beberapa file yang tidak saya inginkan. Jadi saya melakukan yang berikut dan berhasil:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

Verifikasi hasilnya dengan gitk atau git log --stat

egridasov
sumber
133

Sederhana, jalankan ini di baris perintah Anda:

git reset --soft HEAD~ 
karena
sumber
126

Ada banyak cara untuk melakukannya:

Perintah Git untuk membatalkan komit terakhir / komit sebelumnya:

Peringatan: Jangan gunakan --barang jika Anda tidak tahu apa yang Anda lakukan. --hard terlalu berbahaya , dan mungkin menghapus file Anda.

Perintah dasar untuk mengembalikan komit di Git adalah:

$ git reset --hard <COMMIT -ID>

atau

$ git reset --hard HEAD~<n>

COMMIT-ID : ID untuk komit

n: adalah jumlah komit terakhir yang ingin Anda kembalikan

Anda bisa mendapatkan id komit seperti yang ditunjukkan di bawah ini:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

di mana d81d3f1 dan be20eb8 adalah id komit.

Sekarang mari kita lihat beberapa kasus:

Misalkan Anda ingin mengembalikan komit terakhir 'd81d3f1'. Berikut ini dua opsi:

$ git reset --hard d81d3f1

atau

$ git reset --hard HEAD~1

Misalkan Anda ingin mengembalikan komit 'be20eb8':

$ git reset --hard be20eb8

Untuk informasi lebih rinci, Anda dapat merujuk dan mencoba beberapa perintah lain juga untuk mengatur ulang kepala ke kondisi tertentu:

$ git reset --help
pengguna3799762
sumber
5
git reset --hard HEAD~1adalah terlalu berbahaya ! Ini tidak hanya akan 'membatalkan komit terakhir', tetapi akan mengembalikan repo sepenuhnya kembali ke komit sebelumnya. Jadi, Anda akan KOSONG semua perubahan yang dilakukan di komit terakhir!
Arnis Juraga
Anda benar, untuk membatalkan ini Anda dapat menggunakangit push -f <remote> HEAD@{1}:<branch>
Benny
Sayangnya, saya menggunakan --hard, dan file saya dihapus! Saya tidak memeriksa komentar terlebih dahulu karena itu runtuh. Jangan gunakan --hard jika Anda tidak tahu apa yang Anda lakukan!
Anonim
125

Untuk komit lokal

git reset --soft HEAD~1

atau jika Anda tidak ingat persis di mana komit itu, Anda dapat menggunakan

git rm --cached <file>

Untuk komit yang didorong

Cara yang tepat untuk menghapus file dari riwayat repositori adalah menggunakan git filter-branch. Itu adalah,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Tapi saya sarankan Anda menggunakan perintah ini dengan hati-hati. Baca lebih lanjut di git-filter-branch (1) Halaman Manual .

geoom
sumber
125

Ada dua skenario utama

Anda belum mendorong komit

Jika masalahnya adalah file tambahan yang Anda komit (dan Anda tidak ingin itu di repositori), Anda dapat menghapusnya menggunakan git rmdan kemudian melakukan dengan--amend

git rm <pathToFile>

Anda juga dapat menghapus seluruh direktori dengan -r, atau bahkan menggabungkan dengan perintah Bash lainnya

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

Setelah menghapus file, Anda dapat melakukan, dengan opsi --amend

git commit --amend -C HEAD # the -C option is to use the same commit message

Ini akan menulis ulang komit lokal Anda baru-baru ini menghapus file-file tambahan, jadi, file-file ini tidak akan pernah dikirim saat ditekan dan juga akan dihapus dari repositori .git lokal Anda oleh GC.

Anda sudah mendorong komit

Anda bisa menerapkan solusi yang sama dari skenario lain dan kemudian melakukannya git pushdengan -fopsi, tetapi tidak disarankan karena menimpa sejarah jarak jauh dengan perubahan yang berbeda (dapat mengacaukan repositori Anda).

Sebagai gantinya, Anda harus melakukan komit tanpa --amend(ingat ini tentang -amend`: Opsi itu menulis ulang sejarah pada komit terakhir).

dseminara
sumber
125

Untuk mengatur ulang ke revisi sebelumnya, hapus semua perubahan yang tidak dikomit secara permanen:

git reset --hard HEAD~1
thestar
sumber
23
Mungkin Anda bisa dengan catatan / peringatan bahwa perintahnya akan membuang komit dan perubahan dalam direktori kerja tanpa bertanya lebih lanjut.
cr7pt0gr4ph7
6
Namun, jika Anda melakukan ini secara tidak sengaja, tidak semua hilang. Lihat stackoverflow.com/questions/10099258/… , stackoverflow.com/questions/15479501/… dan stackoverflow.com/questions/7374069/undo-git-reset-hard/7376959 .
cr7pt0gr4ph7
13
Gunakan --softuntuk menyimpan perubahan Anda sebagai uncommitted changes, --harduntuk menghapus komit sepenuhnya dan mengembalikannya satu per satu. Ingatlah untuk melakukan operasi seperti itu hanya pada perubahan, yang belum didorong.
Yunus Nedim Mehel 9'15
@Zaz: Anda benar; mungkin saya harus menjelaskan itu. Hanya file / perubahan yang telah ditambahkan ke indeks (/ dipentaskan) atau telah dilakukan yang dapat dipulihkan. Uncommitted, perubahan tidak bertahap yang , seperti yang Anda katakan, benar-benar dibuang oleh git reset --hard.
cr7pt0gr4ph7
1
Sebagai sidenote: Setiap kali file dipentaskan, gitmenyimpan kontennya di basis data objeknya. Konten yang disimpan hanya dihapus ketika pengumpulan sampah dilakukan. Oleh karena itu dimungkinkan untuk memulihkan versi file yang dipentaskan terakhir yang saat ini tidak dipentaskan ketika git reset --harddieksekusi (lihat posting yang ditautkan di atas untuk informasi lebih lanjut).
cr7pt0gr4ph7