Membuang komit lokal di Git

1469

Karena beberapa pemetikan ceri yang buruk, repositori lokal Git saya saat ini lima komit di depan, dan tidak dalam keadaan baik. Saya ingin menyingkirkan semua komitmen ini dan memulai dari awal lagi.

Jelas, menghapus direktori kerja saya dan kloning ulang akan melakukannya, tetapi mengunduh semuanya dari GitHub lagi sepertinya berlebihan, dan tidak menggunakan waktu saya dengan baik.

Mungkin git revertitulah yang saya butuhkan, tetapi saya tidak ingin mengakhiri 10 komitmen di atas asal (atau bahkan enam), bahkan jika itu mendapatkan kode itu sendiri kembali ke keadaan yang benar. Saya hanya ingin berpura-pura setengah jam terakhir tidak pernah terjadi.

Apakah ada perintah sederhana yang akan melakukan ini? Sepertinya kasus penggunaan yang jelas, tapi saya tidak menemukan contohnya.


Perhatikan bahwa pertanyaan ini khusus tentang komitmen , bukan tentang:

  • file yang tidak dilacak
  • perubahan tidak bertahap
  • dipentaskan, tetapi perubahan tidak dikomit
David Moles
sumber
3
kemungkinan duplikat dari Berbagai cara untuk menghapus perubahan Git lokal
spiderman

Jawaban:

2470

Jika kelebihan Anda hanya terlihat oleh Anda, Anda bisa melakukannya git reset --hard origin/<branch_name> untuk kembali ke tempat asalnya. Ini akan mengatur ulang keadaan repositori ke komit sebelumnya, dan itu akan membuang semua perubahan lokal.

Melakukan git revertmembuat baru berkomitmen untuk menghapus tua komit dengan cara yang membuat waras sejarah semua orang.

Ben Jackson
sumber
91
git reset --hard <commit hash, branch, or tag>jika Anda ingin pergi ke referensi spesifik selain cabang jarak jauh.
Sam Soffes
55
Untuk lebih jelasnya, jika Anda tidak bekerja mastertetapi pada cabang lain, Anda harus menjalankangit reset --hard origin/<your-branch-name>
Zoltán
33
Ini tidak hanya akan membuang komit lokal, tetapi juga membuang semua yang ada di pohon kerja Anda (mis. Anda file lokal). Jika semua yang ingin Anda lakukan adalah tidak berkomitmen, tetapi biarkan pekerjaan Anda tetap utuh, Anda harus melakukan "git reset HEAD ^" ... per stackoverflow.com/questions/2845731/…
aaronbauman
3
Anda mungkin ingin melakukan Ambil setelah ini. Ini memperbaiki jumlah counter-of-commit-waiting-to-be-push di SourceTree.
Stan
2
git reset --hard origin/<branch_name>Ini akan mengatur ulang konfigurasi proyek juga, jadi urus ini. Saya memiliki .cfgfile besar yang disetel ulang ke default. Saya harus menghabiskan berjam-jam untuk itu lagi.
MAC
271

Cukup hapus cabang master lokal Anda dan buat kembali seperti ini:

git branch -D master
git checkout origin/master -b master
Ramon Zarazua B.
sumber
2
Ini bekerja dengan baik ketika melacak perubahan Anda akan menghabiskan banyak waktu, yang terjadi pada saya setelah beberapa rebases.
aross
1
Berguna untuk masalah tarik / dorong subtree di antara anggota tim!
Jorge Orpinel
Ini sempurna ketika Anda ingin memulihkan cabang, bukan hanya master.
Vladimir Ralev
1
ini bukan cara yang baik untuk menghapus komit lokal tunggal. Lebih baik digunakangit reset --hard origin/<branch_name>
Kirit Vaghela
1
Mungkin solusi itu akan berhasil, tetapi itu tidak berarti itu solusi yang tepat.
Adly
202

Mencoba:

git reset --hard <the sha1 hash>

untuk mengatur ulang kepala Anda ke mana pun Anda inginkan. Gunakan gitk untuk melihat komit mana yang Anda inginkan. Anda dapat melakukan reset di dalam gitk juga.

Anders Zommarin
sumber
5
Diputakhirkan ini menjadi informasi yang bermanfaat, tetapi jawaban Ben Jackson mendapatkan tanda centang untuk menyelesaikan apa yang saya inginkan - dengan cara yang tidak mengharuskan saya mencari hash. :)
David Moles
2
Ini adalah satu ketika cabang baru Anda belum pernah didorong ke asal belum
Jan
126

Hapus komit terbaru:

git reset --hard HEAD~1

Hapus komit terbaru, tanpa merusak pekerjaan yang telah Anda lakukan:

git reset --soft HEAD~1

James L.
sumber
5
Jawaban yang berguna. Terima kasih! Saya menggunakan git reset --soft asal / master
Tarun Kumar
2
@TarunKumar TERIMA KASIH! Saya menggunakan integrasi VS, dan solusi Anda adalah satu-satunya cara saya bisa menghapus sekelompok gabungan yang saya tidak inginkan di cabang saya tidak punya izin untuk check-in.
DVK
Terima kasih, hanya apa yang saya cari, "git reset --soft HEAD ~ 1" berhasil karena saya melakukan secara tidak sengaja dan ingin mengembalikan tetapi memiliki file lain yang saya tidak ingin dihancurkan setelah kembali.
edvard_munch
47

Jika Anda menggunakan aplikasi Atlassian SourceTree , Anda bisa menggunakan opsi reset di menu konteks.

masukkan deskripsi gambar di sini

muruge
sumber
42

Pada upaya cabang Anda:

git reset --hard origin/<branch_name>

Validasi pembalikan (ke negara, tanpa komitmen lokal), dengan menggunakan " git log" atau " git status" karenanya.

parasrish
sumber
1
@Troyseph: semua jawaban yang tercantum di atas, saya berusaha apa adanya, dan tidak memperbaiki skenario. Pendekatan umum, yang tidak diilustrasikan dalam jawaban di atas, adalah apa yang telah dicoba dijawab di sini.
parasrish
3
Jawaban yang diterima sama dengan milik Anda, minus nama cabang generik, dan dalam komentar @Zoltan secara eksplisit mengatakanJust to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
Troyseph
1
Ini jawaban terbaik menurut saya.
dwjohnston
21

git reset --hard @{u}* menghapus semua perubahan lokal Anda di cabang saat ini, termasuk komit. Saya terkejut tidak ada yang memposting ini mengingat Anda tidak perlu mencari komitmen untuk kembali atau bermain dengan cabang.

* Yaitu, reset ke cabang saat ini di — @{upstream}biasanya origin/<branchname>, tetapi tidak selalu

Kevin Chen
sumber
1
Beberapa cangkang seperti ikan akan mengartikan "@" jadi Anda mungkin harus memasukkan tanda kutip '@ {u}', misalnya `git reset --hard '@ {u}'. Pokoknya, temukan baik-baik!
trysis
Jawaban yang luar biasa mengagumkan
Marko
1
Bagaimana Anda mencetak nilai @ {u}?
Philip Rego
12

Untuk melihat / mendapatkan id SHA-1 dari commit, Anda juga ingin kembali

gitk --all

Untuk memutar kembali ke komit itu

git reset --hard sha1_id

!Catatan. Semua komit yang dibuat setelah komit akan dihapus (dan semua modifikasi Anda untuk proyek). Jadi, pertama-tama, klon proyek ke cabang lain atau salin ke direktori lain.

Nicholas
sumber
ini bagus untuk situasi di mana remote tidak lagi tersedia, dan orang hanya perlu mengatur ulang ke beberapa komit lokal. gitk luar biasa - tidak menyadarinya sebelumnya.
theRiley
Jika Anda sudah menggunakan gitk, Anda cukup mengklik kanan komit dan pilih "setel ulang cabang XY ke sini".
mkrieger1
Dan komit yang lebih baru tidak akan segera dihapus. Tidak ada cabang lagi yang menunjuk ke mereka (ingat, cabang tidak lain adalah "penanda" untuk komit tertentu).
mkrieger1
9

Saya memiliki situasi di mana saya ingin menghapus komit yang tidak didorong, tetapi komit itu sebelum yang lain. Untuk melakukannya, saya telah menggunakan perintah berikut

git rebase -i HEAD~2 -> itu akan rebase dua komit terakhir

Dan saya menggunakan 'drop' untuk tanda tangan komit yang ingin saya hapus.

Robert
sumber
9

Hapus file yang tidak dilacak (perubahan lokal yang tidak dikomit)

git clean -df

Hapus semua komit lokal secara permanen dan dapatkan komit jarak jauh terbaru

git reset --hard origin/<branch_name>
Kode Elastis
sumber
8

Untuk komit lokal yang tidak didorong, Anda juga dapat menggunakan git rebase -iuntuk menghapus atau menekan komit.

Nikhil Katre
sumber
1
Saya tahu ini mungkin bukan solusi terpendek, tapi saya membesarkan hati Anda karena IMHO git rebase -iadalah cara yang lebih umum untuk menyelesaikan banyak masalah serupa dan dapat membantu dalam berbagai situasi.
Stefan Marinov
1
Gunakan dropkata kunci (alih-alih menghapus baris) saat menghapus semua komitmen untuk menghindari pembatalan rebase.
Michal Čizmazia
6

Solusi sederhana adalah mencocokkan HEAD cabang master lokal dengan HEAD cabang asal / master

git reset --hard origin/master

PS: origin / master - adalah remote pointer ke cabang master. Anda dapat mengganti master dengan nama cabang apa pun

narwanimonish
sumber
4

Sebelum menjawab, mari tambahkan beberapa latar belakang, jelaskan apa ini HEAD. karena beberapa opsi di bawah ini akan menghasilkan kepala terpisah

First of all what is HEAD?

HEADhanyalah referensi ke komit saat ini (terbaru) di cabang saat ini.
Hanya ada satu HEADpada waktu tertentu. (tidak termasuk git worktree)

Konten HEADdisimpan di dalam .git/HEADdan berisi 40 byte SHA-1 dari komit saat ini.


detached HEAD

Jika Anda tidak menggunakan komit terbaru - artinya HEADmenunjuk komit sebelumnya dalam sejarah yang disebut detached HEAD.

masukkan deskripsi gambar di sini

Pada baris perintah, ini akan terlihat seperti ini- SHA-1 bukan nama cabang karena HEADtidak menunjuk ke ujung cabang saat ini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Beberapa opsi tentang cara memulihkan dari HEAD yang terpisah:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Ini akan mengecek cabang baru yang menunjuk ke komit yang diinginkan.
Perintah ini akan checkout ke komit yang diberikan.
Pada titik ini, Anda dapat membuat cabang dan mulai bekerja sejak saat ini.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Anda selalu dapat menggunakan itu reflogjuga.
git reflogakan menampilkan perubahan apa pun yang memperbarui HEADdan memeriksa entri reflog yang diinginkan akan mengaturHEAD kembali komitmen ini.

Setiap kali KEPALA diubah akan ada entri baru di reflog

git reflog
git checkout HEAD@{...}

Ini akan membuat Anda kembali ke komit yang Anda inginkan

masukkan deskripsi gambar di sini


git reset --hard <commit_id>

"Pindahkan" KEPALA Anda kembali ke komit yang diinginkan.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Catatan: ( Karena Git 2.7 )
    Anda juga bisa menggunakan itu git rebase --no-autostash.

git revert <sha-1>

"Undo" rentang komit atau komit yang diberikan.
Perintah reset akan "membatalkan" setiap perubahan yang dilakukan dalam komit yang diberikan.
Komit baru dengan undo patch akan dilakukan sementara komit asli akan tetap ada dalam sejarah juga.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Skema ini menggambarkan perintah mana melakukan apa.
Seperti yang Anda lihat ada reset && checkoutmodifikasi HEAD.

masukkan deskripsi gambar di sini

Panduan Kode
sumber
3

Bagi mereka yang tertarik dengan solusi Visual Studio, berikut adalah latihannya:

  1. Di Team Explorerjendela, sambungkan ke repo target.
  2. Kemudian dari Branches, klik kanan cabang yang diinginkan dan pilihView history .
  3. Klik kanan komit di Historyjendela dan pilih Reset -> Delete changes (--hard).

Itu akan membuang komit lokal Anda dan mengatur ulang status repo Anda ke komit yang dipilih. Yaitu perubahan Anda setelah Anda menarik repo akan hilang.

Bozhidar Stoyneff
sumber
2

Jika cabang Anda di depan ' origin/XXX' oleh 5 komit.

Anda dapat menerbitkan:

git reset --hard HEAD~5

Dan itu harus menghapus 5 komitmen terakhir.

Ha Choo
sumber
0
git reset --hard <SHA-Code>

Ini akan berguna jika Anda telah membuat beberapa kesalahan pada salinan lokal Anda yang ingin Anda pastikan tidak terdorong ke cabang jauh Anda karena kesalahan.

SHA-Code dapat diperoleh dengan melihat webVersion dari dashboard git Anda untuk komit terakhir di cabang.

Dengan cara ini Anda bisa disinkronkan dengan komit terakhir di cabang.

Anda dapat melakukan git pull setelah Anda berhasil menyelesaikan hard reset untuk mengkonfirmasi tidak ada yang baru untuk disinkronkan yaitu Anda bisa melihat pesan.

Cabang Anda terkini Origin/<Branch Name>

Sameer Ashraf
sumber
0

Jika Anda membuat repo lokal Anda berantakan, maka cara andal untuk membuang komit lokal di Git adalah dengan ...

  1. Gunakan "git config - get remote.origin.url" untuk mendapatkan URL yang berasal dari jauh
  2. Ganti nama folder git lokal menjadi "my_broken_local_repo"
  3. Gunakan "git clone <url_from_1>" untuk mendapatkan salinan lokal baru dari repositori git jarak jauh

Dalam pengalaman saya Eclipse menangani dunia yang berubah dengan cukup baik. Namun, Anda mungkin perlu memilih proyek yang terpengaruh di Eclipse dan membersihkannya untuk memaksa Eclipse membangunnya kembali. Saya kira IDE lain mungkin perlu dibangun kembali secara paksa juga.

Manfaat tambahan dari prosedur di atas adalah Anda akan mengetahui apakah proyek Anda bergantung pada file lokal yang tidak dimasukkan ke git. Jika Anda menemukan file yang hilang maka Anda dapat menyalinnya dari "my_broken_local_repo" dan menambahkannya ke git. Setelah Anda yakin bahwa repo lokal baru Anda memiliki semua yang Anda butuhkan, Anda dapat menghapus "my_broken_local_repo".

Adam Gawne-Cain
sumber
0

Jika Anda hanya ingin membuang komit lokal dan tetap melakukan modifikasi dalam file maka lakukan
git reset @ ~
Jawaban lain yang ditujukan pada hard reset

Bankir Ashish
sumber