Bagaimana cara mengembalikan komit git awal?

358

Saya berkomitmen untuk repositori git untuk pertama kalinya; Saya kemudian menyesali komitmen dan ingin mengembalikannya. saya coba

# git reset --hard HEAD~1

Saya menerima pesan ini:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.

Komit ini adalah komit pertama dari repositori. Adakah cara untuk membatalkan komit awal git?

Chau Chee Yang
sumber

Jawaban:

566

Anda hanya perlu menghapus cabang tempat Anda berada. Anda tidak dapat menggunakan git branch -Dkarena ini memiliki pemeriksaan keamanan terhadap melakukan hal ini. Anda dapat menggunakannya update-refuntuk melakukan ini.

git update-ref -d HEAD

Jangan tidak menggunakan rm -rf .gitatau sesuatu seperti ini karena ini benar-benar akan menghapus seluruh repositori Anda termasuk semua cabang lainnya serta cabang yang Anda mencoba untuk me-reset.

CB Bailey
sumber
1
Mencoba ini sementara dalam rebase - ingin membagi komit pertama - kemudian lakukan git status, dan yang mengejutkan saya, kata git fatal: Not a git repository (or any parent up to mount point ...)!
Matt Fenwick
1
ini tidak berhasil untuk saya. Buat file termasuk beberapa yang harus diabaikan tetapi tidak .gitignore. git add ., git commit -m "initial commit", git update-ref -D HEAD, Membuat .gitignore, melihat bahwa git masih adalah melihat file yang ditambahkan sebelumnya yang harus diabaikan. Dengan kata lain git update-ref -d HEADtidak membawa saya kembali ke negara sebelum komit awal.
GM
1
Tapi itulah inti pertanyaan aslinya. Kembali ke keadaan sebelum komit awal.
GM
2
git reset --hard HEAD~1akan menghapus file yang ditambahkan untuk semua komitmen lainnya. Jelas pertanyaannya adalah bagaimana mendapatkan ke status yang sama dengan perintah itu bekerja di semua kasus lainnya. Lihat inti ini untuk membuktikan solusi Anda tidak berfungsi gist.github.com/greggman/522fa69a21d6cfb3ff0b
gman
11
Dalam kasus orang jadi bingung oleh komentar gman ini: git update-ref -d HEAD tidak benar-benar kembali awal komit, tapi membuat semua perubahan yang sebelumnya berkomitmen ditambahkan ke indeks. Jika Anda ingin juga menghapus perubahan itu, jalankan saja yang berikut ini git reset --hard. Meskipun tidak lengkap, jawaban ini memang yang terbaik, jadi hindari menggunakan rm -fr .git(kecuali Anda tahu apa yang Anda lakukan).
rsenna
62

Anda dapat menghapus HEAD dan mengembalikan repositori Anda ke status baru, tempat Anda dapat membuat komit awal yang baru:

git update-ref -d HEAD

Setelah Anda membuat komit baru, jika Anda telah mendorong ke jarak jauh, Anda perlu memaksanya ke jarak jauh untuk menimpa komit awal sebelumnya:

git push --force origin
frazras
sumber
1
Perlu dicatat ... ini adalah perintah yang benar tetapi itu tidak menghapus HEAD ... itu menghapus ref (terletak di bawah. Git \ refs \ head) yang telah diperiksa oleh file .git \ HEAD. Setelah menjalankan perintah ini, Anda masih dapat menemukan file HEAD menunjuk ke file ref / kepala / <nama> yang Anda hapus tetapi jika Anda mengikuti jalur itu Anda akan melihat bahwa kepala ref tidak lagi ada.
DanK
15

Pertanyaan ini ditautkan dari posting blog ini dan solusi alternatif diusulkan untuk versi Git yang lebih baru:

git branch -m master old_master
git checkout --orphan master
git branch -D old_master

Solusi ini mengasumsikan bahwa:

  1. Anda hanya memiliki satu komit di mastercabang Anda
  2. Tidak ada cabang yang dipanggil old_masterjadi saya bebas menggunakan nama itu

Ini akan mengubah nama cabang yang ada menjadi old_masterdan membuat cabang baru, yatim piatu master (seperti dibuat untuk repositori baru) setelah itu Anda dapat dengan bebas menghapus old_master... atau tidak. Terserah kamu.

Catatan: Memindahkan atau menyalin cabang git mempertahankan reflognya (lihat kode ini ) sambil menghapus dan kemudian membuat cabang baru menghancurkannya. Karena Anda ingin kembali ke keadaan semula tanpa riwayat, Anda mungkin ingin menghapus cabang, tetapi yang lain mungkin ingin mempertimbangkan catatan kecil ini.

nonsensik
sumber
11

Dalam kondisi yang ditentukan dalam pertanyaan:

  • Komit adalah komit pertama dalam repositori.
  • Yang berarti ada sangat sedikit perintah yang dijalankan:
    • a git init,
    • mungkin beberapa git addoperasi,
    • dan git commit,
    • dan itu saja!

Jika prasyarat tersebut dipenuhi, maka cara paling sederhana untuk membatalkan komit awal adalah:

rm -fr .git

dari direktori tempat Anda melakukannya git init. Anda kemudian dapat mengulangi git inituntuk membuat ulang repositori Git, dan mengulangi penambahan dengan perubahan apa pun yang masuk akal yang Anda sesalkan tidak melakukan yang pertama kali, dan mengulang komit awal.

BAHAYA! Ini menghapus direktori repositori Git.

Ini menghapus direktori repositori Git secara permanen dan tidak dapat diperbaiki, kecuali jika Anda memiliki cadangan di suatu tempat. Di bawah prasyarat, Anda tidak ingin menyimpan apa pun di repositori, sehingga Anda tidak kehilangan apa pun. Semua file yang Anda tambahkan masih tersedia di direktori yang berfungsi, dengan asumsi Anda belum memodifikasinya dan belum menghapusnya, dll. Namun, melakukan ini aman hanya jika Anda tidak memiliki apa pun dalam repositori Anda sama sekali. Dalam keadaan yang dijelaskan dalam pertanyaan 'lakukan repositori pertama kali - kemudian menyesalinya', itu aman. Namun, sangat sering hal itu tidak aman.

Aman juga melakukan ini untuk menghapus repositori kloning yang tidak diinginkan; itu tidak merusak repositori dari mana ia dikloning. Itu membuang semua yang telah Anda lakukan dalam salinan Anda, tetapi sebaliknya tidak mempengaruhi repositori asli.

Hati-hati, tetapi aman dan efektif ketika prasyarat dipenuhi.

Jika Anda telah melakukan hal-hal lain dengan repositori yang ingin Anda pertahankan, maka ini bukan teknik yang tepat - repositori Anda tidak lagi memenuhi prasyarat untuk menjadikannya tepat.

Jonathan Leffler
sumber
9
Ini saran yang buruk. Bagaimana jika ada hal-hal lain dalam repo yang Anda tidak ingin kehilangan?
Matt Fenwick
5
Maka itu bukan komit awal, kan. Hanya ada satu komit awal.
Jonathan Leffler
9
"Maka itu tidak akan menjadi komit awal" - sebenarnya, ya itu akan. Anda mengabaikan kasus beberapa cabang yang sangat umum. Lihat jawaban Charles.
Matt Fenwick
2
Bermanfaat, namun harus disertai dengan peringatan.
Simon Bengtsson
5
Ini sebenarnya berfungsi. Jawaban yang diterima tidak. Lihat komentar
gman
3

Kamu tidak bisa Begitu:

rm -rf .git/
git init
git add -A
git commit -m 'Your new commit message'
ma11hew28
sumber
1
Dia mencoba mengatakan git reset --hard, jadi mengapa dia mau git add -A?
Aristoteles Pagaltzis
3

Saya akan memasukkan apa yang berhasil bagi saya pada akhirnya. Saya perlu menghapus komit awal pada repositori karena data yang dikarantina salah tempat, komit sudah didorong.

Pastikan Anda saat ini berada di cabang kanan.

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

Ini bisa menyelesaikan masalah.

Penting

Ini ada di repositori internal yang tidak dapat diakses publik, jika repositori Anda dapat diakses oleh umum, asumsikan semua yang Anda butuhkan untuk mengembalikan telah ditarik ke bawah oleh orang lain.

edward
sumber
1

Saya bertanya-tanya mengapa "mengubah" tidak disarankan dan telah dicoret oleh @damkrat, karena perubahan tersebut menurut saya sebagai cara yang tepat untuk menyelesaikan secara paling efisien masalah mendasar dari memperbaiki komit yang salah karena tidak ada tujuan untuk tidak memiliki inisial melakukan. Seperti yang ditekankan beberapa orang, Anda hanya perlu memodifikasi cabang "publik" seperti master jika tidak ada yang mengkloning repo Anda ...

git add <your different stuff>
git commit --amend --author="author name <[email protected]>"-m "new message"
Richard
sumber
--autor diperlukan hanya jika seseorang mengoreksi kepenulisan komit
Richard
0

git reset --segera buat perubahan, lalu lakukan

git add -A
git commit --amend --no-edit 

atau

git add -A
git commit --amend -m "commit_message"

lalu

git push origin master --force

--force akan menulis ulang komit yang telah Anda atur ulang pada langkah pertama.

Jangan lakukan ini, karena Anda akan menentang seluruh gagasan sistem VCS dan git pada khususnya. Satu-satunya metode yang baik adalah membuat cabang baru dan menghapus yang tidak dibutuhkan. Lihat git help branchuntuk info.

damkrat
sumber
-1

Yang harus Anda lakukan hanyalah mengembalikan komit.

git revert {commit_id}'

Lalu dorong

git push origin -f
abdallah Nofal
sumber
Tidak mungkin melakukan itu pada komit pertama.
Pengguna yang bukan pengguna