Hapus komit dari cabang di Git

3233

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?

hap497
sumber
41
Saya rasa ini adalah bukan duplikat dari Git undo komit terakhir karena bertanya bagaimana untuk menghapus setiap komit dari cabang. Saya juga berpikir bukan jawaban yang benar-benar menjawab pertanyaan ini. Mereka semua memundurkan komitmen terakhir, bukan cherry-pickdan deletesatu komit yang mungkin terjadi beberapa saat yang lalu.
Chris
12
@ Chris, jawaban dengan git rebase -i HEAD~10memang 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.
MST
@ MST ya, saya seharusnya mengatakan, tidak ada pilihan dalam jawaban yang diterima menjawab pertanyaan ini, tetapi Anda benar - perintah itu tampaknya bekerja
Chris

Jawaban:

4127

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 ...

git reset --hard HEAD~1

Itu HEAD~1berarti 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:

git reset --hard <sha1-commit-id>

Jika Anda sudah mendorongnya, Anda harus melakukan dorongan gaya untuk menyingkirkannya ...

git push origin HEAD --force

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 HEADhebat 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 reflogkecuali Anda memiliki sampah mengumpulkan repositori Anda.

gahooa
sumber
59
HEAD~1atau adil HEAD^. Jika Anda mendorong, Anda harus menggunakannya git revert.
Jakub Narębski
13
Jelas Anda juga dapat menggunakan HEAD~nuntuk "kembali" nmelakukan dari kepala Anda. Mungkin dari titik ini Anda dapat diartikan ... --hard HEADjuga sebagai HEAD~0=> menghapus pekerjaan yang sedang berjalan.
nuala
13
@ beamrider9 imho git rebase hampir selalu merupakan cara yang lebih baik untuk menghapus commit (seperti yang dijelaskan dalam jawaban Greg Hewgill) - paling tidak karena rebase sebenarnya menyertakan peringatan besar bahwa Anda akan menghapus hal-hal yang sebenarnya.
Noah Sussman
20
ini tidak menghapus perubahan dari pohon komit. OP meminta komit yang sudah dibuat. Jika Anda reset --hard, dan periksa log --oneline --all, komit masih tetap di pohon. Bagaimana kita menghapus komit ini dari pohon? Terima kasih.
iGbanam
17
gunakan reset --softuntuk menghapus komit lokal TANPA mengembalikan pekerjaan yang sedang berlangsung!
704

Jika Anda belum mendorong komit di mana saja, Anda dapat menggunakan git rebase -iuntuk menghapus komit itu. Pertama, cari tahu seberapa jauh komitmen itu (kurang-lebih). Lalu lakukan:

git rebase -i HEAD~N

Cara ~Nrebase Nkomit terakhir ( Nharus berupa angka, misalnya HEAD~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.

Greg Hewgill
sumber
2
Catatan: Jika Anda kebetulan memiliki --no-ff menggabungkan dalam komit terakhir, rebase akan membantai mereka :( Ini disebutkan di bawah -p pada halaman ini . Masalahnya adalah, jika Anda mengganti -i dengan -p, Anda tidak lagi mendapatkan pop up dengan pilihan untuk "edit commit ini, sqush that one", dll. Ada yang tahu solusinya?
Bukov
4
Bagaimana jika Anda telah mendorongnya? (hanya saya menggunakan repo jarak jauh)
Costa
6
@Costa dapat Anda gunakan push -funtuk 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.
Greg Hewgill
3
Saya menambahkan dan melakukan file data yang terlalu besar untuk GitHub (yeah, toh mungkin tidak ada dalam repo sumber; Oh well). Ketika saya mencoba untuk mendorong, GitHub menolak karena file terlalu besar. Yang ingin saya lakukan adalah membatalkan komitmen ini, sambil menyimpan beberapa komitmen yang tidak terkait lainnya yang mengikuti. The git rebase -i HEAD~5perintah itu persis apa yang saya butuhkan untuk menghapus ini komit dari repo lokal saya! Terima kasih!
aldo
4
@dumbledad: Dengan rebase -i, perubahan yang terkait dengan komit yang dihapus tidak dipertahankan.
Greg Hewgill
517

Kemungkinan lain adalah salah satu perintah favorit pribadi saya:

git rebase -i <commit>~1

Ini akan memulai rebase dalam mode interaktif -idi 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.

INFORMASI 1800
sumber
3
thx, btw jika Anda mengalami masalah (seperti komit kosong) yang dapat Anda gunakangit rebase --continue
realgt
8
Bahkan lebih mudah: git rebase -i HEAD~1
mmell
2
Wowzers. git rebase -i HEAD~1sangat membersihkan repo! Sulit untuk mengatakan dengan tepat apa yang dilakukannya, tetapi semuanya terlihat jauh lebih rapi. Sedikit mengkhawatirkan, sebenarnya.
Charles Wood
7
Saya pikir perlu dicatat bahwa komit tidak dilenyapkan, hanya dihapus dari daftar. Jika Anda berantakan, Anda bisa mendapatkan komit kembali menggunakan reflog .
Zaz
6
Apakah menghapus garis sama dengan d / drop?
Leo
345

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):

git reset --soft HEAD~1

Jangan gunakan bendera --hard kecuali jika Anda ingin menghancurkan pekerjaan Anda yang sedang berlangsung sejak komit terakhir.

rampok
sumber
5
Berikut ini contoh alasannya: Anda melakukan pekerjaan kecil di server pengembangan yang Anda komit. Kemudian ternyata server itu tidak memiliki akses HTTPS keluar, jadi Anda tidak dapat mendorong komit di mana saja. Paling mudah untuk berpura-pura itu tidak pernah terjadi, dan mengulang tambalan dari mesin lokal Anda.
Steve Bennett
1
@KarthikBose akan selalu ada reflog. bahkan setelah git reset --hard HEAD~1komit terbaru Anda sebelumnya akan tersedia melalui reflog (sampai Anda kedaluwarsa); lihat juga di sini: gitready.com/intermediate/2009/02/09/...
codeling
4
Terima kasih. Jawaban ini harus peringkat lebih tinggi atau termasuk dalam jawaban yang diterima. Menghapus komit! = Mengembalikan komit.
Alsciende
2
@RandolphCarter: Anda masih akan kehilangan perubahan yang tidak dikomit.
naught101
7
@Rob, salah satu contohnya adalah ketika Anda secara tidak sengaja melakukan file yang berisi rahasia (misalnya kata sandi) yang seharusnya tidak pernah berada dalam kendali sumber. Komit lokal harus dihancurkan , bukan hanya dibatalkan, sehingga tidak akan pernah bisa didorong ke server.
Bob Meyers
142

Menghapus seluruh komit

git rebase -p --onto SHA^ SHA

Ganti "SHA" dengan referensi yang ingin Anda singkirkan. "^" Dalam perintah itu literal.

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep

raittes
sumber
26
bagaimana saya bisa lebih memilih jawaban ini ??? solusi lain hanya menunjukkan bagaimana melakukannya secara interaktif atau menghapus komitmen teratas.
ribamar
5
-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.
Raittes
5
Ini adalah jawaban akurat yang sebenarnya
Hamman Samuel
9
Dikatakan, "ganti SHA dengan referensi yang ingin Anda singkirkan" tetapi baris tersebut memiliki SHA di sana dua kali. Inilah yang saya lakukan. git rebase -p --onto 5ca8832c120 ^ 5ca8832c120 Tapi tidak ada yang berubah. Apakah saya harus menggunakan SHA yang sama dua kali? Jika tidak, maka SHA mana yang harus dihapus komitnya dan apa yang seharusnya SHA lainnya?
Rubicksman
3
WOW, itu bekerja dengan sempurna! Ini harus menjadi jawaban yang diterima!
Liran H
51

Jika Anda tidak mempublikasikan perubahan, untuk menghapus komit terbaru, Anda dapat melakukannya

$ git reset --hard HEAD^

(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

$ git revert HEAD
Jakub Narębski
sumber
Itu tidak berhasil. Ketika saya git log, semuanya masih ada, tidak peduli mengapa saya melakukannya hanya menambah lebih banyak komitmen. Saya ingin membersihkan sejarah.
Costa
@Costa: Apa yang tidak berfungsi (yaitu versi mana yang Anda gunakan), dan bagaimana Anda masuk log?
Jakub Narębski
Saya sudah mencoba hampir semua hal dalam Tanya Jawab ini. (Saya mencoba git revert HEAD, baru-baru ini) Log git saya: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)'
Costa
1
Saya hanya ingin menghapus komit (seperti seolah-olah tidak pernah ada). Saya melakukan petualangan kode yang aneh, dengan beberapa komitmen baru, dan semuanya berakhir menjadi sampah. Bagaimana saya bisa menghapusnya dari git log saya?
Costa
2
Sial, sesuatu yang ajaib melakukan persis apa yang saya inginkan .... perintah mana dari yang melakukannya? !!?!
Costa
45

Katakanlah kita ingin menghapus komit 2 & 4 dari repo.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Catatan: Anda harus memiliki hak admin atas repo karena Anda menggunakan --harddan -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 checkout
  • git 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.
tk_
sumber
1
langkah terakhir seharusnya git push -f origin mastertidak ada pilihan--hard
Vivex
2
Saya kira commit 0lebih tua dari commit 1. Tolong bisakah Anda memberi tahu saya mengapa pertama kali dijalankan commit 3(dengan pilihan ceri) dan kemudian oleh commit 1? Setelah checkout b3d92cd( commit 0) saya akan mengharapkan cherry-pick commit 1, kalau begitu commit 3. Terima kasih.
Jarek C
@JarekC Saya pikir komit paling atas adalah komit terbaru di sini, kecuali jika saya melihat sesuatu yang salah ...
Jeff Huijsmans
41
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId merujuk yang ingin Anda kembalikan

sun34
sumber
git push --force <origin> <branchName>. karena tanpa menyebutkan nama cabang, itu mungkin mengubah semua file di remote.
sheelpriy
39

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>, jadi git rebase -i HEAD~5jika Anda ingin melihat lima commit terakhir.

Kemudian dalam editor teks ubah kata pickmenjadi di dropsebelah 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.

IliasT
sumber
dropkata kunci tidak ditentukan. Untuk menghapus komit, cukup hapus seluruh baris.
Shayan Salehian
1
Bagi saya, drop didefinisikan sebagai kata kunci, tetapi melakukan setetes sepertinya tidak menghapus komit dari riwayat. Namun menghapus garis dari rebase interaktif.
Adam Parkin
Inilah yang saya butuhkan. Bekerja dengan baik; Terima kasih!
diekunstderfuge
30

Jika Anda ingin memperbaiki komit terbaru Anda, Anda dapat membatalkan komit, dan menghapus stage file di dalamnya, dengan melakukan:

git reset HEAD~1

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:

git reset HEAD~N

Jika Anda ingin menyingkirkan komit terbaru Anda, dan tidak ingin menyimpan perubahan kode, Anda dapat melakukan reset "keras".

git reset --hard HEAD~1

Demikian juga, jika Anda ingin membuang komit N terakhir, dan tidak ingin menyimpan perubahan kode:

git reset --hard HEAD~N
Anurag-Sharma
sumber
22
git rebase -i HEAD~2

Di sini '2' adalah jumlah komit yang ingin Anda rebase.

'git rebase -i HEAD`

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.

Siva Praveen
sumber
Dalam versi git terbaru tidak ada opsi lagi d . Anda hanya perlu menghapus baris dengan komit dari rebase untuk menghapusnya.
Oleg Abrazhaev
17

Untuk menghapus di cabang lokal, gunakan

git reset --hard HEAD~1

Untuk menghapus di cabang jauh, gunakan

git push origin HEAD --force
bintang
sumber
12

[Jawaban cepat]

Anda memiliki banyak alternatif, misalnya:

  • Alternatif 1:

    git rebase -i <YourCommitId>~1
    

    Ubah YourCommitId untuk jumlah komit yang ingin Anda kembalikan.

  • Alternatif 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    Ubah YourCommitId untuk jumlah komit yang ingin Anda kembalikan.

    Saya tidak merekomendasikan opsi ini karena Anda dapat kehilangan pekerjaan Anda dalam proses.

  • Alternatif 3:

    git reset --soft HEAD~1
    

    Anda dapat mempertahankan pekerjaan Anda dan hanya membatalkan komit.

Javier C.
sumber
terima kasih terima kasih terima kasih (Y)
Habib Rehman
11

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

  1. Pertama, atur ulang cabang ke induk dari komit saat ini

  2. Dorong paksa ke remote.

git reset HEAD^ --hard

git push origin -f

Untuk komit tertentu, Anda ingin mengatur ulang mengikuti

git reset bb676878^ --hard

git push origin -f
Sagar Jethi
sumber
9

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:

git reset --hard COMMIT_ID

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:

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
9

Kesalahan:

Saya git rebase -i --rootmembuka 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 HEADtidak melakukan apa pun, setelah memeriksa reflog, yang terakhir dan satu HEAD- 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>kemudian d, 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.

Leo
sumber
8

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.

Angelo Borsotti
sumber
1
Urutan jawaban ditampilkan di StackOverflow tidak diperbaiki. Harap jangan merujuk ke "Semua perintah di atas". Buat jawaban Anda sendiri mandiri.
Pascal Cuoq
Jawaban ini tidak sepenuhnya benar. 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 .
8

Jika Anda ingin menyimpan riwayat, menunjukkan komit dan mengembalikan, Anda harus menggunakan:

git revert GIT_COMMIT_HASH

masukkan pesan yang menjelaskan mengapa Anda kembali dan kemudian:

git push  

Ketika Anda mengeluarkan git logAnda akan melihat kedua "salah" melakukan dan mengembalikan pesan log.

Paulo Fidalgo
sumber
Ya, tapi OP jelas bukan itu yang mereka inginkan.
Steve Bennett
7

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:

git commit --amend -m "New message here"

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

Pwnrar
sumber
2
Bukan itu yang diminta OP.
Steve Bennett
5

Jika Anda sudah mendorong, pertama-tama temukan komit yang Anda inginkan berada di HEAD ($ GIT_COMMIT_HASH_HERE) , kemudian jalankan yang berikut:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Kemudian setiap tempat repo telah dikloning, jalankan:

git reset --hard origin/master
Justin
sumber
5

Apa yang saya lakukan biasanya ketika saya melakukan dan mendorong (jika ada yang mendorongnya, ini menyelesaikan masalah):

git reset --hard HEAD~1

git push -f origin

semoga ini membantu

Chris Sim
sumber
5

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:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
Serg Burlaka
sumber
4

Atur ulang pada cabang lokal

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Dorong paksa ke tempat asal

git push -f origin
Ashish Singh
sumber
3

Bawa cadangan kode Anda ke folder temp. Perintah berikut akan diatur ulang sama seperti server.

git reset --hard HEAD
git clean -f
git pull

Jika Anda ingin menyimpan perubahan Anda, dan hapus commit terbaru

git reset --soft HEAD^
git pull
Lava Sangeetham
sumber
2

hapus komit lokal

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 gitkperintah di git bash)).

Untuk itu saya dapat menggunakan (semua perintah di bawah ini hanya berfungsi pada lokal. Anda perlu mendorong setelah menghapus):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2// itu memback -up Anda untuk komit itu (ID SHA1 dari perubahan uji 4 komit adalah 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 // itu mencadangkanmu sebelum seseorang berkomitmen.
  3. git reset --hard HEAD^ // Untuk menghapus komit terakhir dari git

setelah dihapus:

setelah menghapus komit

ankit
sumber
2

git reset --hard HEAD~1
Anda sekarang akan berada di kepala sebelumnya. Tarik dahan. Dorong kode baru. Komit akan dihapus dari git

Jyotirmoy Upadhaya
sumber
Kecuali Anda sudah mendorong perubahan. Dalam hal ini hard reset tidak akan membersihkan remote Anda. Jika demikian rebase adalah pilihan yang baik
c0der512
1

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.

BillChan
sumber
0

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.

Uttam Rahane
sumber
0

Dalam kasus saya, kode ajaib saya untuk pupose ini adalah ini:

git reset --hard @{u}

Uji dan katakan padaku. Saya telah mencoba beberapa yang berbeda, tetapi ini adalah satu-satunya yang membantu saya.

Mauro Bilotti
sumber