Saya tidak sengaja melakukan file yang salah ke Git , tapi saya belum mendorong komit ke server.
Bagaimana saya bisa membatalkan komit dari repositori lokal?
git
version-control
git-commit
undo
pre-commit
Peter Mortensen
sumber
sumber
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 menjalankangit
perintah apa pun . Ini akan memengaruhi kinerja, jadi yang terbaik adalah menambahkan tanda konfigurasi apakah akan mengaktifkannya.alias
fitur Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliasesgit reflog
sudah 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)?Jawaban:
Batalkan komit dan ulang
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 menggunakannyagit reset --soft HEAD~
sebagai gantinya, yaitu sepertigit reset HEAD~
2 tetapi membiarkan perubahan yang ada dipentaskan.git add
apa pun yang ingin Anda sertakan dalam komit baru Anda.reset
menyalin kepala lama ke.git/ORIG_HEAD
;commit
dengan-c ORIG_HEAD
akan membuka editor, yang awalnya berisi pesan log dari komit lama dan memungkinkan Anda untuk mengeditnya. Jika Anda tidak perlu mengedit pesan, Anda bisa menggunakan-C
opsi.Berhati-hatilah, jika Anda telah menambahkan perubahan baru ke indeks, menggunakan
commit --amend
akan menambahkannya ke komit Anda sebelumnya.Jika kode sudah didorong ke server Anda dan Anda memiliki izin untuk menimpa riwayat (rebase), maka:
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 kemudiangit commit --amend
, yang akan membuka editor pesan komit default Anda yang sudah diisi sebelumnya dengan pesan komit terakhir.2
HEAD~
sama denganHEAD~1
. Juga, lihat Apa KEPALA di git? . Akan sangat membantu jika Anda ingin menghentikan beberapa komitmen.sumber
git checkout theRightBranch
dengan semua tahapan perubahan. Seperti yang harus saya lakukan.git reset --soft HEAD^
Anda tidak perlu menggunakannyagit reset --soft HEAD~1
. ^ Adalah karakter lanjutan dalam DOS sehingga tidak akan berfungsi dengan baik. Juga,--soft
adalah default, sehingga Anda dapat menghilangkannya jika Anda suka dan hanya mengatakangit reset HEAD~1
.zsh: no matches found: HEAD^
- Anda harus melarikan diri ^ iegit reset --soft HEAD\^
git commit -a
dikeluarkan ketika-a
seharusnya ditinggalkan. Dalam hal ini, lebih baik jangan tinggalkan--soft
(yang akan menghasilkan--mixed
default) dan kemudian Anda dapat mengembalikan perubahan yang ingin Anda komit.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>…]
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.
Anda ingin nuke melakukan C dan tidak pernah melihatnya lagi dan kehilangan semua perubahan dalam file yang dimodifikasi secara lokal . Anda melakukan ini:
Hasilnya adalah:
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:
Anda dapat melakukan ini, meninggalkan
--hard
:Dalam hal ini hasilnya adalah:
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 sekaranggit status
tunjukkan 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 :
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 melakukannyagit commit
dan 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 reflog
dan Anda akan melihat daftar koma (parsial) shas (yaitu, hash) yang telah Anda gunakan. Cari komit yang Anda hancurkan, dan lakukan ini: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.
sumber
git reset --hard~1
akan mengarahkan cabang master ke komit terakhir di dalam cabang fitur. Dalam hal ini ID komit khusus harus digunakan alih-alih perintah relatif.--hard
tetapi 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 postingreflog
tetapi ini tidak mengembalikan perubahan yang sebelumnya tidak dipentaskan.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.
Untuk mengembalikan semuanya kembali seperti semula sebelum komit terakhir, kita perlu ke
reset
komit sebelumnyaHEAD
:Sekarang
git log
akan 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).
Perubahan Anda sekarang akan dikembalikan dan siap untuk Anda komit:
Untuk informasi lebih lanjut, lihat Git Basics - Undoing Things .
sumber
git revert HEAD^
bukan yang sebelumnya, adalah yang sebelumnya dari yang sebelumnya. Saya lakukan:git revert HEAD
dan kemudian mendorong lagi dan itu berhasil :)Tambah / hapus file untuk mendapatkan hal-hal seperti yang Anda inginkan:
Kemudian ubah komit:
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.
sumber
git rm --cached
untuk menyimpan file dalam sistem file dan hanya menghapusnya dari indeks git!atau
Peringatan: Perintah di atas akan secara permanen menghapus modifikasi pada
.java
file (dan file lain) yang ingin Anda komit.The
hard reset
untukHEAD-1
akan mengatur copy pekerjaan Anda ke negara dari komit sebelum salah Anda komit.sumber
git commit -a -m ""
ataugit commit -am ""
secara alami! :]git stash
, lalugit stash pop
Untuk mengubah komit terakhir
Ganti file dalam indeks:
Kemudian, jika itu adalah cabang pribadi, ubah komit:
Atau, jika itu cabang bersama, buat komit baru:
( Untuk mengubah komit sebelumnya , gunakan rebase interaktif yang mengagumkan .)
ProTip ™: Tambahkan
*.class
ke 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:
Di mana
N
jumlah komit sebelumnyaHEAD
, dan@~
reset ke komit sebelumnya.Jadi, alih-alih mengubah komit, Anda dapat menggunakan:
Lihat
git help reset
, khususnya bagian--soft
--mixed
dan--hard
, untuk pemahaman yang lebih baik tentang apa yang dilakukannya.Reflog
Jika Anda berantakan, Anda selalu dapat menggunakan reflog untuk menemukan komitmen yang dijatuhkan:
sumber
git revert
adalah perintah terpisah - yang pada dasarnya 'me-reset' satu komisi.Gunakan
git revert <commit-id>
.Untuk mendapatkan ID komit, cukup gunakan
git log
.sumber
git revert commit-id
bekerja seperti pesona. Tentu saja Anda harus mendorong perubahan Anda.git cherry-pick <<erroneous-commit-sha>>
@astronomerdave. Dari, Tn. Hampir-2-Tahun-Terlambat-ke-Partai.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.
(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.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
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
sumber
Jika Anda menginstal Git Extras , Anda dapat menjalankan
git undo
untuk membatalkan komit terbaru.git undo 3
akan membatalkan tiga komitmen terakhir.sumber
Saya ingin membatalkan lima komitmen terakhir di repositori bersama kami. Saya mencari id revisi yang ingin saya kembalikan. Lalu saya mengetik berikut ini.
sumber
Saya lebih suka menggunakan
git rebase -i
untuk 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)
Daftar sampel
Kemudian Git akan menghapus komit untuk setiap baris yang Anda hapus.
sumber
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
gitk
ataugit 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, gunakangit reset HEAD~1
.Kata peringatan : Penggunaan sembrono
git reset
adalah 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 ...
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.
Bersihkan cabang Anda secara lokal lalu ...
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.
sumber
gitk --all $(git reflog | cut -c1-7)&
mungkin membantu untuk menemukan revisi sebelumnya jika Anda ingin membatalkan komit '- ubah'.git reset
git push origin (branch_name) --force
Jika Anda ingin membatalkannya secara permanen dan Anda telah mengkloning beberapa repositori
ID komit dapat dilihat oleh
Maka Anda bisa melakukan -
sumber
git reset --hard
, tetapi jika Anda harus menghapus dengan keras komitmen "n" terakhir, Anda menentukan SHAJika Anda telah melakukan sampah tetapi tidak mendorong,
ATAU
sumber
HEAD~1
Anda bisa menggunakan hash yang sebenarnya seperti yang ditampilkan olehgit log --stat
atau olehgit reflog
- berguna ketika Anda perlu 'membatalkan' lebih dari satu komit.Pada SourceTree (GUI untuk GitHub), Anda dapat mengklik kanan komit dan melakukan 'Komit Balik'. Ini harus membatalkan perubahan Anda.
Di terminal:
Anda dapat menggunakan:
Atau:
sumber
Satu perintah:
Sangat bagus untuk membatalkan komit lokal terakhir!
sumber
Setel ulang dengan melakukan perintah di bawah ini menggunakan
git
:Jelaskan: apa yang
git reset
dilakukan, itu pada dasarnyareset
untuk komit yang ingin Anda kembalikan, maka jika Anda menggabungkannya dengan--soft
kunci, itu akan kembali, tetapi simpan perubahan dalam file Anda, sehingga Anda kembali ke panggung dimana file baru saja ditambahkan,HEAD
adalah kepala cabang dan jika Anda gabungkan dengan~1
(dalam hal ini Anda juga menggunakanHEAD^
), 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:
sumber
Bagaimana cara membatalkan komit Git terakhir?
Untuk mengembalikan semuanya ke cara sebelum komit terakhir, kita perlu mengatur ulang ke komit sebelum HEAD.
Jika Anda tidak ingin menyimpan perubahan yang Anda buat:
Jika Anda ingin menyimpan perubahan Anda:
Sekarang periksa git log Anda. Ini akan menunjukkan bahwa komit terakhir kami telah dihapus.
sumber
"Setel ulang pohon kerja ke komit terakhir"
"Bersihkan file yang tidak dikenal dari pohon yang bekerja"
lihat - Referensi Cepat Git
CATATAN: Perintah ini akan menghapus komit Anda sebelumnya, jadi gunakan dengan hati-hati!
git reset --hard
lebih aman.sumber
Gunakan reflog untuk menemukan keadaan yang benar
REFLOG SEBELUM RESET
Pilih reflog yang benar (f3cb6e2 dalam kasus saya) dan ketik
Setelah itu repo HEAD akan diatur ulang ke HEADid LOG SETELAH RESET
Akhirnya reflog terlihat seperti gambar di bawah ini
FINAL REFLOG
sumber
Lari pertama:
Ini akan menunjukkan kepada Anda semua tindakan yang mungkin telah Anda lakukan di repositori Anda, misalnya, melakukan, menggabungkan, menarik, dll.
Lalu lakukan:
sumber
Batalkan komit terakhir:
git reset --soft HEAD^
ataugit reset --soft HEAD~
Ini akan membatalkan komit terakhir.
Di sini
--soft
berarti mengatur ulang ke pementasan.HEAD~
atauHEAD^
sarana untuk pindah ke komit sebelum KEPALA.Ganti komit terakhir ke komit baru:
Ini akan menggantikan komit terakhir dengan komit baru.
sumber
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:
Ini akan menghapus semua komit setelah yang sekarang di repositori lokal Anda tetapi hanya untuk satu cabang itu.
sumber
Ketik
git log
dan temukan kode hash komit terakhir dan kemudian masukkan:sumber
Dalam kasus saya, saya secara tidak sengaja melakukan beberapa file yang tidak saya inginkan. Jadi saya melakukan yang berikut dan berhasil:
Verifikasi hasilnya dengan gitk atau git log --stat
sumber
Sederhana, jalankan ini di baris perintah Anda:
sumber
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:
atau
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:
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:
atau
Misalkan Anda ingin mengembalikan komit 'be20eb8':
Untuk informasi lebih rinci, Anda dapat merujuk dan mencoba beberapa perintah lain juga untuk mengatur ulang kepala ke kondisi tertentu:
sumber
git reset --hard HEAD~1
adalah 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!git push -f <remote> HEAD@{1}:<branch>
Untuk komit lokal
atau jika Anda tidak ingat persis di mana komit itu, Anda dapat menggunakan
Untuk komit yang didorong
Cara yang tepat untuk menghapus file dari riwayat repositori adalah menggunakan
git filter-branch
. Itu adalah,Tapi saya sarankan Anda menggunakan perintah ini dengan hati-hati. Baca lebih lanjut di git-filter-branch (1) Halaman Manual .
sumber
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 rm
dan kemudian melakukan dengan--amend
Anda juga dapat menghapus seluruh direktori dengan
-r
, atau bahkan menggabungkan dengan perintah Bash lainnyaSetelah menghapus file, Anda dapat melakukan, dengan opsi --amend
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 push
dengan-f
opsi, 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).sumber
Untuk mengatur ulang ke revisi sebelumnya, hapus semua perubahan yang tidak dikomit secara permanen:
sumber
--soft
untuk menyimpan perubahan Anda sebagaiuncommitted changes
,--hard
untuk menghapus komit sepenuhnya dan mengembalikannya satu per satu. Ingatlah untuk melakukan operasi seperti itu hanya pada perubahan, yang belum didorong.git reset --hard
.git
menyimpan 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 ketikagit reset --hard
dieksekusi (lihat posting yang ditautkan di atas untuk informasi lebih lanjut).