Saya ingin tahu cara menghapus komit.
Oleh delete
, maksud saya seolah-olah saya tidak membuat komit, dan ketika saya melakukan push di masa depan, perubahan saya tidak akan mendorong ke cabang terpencil.
Saya membaca git help, dan saya pikir perintah yang harus saya gunakan adalah git reset --hard HEAD
. Apakah ini benar?
git
git-rebase
git-reset
hap497
sumber
sumber
cherry-pick
dandelete
satu komit yang mungkin terjadi beberapa saat yang lalu.git rebase -i HEAD~10
memang menjawab pertanyaan, karena ia membiarkan Anda memilih komit untuk dihapus. Git menerapkan komit dalam rentang yang Anda tentukan satu-per-satu, mengabaikan komit yang telah Anda hapus dari log. Saya menggunakan perintah ini hari ini untuk menyingkirkan komit terbaru kedua dan ketiga pada repo saya sekaligus mempertahankan yang teratas. Saya setuju bahwa tidak ada jawaban lain yang memuaskan.Jawaban:
Hati-hati:
git reset --hard
AKAN HAPUS PERUBAHAN DIREKTORI KERJA ANDA . Pastikan untuk menyembunyikan perubahan lokal yang ingin Anda pertahankan sebelum menjalankan perintah ini.Dengan asumsi Anda sedang duduk di komit itu, maka perintah ini akan menghapusnya ...
Itu
HEAD~1
berarti komit sebelum kepala.Atau, Anda bisa melihat output dari
git log
, temukan id komit dari komit yang ingin Anda buat cadangannya, dan kemudian lakukan ini:Jika Anda sudah mendorongnya, Anda harus melakukan dorongan gaya untuk menyingkirkannya ...
Namun , jika orang lain mungkin telah menariknya, maka Anda akan lebih baik memulai cabang baru. Karena ketika mereka menarik, itu hanya akan menggabungkannya ke dalam pekerjaan mereka, dan Anda akan mendorongnya kembali.
Jika Anda sudah mendorong, mungkin lebih baik digunakan
git revert
, untuk membuat komit "gambar cermin" yang akan membatalkan perubahan. Namun, kedua komit akan berada di log.FYI -
git reset --hard HEAD
hebat jika Anda ingin menyingkirkan BEKERJA DI PROGRES. Ini akan mengatur ulang Anda kembali ke komit terbaru, dan menghapus semua perubahan di pohon dan indeks kerja Anda.Terakhir, jika Anda perlu mencari komit yang "dihapus", biasanya ada di
git reflog
kecuali Anda memiliki sampah mengumpulkan repositori Anda.sumber
HEAD~1
atau adilHEAD^
. Jika Anda mendorong, Anda harus menggunakannyagit revert
.HEAD~n
untuk "kembali"n
melakukan dari kepala Anda. Mungkin dari titik ini Anda dapat diartikan... --hard HEAD
juga sebagaiHEAD~0
=> menghapus pekerjaan yang sedang berjalan.reset --hard
, dan periksalog --oneline --all
, komit masih tetap di pohon. Bagaimana kita menghapus komit ini dari pohon? Terima kasih.reset --soft
untuk menghapus komit lokal TANPA mengembalikan pekerjaan yang sedang berlangsung!Jika Anda belum mendorong komit di mana saja, Anda dapat menggunakan
git rebase -i
untuk menghapus komit itu. Pertama, cari tahu seberapa jauh komitmen itu (kurang-lebih). Lalu lakukan:Cara
~N
rebaseN
komit terakhir (N
harus berupa angka, misalnyaHEAD~10
). Kemudian, Anda dapat mengedit file yang disajikan Git kepada Anda untuk menghapus komit yang menyinggung. Saat menyimpan file itu, Git kemudian akan menulis ulang semua komit berikut seolah-olah yang Anda hapus tidak ada.Buku Git memiliki bagian yang bagus tentang rebasing dengan gambar dan contoh.
Berhati-hatilah dengan ini, karena jika Anda mengubah sesuatu yang telah Anda dorong ke tempat lain, pendekatan lain akan diperlukan kecuali Anda berencana untuk melakukan push force.
sumber
push -f
untuk memaksa dan mengganti cabang jarak jauh dengan cabang lokal Anda. Jika itu hanya repo jarak jauh Anda sendiri, tidak masalah. Masalahnya dimulai jika ada orang lain yang mengambil sementara itu.git rebase -i HEAD~5
perintah itu persis apa yang saya butuhkan untuk menghapus ini komit dari repo lokal saya! Terima kasih!rebase -i
, perubahan yang terkait dengan komit yang dihapus tidak dipertahankan.Kemungkinan lain adalah salah satu perintah favorit pribadi saya:
Ini akan memulai rebase dalam mode interaktif
-i
di titik tepat sebelum komit yang ingin Anda hajar. Editor akan mulai mendaftar semua komitmen sejak saat itu. Hapus baris yang berisi komit yang ingin Anda hapus dan simpan file. Rebase akan melakukan sisa pekerjaan, hanya menghapus komit itu, dan memutar ulang semua yang lain kembali ke log.sumber
git rebase --continue
git rebase -i HEAD~1
git rebase -i HEAD~1
sangat membersihkan repo! Sulit untuk mengatakan dengan tepat apa yang dilakukannya, tetapi semuanya terlihat jauh lebih rapi. Sedikit mengkhawatirkan, sebenarnya.Saya menambahkan jawaban ini karena saya tidak melihat mengapa orang yang baru saja mencoba melakukan pekerjaan ingin menghapus semua pekerjaan itu karena beberapa kesalahan menggunakan Git!
Jika Anda ingin mempertahankan pekerjaan Anda dan 'membatalkan' perintah komit (Anda ketahuan sebelum mendorong untuk repo):
Jangan gunakan bendera --hard kecuali jika Anda ingin menghancurkan pekerjaan Anda yang sedang berlangsung sejak komit terakhir.
sumber
git reset --hard HEAD~1
komit terbaru Anda sebelumnya akan tersedia melalui reflog (sampai Anda kedaluwarsa); lihat juga di sini: gitready.com/intermediate/2009/02/09/...Menghapus seluruh komit
Ganti "SHA" dengan referensi yang ingin Anda singkirkan. "^" Dalam perintah itu literal.
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
sumber
-p, --preserve-merges
Buat kembali komit gabungan alih-alih meratakan sejarah dengan memutar ulang komit, komit gabungan bergabung. Menggabungkan resolusi konflik atau amandemen manual untuk menggabungkan komit tidak dipertahankan.Jika Anda tidak mempublikasikan perubahan, untuk menghapus komit terbaru, Anda dapat melakukannya
(perhatikan bahwa ini juga akan menghapus semua perubahan yang tidak dikomit; gunakan dengan hati-hati).
Jika Anda sudah mempublikasikan komit yang akan dihapus, gunakan git revert
sumber
tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
Katakanlah kita ingin menghapus komit 2 & 4 dari repo.
Catatan: Anda harus memiliki hak admin atas repo karena Anda menggunakan
--hard
dan-f
.git checkout b3d92c5
Periksa komit yang dapat digunakan terakhir.git checkout -b repair
Buat cabang baru untuk dikerjakan.git cherry-pick 77b9b82
Jalankan melalui komit 3.git cherry-pick 2c6a45b
Jalankan melalui komit 1.git checkout master
Master checkoutgit reset --hard b3d92c5
Atur ulang master ke komit yang dapat digunakan terakhir.git merge repair
Gabungkan cabang baru kami menjadi master.git push -f origin master
Dorong master ke repo jarak jauh.sumber
git push -f origin master
tidak ada pilihan--hard
commit 0
lebih tua daricommit 1
. Tolong bisakah Anda memberi tahu saya mengapa pertama kali dijalankancommit 3
(dengan pilihan ceri) dan kemudian olehcommit 1
? Setelah checkoutb3d92cd
(commit 0
) saya akan mengharapkan cherry-pickcommit 1
, kalau begitucommit 3
. Terima kasih.PS: CommitId merujuk yang ingin Anda kembalikan
sumber
Ubah Riwayat dengan paksa
Dengan asumsi Anda tidak hanya ingin menghapus komit terakhir, tetapi Anda ingin menghapus komit spesifik dari komit terakhir, lanjutkan dengan:
git rebase -i HEAD~<number of commits to go back>
, jadigit rebase -i HEAD~5
jika Anda ingin melihat lima commit terakhir.Kemudian dalam editor teks ubah kata
pick
menjadi didrop
sebelah setiap komit yang ingin Anda hapus. Simpan dan keluar dari editor. Voila!Ubah Riwayat secara positif
Coba
git revert <commit hash>
. Kembalikan akan membuat komit baru yang membatalkan komit yang ditentukan.sumber
drop
kata kunci tidak ditentukan. Untuk menghapus komit, cukup hapus seluruh baris.Jika Anda ingin memperbaiki komit terbaru Anda, Anda dapat membatalkan komit, dan menghapus stage file di dalamnya, dengan melakukan:
Ini akan mengembalikan repositori Anda ke kondisinya sebelum perintah git add yang mengatur file. Perubahan Anda akan ada di direktori kerja Anda. KEPALA ~ 1 merujuk pada komit di bawah ujung cabang saat ini.
Jika Anda ingin berhenti komit N, tetapi simpan perubahan kode di direktori kerja Anda:
Jika Anda ingin menyingkirkan komit terbaru Anda, dan tidak ingin menyimpan perubahan kode, Anda dapat melakukan reset "keras".
Demikian juga, jika Anda ingin membuang komit N terakhir, dan tidak ingin menyimpan perubahan kode:
sumber
Di sini '2' adalah jumlah komit yang ingin Anda rebase.
jika Anda ingin rebase semua komit.
Maka Anda akan dapat memilih salah satu dari opsi ini.
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
Garis-garis ini dapat dipesan ulang; mereka dieksekusi dari atas ke bawah. Jika Anda menghapus garis di sini, KOMIT YANG AKAN HILANG. Namun, jika Anda menghapus semuanya, rebase akan dibatalkan. Perhatikan bahwa komit kosong dikomentari
Anda cukup menghapus komit itu menggunakan opsi "d" atau Menghapus garis yang memiliki komit Anda.
sumber
Untuk menghapus di cabang lokal, gunakan
Untuk menghapus di cabang jauh, gunakan
sumber
[Jawaban cepat]
Anda memiliki banyak alternatif, misalnya:
Alternatif 1:
Alternatif 2:
Alternatif 3:
sumber
Sumber: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Hapus komit terakhir
Misalnya komit terakhir Anda
git push origin + aa61ab32 ^: master
Sekarang Anda ingin menghapus komit ini maka cara mudah untuk melakukan ini sebagai berikut
Langkah
Pertama, atur ulang cabang ke induk dari komit saat ini
Dorong paksa ke remote.
Untuk komit tertentu, Anda ingin mengatur ulang mengikuti
sumber
Berikut cara lain untuk melakukan ini:
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". Saya pikir baris perintah adalah:
Karena Anda baru saja memeriksa cabang dari jauh, Anda tidak akan memiliki perubahan lokal yang perlu dikhawatirkan akan hilang. Tapi ini akan kehilangan mereka jika kamu melakukannya.
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
Kesalahan:
Saya
git rebase -i --root
membuka cabang saya, dengan bodohnya berpikir saya dapat mengatur ulang komit pertama yang berbeda dari master ( tampilan default GitHub untuk Windows adalah perbandingan dengan master, menyembunyikan keseluruhannya).Saya menumbuhkan janggut Silicon Valley sementara 900+ komitmen memuat diri ke Sublime. Keluar tanpa perubahan, saya mengisi daya baterai saya kemudian mulai mencukur, karena semua 900+ individu melakukan rebondally - mengatur ulang waktu komit mereka untuk sekarang.
Bertekad untuk mengalahkan Git dan mempertahankan waktu semula, saya menghapus repositori lokal ini dan mengkloning ulang dari jarak jauh.
Sekarang itu telah menambahkan kembali komit yang tidak dibutuhkan terbaru untuk dikuasai yang ingin saya hapus, jadi lanjutkan seperti itu.
Opsi yang melelahkan:
Saya tidak ingin
git revert
- itu akan membuat komit tambahan, memberikan Git di atas angin.git reset --hard HEAD
tidak melakukan apa pun, setelah memeriksareflog
, yang terakhir dan satuHEAD
- satunya adalah klon - Git menang.Untuk mendapatkan SHA terbaru, saya memeriksa repositori jarak jauh di github.com - minor win.
Setelah berpikir
git reset --hard <SHA>
berhasil, saya memperbarui cabang lain untuk dikuasai dan 1 ... 2 ... poof! komit telah kembali - Git menang.Memeriksa kembali untuk menguasai, waktu untuk mencoba
git rebase -i <SHA>
, lalu menghapus garis ... tidak berhasil, sedih untuk mengatakan. " Jika Anda menghapus garis di sini, KOMIT YANG AKAN HILANG ". Ah ... dipoles fitur baru troll n00b di catatan rilis 2.8.3 .Solusinya:
git rebase -i <SHA>
kemudiand, drop = remove commit
.Untuk memverifikasi, saya memeriksa ke cabang lain, dan voila - tidak ada komit bersembunyi untuk mengambil / menarik dari master.
https://twitter.com/holman/status/706006896273063936
Hari baik untuk Anda.
sumber
Semua perintah di atas mengembalikan status pohon pekerjaan Anda dan indeks seperti sebelum membuat komit, tetapi jangan mengembalikan keadaan repositori. Jika Anda melihatnya, komit "dihapus" tidak benar-benar dihapus, itu bukan yang ada di ujung cabang saat ini.
Saya pikir tidak ada cara untuk menghapus komit dengan perintah porselen . Satu-satunya cara adalah menghapusnya dari log dan reflog dan kemudian menjalankan a
git prune --expire -now
.sumber
git prune
sebenarnya adalah salah satu dari perintah "porselen" . Selain itu, jarang Anda ingin membersihkan reflog Anda sepenuhnya (satu use case adalah menghapus info sensitif dari repo Anda, tetapi seperti saya katakan, itu case use yang jarang terjadi). Lebih sering daripada tidak, Anda perlu menyimpan komitmen lama di reflog, jika Anda perlu memulihkan data. Lihat Pro Git: 9,7 Git Internal - Pemeliharaan dan Pemulihan Data .Jika Anda ingin menyimpan riwayat, menunjukkan komit dan mengembalikan, Anda harus menggunakan:
masukkan pesan yang menjelaskan mengapa Anda kembali dan kemudian:
Ketika Anda mengeluarkan
git log
Anda akan melihat kedua "salah" melakukan dan mengembalikan pesan log.sumber
Jika Anda baru saja mengacaukan komit terakhir Anda (pesan salah, lupa menambahkan beberapa perubahan) dan ingin memperbaikinya sebelum mendorongnya ke repo publik mengapa tidak digunakan:
Jika Anda baru saja melakukan perubahan, mereka akan digabungkan dengan komit terakhir (yang sedang Anda coba singkirkan) dan akan menggantikan komit itu.
Tentu saja jika Anda mengubah komit setelah Anda mendorongnya, Anda menulis ulang sejarah jadi jika Anda melakukannya pastikan untuk memahami implikasinya.
Anda juga dapat meneruskan opsi '--tidak-edit' alih-alih '-m' jika Anda lebih suka menggunakan pesan komit sebelumnya.
Documents: http://git-scm.com/docs/git-commit.html
sumber
Jika Anda sudah mendorong, pertama-tama temukan komit yang Anda inginkan berada di HEAD ($ GIT_COMMIT_HASH_HERE) , kemudian jalankan yang berikut:
Kemudian setiap tempat repo telah dikloning, jalankan:
sumber
Apa yang saya lakukan biasanya ketika saya melakukan dan mendorong (jika ada yang mendorongnya, ini menyelesaikan masalah):
semoga ini membantu
sumber
Saya sudah mendorong. Perlu mengembalikan beberapa komit dengan remote. Telah mencoba banyak variasi, tetapi hanya ini dari Justin via git bush yang bekerja dengan baik untuk saya:
sumber
Atur ulang pada cabang lokal
Dorong paksa ke tempat asal
sumber
Bawa cadangan kode Anda ke folder temp. Perintah berikut akan diatur ulang sama seperti server.
Jika Anda ingin menyimpan perubahan Anda, dan hapus commit terbaru
sumber
Referensi: Cara menghapus komit di git, lokal dan jarak jauh
sumber
Seperti yang Anda lihat pada gambar di atas saya ingin menghapus mengembalikan komit "test change 2" (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (Anda bisa mendapatkan ID SHA1 dengan menggunakan
gitk
perintah di git bash)).Untuk itu saya dapat menggunakan (semua perintah di bawah ini hanya berfungsi pada lokal. Anda perlu mendorong setelah menghapus):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// itu memback -up Anda untuk komit itu (ID SHA1 dari perubahan uji 4 komit adalah 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )git reset --hard HEAD~1
// itu mencadangkanmu sebelum seseorang berkomitmen.git reset --hard HEAD^
// Untuk menghapus komit terakhir dari gitsetelah dihapus:
sumber
git reset --hard HEAD~1
Anda sekarang akan berada di kepala sebelumnya. Tarik dahan. Dorong kode baru. Komit akan dihapus dari git
sumber
git reset --hard
git push HEAD asal - memaksa
Jika satu atau lebih dari commit ditandai, hapus dulu tag tersebut. Kalau tidak, komit yang ditandai tidak dihapus.
sumber
gunakan git revert https://git-scm.com/docs/git-revert . Ini akan mengembalikan semua kode maka Anda dapat melakukan commit selanjutnya. Kemudian head akan menunjuk ke commit terakhir. komit yang dikembalikan tidak pernah dihapus tetapi tidak akan memengaruhi komitmen terakhir Anda.
sumber
Dalam kasus saya, kode ajaib saya untuk pupose ini adalah ini:
Uji dan katakan padaku. Saya telah mencoba beberapa yang berbeda, tetapi ini adalah satu-satunya yang membantu saya.
sumber