Bir github deposunu belirli bir işleme nasıl geri alabilirim?


431

Github'm şu anda 100 taahhüt var. 80'i işlemek için depoyu geri almam ve sonraki tüm dosyaları kaldırmam gerekiyor.

Neden? Bu repo, çeşitli kullanıcılardan birleştirme içindir. Aşırı düzenleme nedeniyle bir grup benden taahhütte bulundu. Bunun nedeni, 3 geliştiricinin birbiriyle etiketlendiği uzak şubelerimin yanlış etiketlenmesiydi. O noktaya sıfırlamam ve sonra ileri çekmem gerekiyor.

Bu örnekte olduğu gibi yeniden temellendirmek istedim: GitHub'daki bir taahhüdü nasıl kaldırabilirim?

Ancak git, çok fazla çatışma yönetimi yapmamı istiyor. Daha basit bir yol var mı?

Yanıtlar:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Not: Aşağıdaki yorumlarda yazıldığı gibi, bunu ortak bir ortamda kullanmak tehlikelidir: geçmişi yeniden yazıyorsunuz


43
insanlar git push -f origin branch. Sadece kötü bir zaman geçirdim, çünkü özledim.
Sumit M Asok

21
DİKKAT! tüm taahhütlerini yerel olarak kaybedeceksin ve eğer
Thomas

8
Bu doğru değil, git reflog'u kullanarak eski taahhütleri alabilirsiniz
Jan Schaefer

27
bana bir hata veriyor gibi git push origin HEAD --forceyerine yapmanız gerekebilirgit push -f origin brancherror: src refspec branch does not match any.
sprocket12 20

1
Evet, teşekkürler çocuklar. İstediğimi yapmayı başardım. İlk önce geri almak istediğim taahhüdün önünden ayrı bir dal oluşturdum. Yerel olarak klonlandı. Daha sonra bu kopyadaki önerilerinizi uyguladım, bu şekilde ana
şubemden

21

En son taahhüdü geri almak için şunu yaparım:

İlk:

git log

geri almak için en son SHA kimliğini alın.

git revert SHA

Bu, taahhüdünüzün tam tersini yapan yeni bir taahhüt yaratacaktır. Ardından, uygulamanızı daha önce olduğu duruma getirmek için bu yeni taahhüdü zorlayabilirsiniz ve git geçmişiniz bu değişiklikleri buna göre gösterecektir.

Bu, yeni işlediğiniz bir şeyin hemen tekrarlanması için iyidir, ki bu benim için daha sık görülür.

Mike metrik olarak, bunu da yapabilirsiniz:

git revert HEAD

8
git revert HEADhash'a bakmak zorunda kalmadan son taahhüdü geri alacaktır.
Mike Baranczak

Taahhütleri silmek istemiyorsanız bu bir çözümdür. Ancak, bu durumda, tüm çöp taahhütleri hala orada olacak ve bir klonlayıcının sıfırlanmasına veya ödeme yapmasına izin verecektir. Bunu önlemek istiyorsanız, zorlamak zorunda kalacaksınız.
cst1992

19

Diğer yol:

Geri döndürmek istediğiniz dalı kontrol edin, ardından yerel çalışma kopyanızı uzak sunucuda en son olmasını istediğiniz taahhüde sıfırlayın (her şey güle güle gidecektir). Bunu yapmak için, SourceTree'de sağ tıkladım ve "BRANCHNAME öğesini bu işleme sıfırla" yı seçtim.

Ardından deponuzun yerel dizinine gidin ve şu komutu çalıştırın:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Bu işlem, yerel deponuzdaki geçerli olandan sonraki tüm taahhütleri silecektir, ancak yalnızca bu dal için.


1
FYI "REPOSITORY_NAME" https: /me@github.com/me/repo_name.git gibi bir şey olacak
tim

3
Bu komutu parçalayıp açıklarsanız daha yararlı olur.
cst1992

3

Çoğu öneri, son 20 taahhüdü bir şekilde yok etmeniz gerektiğini varsayar, bu yüzden "geçmişi yeniden yazmak" anlamına gelir, ancak zorunda değilsiniz.

Sadece 80 numaralı taahhütten yeni bir şube oluşturun ve bu şube üzerinde çalışın. Diğer 20 komisyon eski yetim şubede kalacak.

Yeni dalınızın kesinlikle aynı ada sahip olmasını istiyorsanız, dalın yalnızca etiketler olduğunu unutmayın. Eski şubenizi başka bir adla yeniden adlandırın, sonra 80 numaralı yeni şubeyi istediğiniz adla oluşturun.


Bu da sorunlu herkesin ilgili şube tarihinin yerel sürümleri ile sorunlu karışıklık tahmin ediyorum.
ragerdl

2

Master'dan şube güncellemeleri yaparken, bazen aşırı tıkladığımı ve şubenin de master ile birleşmesine neden olduğumu fark ettim. Bunu geri almanın bir yolunu buldum.

Son taahhüdünüz bir birleşme ise, biraz daha fazla sevgi gerekir:

git revert -m 1 KAFA


1

Github'da, kolay yol, github kullanıcı arayüzündeki uzak dalı şubeler sekmesi altında silmektir. Şubenin silinebilir olmasını sağlamak için aşağıdaki ayarları kaldırdığınızdan emin olmalısınız:

  1. Varsayılan bir şube değil
  2. Açılış anket talebi yok.
  3. Şube korunmuyor.

Şimdi, önceki işlem noktasını işaret etmek için yerel havuzunuzda yeniden oluşturun. ve uzak depoya geri ekleyin.

git checkout -b master 734c2b9b   # replace with your commit point

Sonra yerel şubeyi uzaktan

git push -u origin master

Varsayılan şube ve şube korumasını vb. Geri ekleyin.

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.