Bagaimana saya bisa membatalkan `git commit` secara lokal dan pada remote setelah` git push`

242

Saya telah melakukan git commitdiikuti oleh a git push. Bagaimana saya bisa mengembalikan perubahan itu di repositori lokal dan jarak jauh?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael [email protected]>
Date:   Tue Jun 11 12:24:23 2011 -0700
michael
sumber

Jawaban:

400
git reset --hard HEAD~1
git push -f <remote> <branch>

(Contoh mendorong: git push -f origin bugfix/bug123)

Ini akan membatalkan komit terakhir dan mendorong riwayat yang diperbarui ke remote. Anda harus lulus -fkarena Anda mengganti riwayat upstream di remote.

Alexander Groß
sumber
24
Atau, gunakan git reset --hard <the-sha-you-want-to-return-to>.
Alexander Groß
2
Referensi ini disebut HEAD (case sensitive)
dunni
26
Juga, berhati-hatilah - AFAIK Anda tidak boleh melakukan ini jika orang lain telah menarik dari repo.
Amadan
1
@BipinVayalu Ini memengaruhi cabang Anda saat ini. Lebih tepatnya, KEPALA. KEPALA paling sering "dilampirkan" ke cabang (menunjuk ke nama cabang alih-alih langsung menunjuk ke komit). Jadi, secara umum, itu akan mempengaruhi poin KEPALA cabang. Gunakan git log --decorate --onelineuntuk mencari tahu ke mana KEPALA Anda menunjuk.
Alexander Groß
4
git reset HEAD~1jika Anda tidak ingin perubahan Anda hilang (perubahan tidak bertahap). Ubah, komit, dan tekan lagigit push -f [origin] [branch]
softvar
161

Secara umum, buat komit "terbalik", menggunakan:

git revert 364705c

kemudian kirimkan ke remote seperti biasa:

git push

Ini tidak akan menghapus komit: itu membuat komit tambahan yang membatalkan apa pun komit pertama lakukan. Ada lagi, tidak benar-benar aman, terutama ketika perubahan sudah disebarkan.

Amadan
sumber
9
Ini adalah jawaban yang lebih aman (jadi mungkin lebih baik) daripada jawaban Alexander Groß (jawaban yang dipilih).
Graeck
6
@ Geeck Setiap solusi memiliki implikasi dan kelebihan.
Alexander Groß
5
Ini harus menjadi jawaban yang diterima, itu praktik terbaik untuk tidak pernah menimpa sejarah, bahkan lebih jika berkolaborasi dengan tim. git resethanya diterima jika Anda masih belum mendorong perubahan ke server.
Josue Alexander Ibarra
17
@JosueIbarra Saya tidak setuju untuk semua kasus. Untuk sebagian besar kasus, ya, Anda tidak boleh menimpa riwayat. Namun, saya percaya bahwa ada kasus yang sah di mana Anda harus melakukannya. Misalnya, Anda secara tidak sengaja melakukan dan membuka file rahasia Anda. Itu tidak seharusnya di git repo. Jadi Anda dapat dengan cepat menghapusnya menggunakan jawaban yang diterima di sini.
bfcoder
11
@ bfcoder jika Anda mendorong "rahasia" ke repo jarak jauh, itu bukan lagi rahasia. Dan perbaikan yang tepat adalah membuat rahasia baru, bukan mencoba menyembunyikan kesalahan Anda.
erbsman
41

Pertama-tama, Santai.

"Tidak ada yang di bawah kendali kami. Kontrol kami hanyalah ilusi.", "Untuk berbuat salah adalah manusia"

Saya mendapatkan bahwa Anda secara tidak sengaja mendorong kode Anda remote-master. INI akan baik-baik saja.

1. Pada awalnya, dapatkan SHA-1nilai dari komit yang ingin Anda kembalikan, mis. Komit ke cabang utama. jalankan ini:

git log

Anda akan melihat banyak 'f650a9e398ad9ca606b25513bd4af9fe ...' seperti string bersama dengan masing-masing komit. salin nomor itu dari komit yang ingin Anda kembalikan .

2. Sekarang, ketikkan perintah di bawah ini:

git reset --hard your_that_copied_string_but_without_quote_mark

Anda akan melihat pesan seperti "KEPALA sekarang di". Anda jelas. Apa yang baru saja dilakukan adalah untuk mencerminkan perubahan itu secara lokal.

3. Sekarang, ketikkan perintah di bawah ini:

git push -f

Anda akan melihat seperti

"peringatan: push.default tidak disetel; nilai implisitnya telah berubah ..... ..... Total 0 (delta 0), digunakan kembali 0 (delta 0) ... ... your_branch_name -> master (pembaruan paksa) . "

Sekarang, Anda semua jelas. Periksa master dengan "git log" lagi, fixed_destination_commit Anda harus di atas daftar.

Anda dipersilakan (sebelumnya;))

MEMPERBARUI:

Sekarang, perubahan yang telah Anda buat sebelum semua ini dimulai, sekarang hilang. Jika Anda ingin mengembalikan kerja keras itu lagi, itu mungkin. Berkat git reflog , dan git perintah ceri-pilih .

Untuk itu, saya sarankan untuk mengikuti blog ini atau posting ini .

kmonsoor
sumber
itu adalah ukuran yang baik untuk menentukan remote dan cabang juga ketika melakukan "git push -f", tetapi "git push -f" akan tetap bekerja sebagian besar waktu
Robson
8

git reset HEAD~1jika Anda tidak ingin perubahan Anda hilang (perubahan tidak bertahap). Ubah, komit, dan dorong lagigit push -f [origin] [branch]

softvar
sumber
3

Anda dapat melakukan rebase interaktif:

git rebase -i <commit>

Ini akan memunculkan editor default Anda. Hapus saja baris berisi komit yang ingin Anda hapus untuk menghapus komit itu.

Anda tentu saja akan memerlukan akses ke repositori jarak jauh untuk menerapkan perubahan ini di sana juga.

Lihat pertanyaan ini: Git: menghapus commit yang dipilih dari repositori

Jack Edmonds
sumber
3

Coba gunakan

git reset --hard <commit id> 

Harap Dicatat: Di sini id komit akan id komit yang ingin Anda tuju tetapi bukan id yang ingin Anda atur ulang. ini adalah satu-satunya titik di mana saya juga terjebak.

lalu dorong

git push -f <remote> <branch>
Mohit Dhawan
sumber
2

Kalau tidak:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

Paksa cabang master dari repositori jauh asal ke induk dari komit terakhir

MicRum
sumber