Git bare deposunda son yürütmeyi nasıl kaldırabilirim?


94

Çıplak bir depoda anlam ifade etmeyen birkaç git komutu olduğunu göz önünde bulundurarak (çünkü çıplak depolar dizin kullanmaz ve bir çalışma dizini içermez),

git reset --hard HEAD^ 

böyle bir depodaki son değişikliği onaylamamak için bir çözüm değildir.

İnternet üzerinden arama, tüm ı konuyla ilgili bulabildiğim olan bu ben bunu yapmanın üç yolu takdim ediyorum ki,:
1. "(tesisat içerir) elle ref güncellemek";
2. " git push -fçıplak olmayan bir depodan";
3. " git branch -f this $that".

Hangi çözümün daha uygun olduğunu düşünüyorsunuz veya bunu yapmanın başka yolları nelerdir? Ne yazık ki git bare depoları hakkında bulduğum belgeler oldukça zayıf.


8
@ Lavinia-Garbriela Dobrovol Aşağıdaki karmaşık şeyleri kullanmayın. HEAD'i farklı bir commit'e taşımaya çalışıyorsunuz ve git reset, çıplak bir depoda bile bunun için tasarlandı. Aşağıdaki cevabıma göre şunu kullanın: git reset --soft <commit> --soft ile, mevcut olmayan bir çalışma ağacını ve dizini değiştirmeyi denemeyin, bu nedenle git sıfırlama işlemini sorunsuz yapmanızı sağlar.
Hazok

Yanıtlar:


133

git update-refKomutu kullanabilirsiniz . Son kaydı kaldırmak için şunu kullanırsınız:

$ git update-ref HEAD HEAD^

Veya son kaydetmeyi kaldıramayacağınız dalda değilseniz:

$ git update-ref refs/heads/branch-name branch-name^

İsterseniz sha1'i de geçebilirsiniz:

$ git update-ref refs/heads/branch-name a12d48e2

Git-update-ref komutunun belgelerine bakın .


@ Lavinia-Gabriela Dobrovolschi: doğru, tam sözdizimine aşina değildim.
VonC

@VonC <ref> ' git update-ref <ref> <newvalue>i sağ dal olarak belirtebilirsiniz, örneğin HEAD yerine "refs / heads / master" gibi. Umarım sorunuzu yanlış anlamamışımdır.
Lavinia-Gabriela Dobrovolschi

@Sylvain: +1 iyi düzenleme. @ Lavinia-Gabriela Dobrovolschi, hassasiyetler için teşekkür ederim. Bu çok daha pratiktir (uzak sunucuya doğrudan erişiminiz varsa, sanırım).
VonC

3
Örnekler, branch-nameargüman açısından yanıltıcıdır . Bir update-ref"şube" ile kullanırken , kesinlikle şubenin tam referans adını belirtmelisiniz (yani refs/heads/normal kısa şube adının başına ekleyin ). Sadece kısa adı kullanırsanız, $GIT_DIR/branch-namebunun yerine oluşturma / güncelleme ile sonuçlanacaksınız $GIT_DIR/refs/heads/branch-name. Her iki varlığı branch-nameve refs/heads/branch-name“... REFNAME belirsiz” neden uyarılar olacaktır.
Chris Johnsen

Bu cevap, Zach'in önerdiğinden çok daha karmaşıktır. Ve çözümü iyi çalışıyor.
Krystian

32

Aşağıdakileri çıplak bir depoda kullanırsanız:

git reset --soft <commit>

o zaman çıplak bir depoda kullandığınız sorunlar --hardve --mixedseçeneklerle karşılaşmazsınız çünkü çıplak deponun sahip olmadığı bir şeyi (yani çalışma ağacı ve indeks) değiştirmeye çalışmıyorsunuz. Sizin durumunuzda özellikle kullanmak isteyeceksiniz (çıplak depodan):

git reset --soft HEAD^

To uzak repo anahtarı dalları yapın:

git symbolic-ref HEAD refs/heads/<branch_name>

Mevcut seçili şubeyi görmek için:

git symbolic-ref HEAD

https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html


3
Taşımak istediğiniz şubeyi nasıl seçersiniz? Örneğiniz usta üzerinde iyi çalışıyor ancak git checkout other_branchçıplak olarak çalışmıyor.
Gauthier

1
Hmmm ... Bu konuda bana kimin oy verdiğini merak ediyorum. Soru, uzak bir depoda şubelerin nasıl değiştirileceğini değil, çıplak bir depoda nasıl sıfırlanacağını sordu. Uzak depodaki varsayılan dalı değiştirmek için git symbolic-ref HEAD refs / heads / <branch_name> kullanın.
Hazok

7

İyi git push -fçalışması gerekir:
Bu çıplak depoyu klonlarsanız, son taahhüdü kaldırın ( git reset --hard HEAD^bahsettiğiniz gibi, ancak yerel çıplak olmayan bir depoda) ve geri itin (-f ):

  • Kaldırdığınızdan önceki diğer kayıtlar için hiçbir SHA1'i değiştirmezsiniz.
  • Çıplak reponun tam içeriğini eksi ekstra taahhüdü geri ittiğinizden eminsiniz (çünkü önce onu klonladınız).

@ VonC Merhaba Von, Git'te çok cevap verdiğini gördüm, bu yüzden sormak istedim ... Merak ettim, git reset --soft <sha1>HEAD'i çıplak bir depoda taşımak için neden aşağıdaki cevabımda gösterildiği gibi önerilen uygulama olmasın ?
Hazok

Sanırım sormamın bir başka nedeni de, çıplak depolar için yazılımdan sıfırlamayı kullanmanın hazır bir bilgi olmadığı ve birçok forumun, yazılım sıfırlamanın en az miktarda yazma ve en az şans nedeniyle en iyi uygulama olduğu göründüğünde gereksiz yere karmaşık geçici çözümlere sahip olduğu görülmesidir. hata için.
Hazok

2
@Zach: a reset --soft, doğrudan çıplak bir depoda yapıldığında çalışmalıdır. Ben çıplak repo bir genel olduğu için bu nadiren yapıldığını sanıyorum memba Repo (yani bir Repo hangi sen bastırıyorlar verileri) ve çoğu zaman, sen yok bunun doğrudan yerel erişim hakkına sahiptir. Ama bunu yaparsanız, o zaman bu kesinlikle " reset --soft" kullanımın başka bir güzel örneğidir ( stackoverflow.com/questions/5203535/… 'de olduğu gibi ) Cevabınıza +1.
VonC

2

Ayrıca git refspec gösterimini kullanabilir ve şöyle bir şey yapabilirsiniz:

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

Bu, hedef dalın (ref ile belirtildiği gibi), +<object ref>parça tarafından belirtildiği gibi kaynak işlemeye güncellenmesini zorlar .


2
şubede bir ACL olması dışında - ki bu genellikle "çıplak deponun kendisi üzerinde yapmanız gerekiyorsa" durumdur ...
David Schmitt
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.