Inilah yang saya lakukan di cabang yang seharusnya stabil ...
% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
refs/
refs/heads/
refs/tags/
refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
from cc4b63bebb6e6dd04407f8788938244b78c50285
to 83c9191dea88d146400853af5eb7555f252001b0
done
'refs/heads/unstable': up-to-date
Updating remote server info
Itu semua salah seperti yang saya sadari kemudian. Saya ingin membatalkan seluruh proses ini, dan mengembalikan cabang alpha-0.3.0 kembali seperti semula.
Apa yang harus saya lakukan?
Jawaban:
Anda perlu memastikan bahwa tidak ada pengguna lain dari repositori ini yang mengambil perubahan yang salah atau mencoba membangun di atas komit yang ingin Anda hapus karena Anda akan memundurkan riwayat.
Maka Anda perlu 'memaksa' mendorong referensi lama.
atau dalam kasus Anda
Anda mungkin telah
receive.denyNonFastForwards
mengatur repositori jarak jauh. Jika ini masalahnya, maka Anda akan mendapatkan kesalahan yang menyertakan frasa[remote rejected]
.Dalam skenario ini, Anda harus menghapus dan membuat ulang cabang.
Jika ini tidak berhasil - mungkin karena Anda telah
receive.denyDeletes
menetapkan, maka Anda harus memiliki akses langsung ke repositori. Di repositori jarak jauh, Anda harus melakukan sesuatu seperti perintah plumbing berikut.sumber
git push -f origin last_known_good_commit:branch_name
Saya percaya Anda juga bisa melakukan ini:
Ini sangat mirip dengan metode terakhir, kecuali Anda tidak perlu muck sekitar di repo jarak jauh.
sumber
--hard
parameter " " harus menjadi ID dari komit apa pun yang Anda ingin atur ulang cabang Anda.git reset --hard [commit_id]
sehingga kami tidak mengacaukan kontinum ruang-waktu.+
memaksa push untuk dilakukan, mirip dengan-f
(tetapi sedikit berbeda: stackoverflow.com/a/25937833/1757149 ). Tanpa itu, jika Anda mencobagit push origin alpha-0.3.0
push akan gagal:Updates were rejected because the tip of your current branch is behind
.git revert
kurang berbahaya daripada beberapa pendekatan yang disarankan di sini:Ganti 35f6af6f77f116ef922e3d75bc80a4a466f92650 dengan komit Anda sendiri.
sumber
Solusi yang diterima (dari @charles bailey) sangat berbahaya jika Anda bekerja dalam repo bersama.
Sebagai praktik terbaik, semua komitmen yang didorong ke repo jarak jauh yang dibagikan harus dianggap 'tidak berubah'. Gunakan 'git revert' sebagai gantinya: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes
https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things
sumber
Cara untuk melakukannya tanpa kehilangan perubahan yang Anda inginkan:
Kemudian Anda dapat memilih file yang ingin Anda dorong
sumber
Cara lain untuk melakukan ini:
git push origin --delete <branch_name>
)sumber
Ini akan mengembalikan repo Anda ke nomor komit yang disebutkan
sumber
Undo multiple commit git reset --hard 0ad5a7a6 (Hanya berikan komit hash SHA1)
Batalkan komit terakhir
git reset --hard HEAD ~ 1 (perubahan komit terakhir akan dihapus) git reset --soft HEAD ~ 1 (perubahan komit terakhir akan tersedia sebagai modifikasi lokal tanpa komitmen)
sumber
Skenario 1 : Jika Anda ingin membatalkan komit terakhir katakan 8123b7e04b3, di bawah ini adalah perintah (ini bekerja untuk saya):
Output terlihat seperti di bawah ini:
Info tambahan: Skenario 2 : Dalam beberapa situasi, Anda mungkin ingin mengembalikan apa yang baru saja Anda undo'ed (pada dasarnya membatalkan undo) melalui perintah sebelumnya, lalu gunakan perintah di bawah ini:
Keluaran:
Info lebih lanjut di sini: https://github.com/blog/2019-how-to-undo-almost-anything-with-git
sumber
Jawaban yang ada baik dan benar, namun bagaimana jika Anda harus membatalkan
push
tetapi:Gunakan perintah ini untuk mengembalikan perubahan ke ref:
sumber
Jika Anda ingin mengabaikan komit terakhir yang baru saja Anda tekan di cabang jarak jauh: ini tidak akan menghapus komit tetapi mengabaikannya dengan menggerakkan pointer git ke komit sebelumnya, dirujuk oleh HEAD ^ atau HEAD ^ 1
Tetapi jika Anda sudah mendorong komit ini, dan yang lain telah menarik cabang. Dalam hal ini, menulis ulang riwayat cabang Anda tidak diinginkan dan Anda sebaiknya mengembalikan komit ini:
sumber