İlk git taahhüdü nasıl geri alınır?


358

Ben ilk kez git deposunu taahhüt ediyorum; Daha sonra taahhütten pişmanım ve geri dönmek istiyorum. denerim

# git reset --hard HEAD~1

Bu mesajı alıyorum:

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

Bu taahhüt, deponun ilk taahhüdüdür. Git'in ilk taahhüdünün nasıl geri alınacağı hakkında bir fikrin var mı?

Yanıtlar:


566

Sadece bulunduğunuz dalı silmeniz yeterlidir. Bunu yapamaya git branch -Dkarşı bir güvenlik kontrolüne sahip olduğu için kullanamazsınız . Bunu update-refyapmak için kullanabilirsiniz .

git update-ref -d HEAD

Do not kullanmak rm -rf .gitveya bu şekilde böyle bir şey tamamen tüm diğer branşlarda yanı sıra sıfırlamaya çalışıyorsanız o dalda da dahil tüm depoyu silecek.


1
Bunu bir tadilatta denedim - ilk taahhüdü bölmek istedim - sonra yaptı git statusve sürprizime göre, git dedi fatal: Not a git repository (or any parent up to mount point ...)!
Matt Fenwick

1
bu benim için işe yaramadı. Yok sayılması gereken, ancak yok sayılan dosyalardan oluşan dosyalar oluşturun .gitignore. git add ., git commit -m "initial commit", git update-ref -D HEAD, Bir oluşturmak .gitignoregit yine daha önce göz ardı gerektiğini de sözlerine ekledi dosyaları görmek olduğunu, ihbar. Başka bir deyişle git update-ref -d HEAD, ilk taahhütten önce beni devlete geri götürmedi.
gman

2
Ama asıl sorunun konusu bu. İlk taahhütten hemen önce devlete geri dönmek.
gman

2
git reset --hard HEAD~1diğer tüm taahhütler için eklenen dosyaları kaldıracaktır. Açıkçası soru, bu komutun diğer tüm durumlarda çalıştığı duruma nasıl ulaşılacağıdır. Çözümünüzün çalışmadığını kanıtlamak için bu özete bakın gist.github.com/greggman/522fa69a21d6cfb3ff0b
gman

11
: Durumda herkes Gman görüşleri ile karışır git update-ref -d HEAD yok aslında ilk işlemek dönmek fakat dizinine eklenecek daha önce taahhüt değişiklikleri tutar. Bu değişiklikleri de kaldırmak istiyorsanız, aşağıdakileri yapın git reset --hard. Eksik olsa bile, bu cevap gerçekten en iyisidir, bu yüzden kullanmaktan kaçının rm -fr .git(ne yaptığınızı bilmiyorsanız).
rsenna

62

HEAD'i silebilir ve deponuzu yeni bir duruma geri yükleyebilirsiniz; burada yeni bir başlangıç ​​taahhüdü oluşturabilirsiniz:

git update-ref -d HEAD

Yeni bir işlem oluşturduktan sonra, zaten uzaktan kumandaya bastıysanız, önceki ilk işlemin üzerine yazmak için uzaktan kumandayı zorlamanız gerekir:

git push --force origin

1
Dikkate değer ... bu doğru komuttur ancak HEAD'i silmez ... .git \ HEAD dosyasının teslim aldığı ref'yi (.git \ refs \ heads altında bulunur) siler. Bu komutu çalıştırdıktan sonra, sildiğiniz refs / heads / <name> dosyasına işaret eden HEAD dosyasını yine de bulabilirsiniz, ancak bu yolu izlerseniz heads ref'nin artık mevcut olmadığını göreceksiniz.
DanK

15

Bu soru bu blog yayınından bağlantılandırıldı ve Git'in yeni sürümleri için alternatif bir çözüm önerildi:

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

Bu çözüm şunları varsaymaktadır:

  1. Sadece bir senin üzerinde işlemek zorunda masterdalı
  2. Adında bir şube yok, old_masterbu yüzden bu ismi kullanmakta özgürüm

Varolan dalı yeniden adlandırır ve old_masteryeni, yetim olmayan bir dal master oluşturur (yeni depolar için oluşturulmuş gibi) ve ardından serbestçe silebilirsiniz old_master... Sana bağlı.

Not: Git dalını taşımak veya kopyalamak, silerken reflogunu korur ( bu koda bakın ) ve ardından yeni bir dal oluşturmak, dalını yok eder. Geçmişi olmayan orijinal duruma geri dönmek istediğinizden, şubeyi silmek isteyebilirsiniz, ancak diğerleri bu küçük notu düşünmek isteyebilir.


12

Soruda belirtilen koşullar altında:

  • Taahhüt, depodaki ilk taahhüttür.
  • Bu, çok az sayıda komutun yürütüldüğü anlamına gelir:
    • a git init,
    • muhtemelen bazı git addişlemler,
    • ve a git commit,
    • ve hepsi bu!

Bu önkoşullar yerine getirilirse, ilk taahhüdü geri almanın en basit yolu:

rm -fr .git

yaptığınız dizinden git init. Daha sonra git initGit deposunu yeniden oluşturmak için yeniden yapabilir ve ilk kez yapmadığından pişman olduğunuz mantıklı değişikliklerle eklemeleri yeniden yapabilir ve ilk işlemi yeniden yapabilirsiniz.

TEHLİKE! Bu Git depo dizinini kaldırır.

Git deposu dizinini, başka bir yerde yedekleriniz yoksa, kalıcı ve geri döndürülemez bir şekilde kaldırır. Ön koşullar altında, depoda saklamak istediğiniz hiçbir şey yoktur, bu yüzden hiçbir şey kaybetmezsiniz. Eklediğiniz tüm dosyalar, henüz değiştirmediğinizi ve onları silmediğinizi varsayarsak, çalışma dizinlerinde hala kullanılabilir. Ancak, bunu yapmak yalnızca deponuzda başka hiçbir şey yoksa güvenlidir. 'Depoyu ilk kez işleyin - sonra pişman olun' sorusunda açıklanan koşullar altında güvenlidir. Bununla birlikte, çoğu zaman güvenli değildir.

İstenmeyen klonlanmış bir depoyu kaldırmak için bunu yapmak da güvenlidir; kopyalandığı depoya hiçbir zarar vermez. Kopyanızda yaptığınız her şeyi atar, ancak orijinal depoyu etkilemez.

Dikkatli olun, ancak önkoşullar karşılandığında güvenli ve etkilidir.

Deponuzda korunmasını istediğiniz başka şeyler yaptıysanız, bu uygun teknik değildir - deponuz artık bunun uygun olması için ön koşulları karşılamamaktadır.


9
Bu kötü bir tavsiye. Depoda kaybetmek istemediğiniz başka şeyler varsa ne olur?
Matt Fenwick

6
O zaman ilk taahhüt olmaz, değil mi? Sadece bir başlangıç ​​taahhüdü var.
Jonathan Leffler

9
"O zaman ilk taahhüt olmaz" - aslında, evet olurdu. Çok sayıda şubenin yaygın durumunu ihmal ediyorsunuz. Charles'ın cevabına bakınız.
Matt Fenwick

2
Yararlı, ancak bir uyarı ile gelmelidir.
Simon Bengtsson

5
Bu gerçekten işe yarıyor. Kabul edilen cevap vermez.
Yoruma

3

Yapamazsın. Yani:

rm -rf .git/
git init
git add -A
git commit -m 'Your new commit message'

1
Söylemeye çalıştı git reset --hard, neden olsun ki git add -A?
Aristotle Pagaltzis

3

Sonunda benim için işe yarayan şeyi atacağım. Karantinaya alınan veriler yanlış yerleştirildiğinden, taahhüt zaten itilmiş olduğundan bir depodaki ilk taahhüdü kaldırmam gerekiyordu.

Şu anda doğru şubede olduğunuzdan emin olun.

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

Bu, sorunu çözmeyi başardı.

Önemli

Bu, herkese açık olarak erişilemeyen bir dahili havuz üzerindeydi, deponuz herkese açık olarak erişilebiliyorsa, geri almak için ihtiyacınız olan herhangi bir şeyin başka biri tarafından zaten kaldırıldığını varsayalım.


1

Acaba neden "değişiklik" önermiyor ve @damkrat tarafından çarpıldı, çünkü değişiklik bana sadece bir başlangıç ​​olması için bir amaç olmadığı için yanlış taahhüdü düzeltmenin altında yatan problemi en etkili şekilde çözmenin doğru yolu olarak göründüğü için taahhüt. Bazı vurguladı gibi sadece kimse sizin repo klon yoksa usta gibi "kamu" dalında değiştirmek gerekir ...

git add <your different stuff>
git commit --amend --author="author name <author.name@email.com>"-m "new message"

--Yazar sadece birisinin taahhüt yazarlığını düzeltmesi gerekiyorsa
Richard

0

git reset --hard değişiklik yap, sonra yap

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

veya

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

ve sonra

git push origin master --force

--force, ilk adımda geri döndüğünüz taahhüdü yeniden yazacaktır.

Bunu yapmayın, çünkü özellikle VCS sistemleri ve özellikle git fikrine karşı çıkmak üzeresiniz. Tek iyi yöntem yeni şube oluşturmak ve gereksiz dalı silmek. Bilgi için bakınız git help branch.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.