Zorla güncelleme sonrasında Git pull


333

Sadece bazı taahhütleri ezdim git rebaseve yaptım git push --force(ki bu kötüdür, biliyorum).

Şimdi diğer yazılım mühendislerinin farklı bir geçmişi var ve bunu yaptıkları zaman git pullGit birleşecek. Bunu düzeltmenin bir yolu var mı rm my-repo; git clone git@example.org:my-repo.git?

Bunun tersi gibi bir şeye ihtiyacım var git push --force, ancak git pull --forceamaçlanan sonuçları vermedim.


16
tüm repoyu silmek zorunda kalmadan şubelerini silebilir ve yeniden oluşturabilirler:git checkout master && git branch -D test && git checkout -b test origin/test
Florian Klein


Yanıtlar:


511

Yeni taahhütleri almak için

git fetch

Sıfırla

Düğmesini kullanarak yerel bir dalın taahhüdünü sıfırlayabilirsiniz git reset.

Yerel bir şubenin taahhüdünü değiştirmek için:

git reset origin/master --hard

Belgelerin koyduğu için dikkatli olun:

Dizin ve çalışma ağacını sıfırlar. <komut> öğesinden bu yana, çalışma ağacında izlenen dosyalarda yapılan değişiklikler atılır.

Yerel olarak yaptığınız değişiklikleri gerçekten korumak istiyorsanız, --softbunun yerine sıfırlayın. Bu, şubenin işlem geçmişini güncelleştirir, ancak çalışma dizinindeki herhangi bir dosyayı değiştirmez (ve daha sonra bunları gerçekleştirebilirsiniz).

rebase

Yerel taahhütlerinizi aşağıdakileri kullanarak diğer taahhütlerin / şubelerin üzerinde tekrar oynatabilirsiniz git rebase:

git rebase -i origin/master

Bu, yeniden temellendirdiğiniz tarihte olmayan her bir taahhüdü nasıl uygulayacağınızı seçebileceğiniz etkileşimli modda rebase'i çağırır.

Kaldırdığınız (ile birlikte git push -f) taahhütler zaten yerel tarihe çekildiyse, yeniden uygulanacak taahhütler olarak listelenecekler - rebase'in bir parçası olarak silinmeleri gerekecek veya basitçe geçmişe dahil edilecekler şube için - ve bir sonraki basışta uzak geçmişte yeniden görünür.

git command --helpYukarıdaki (veya diğer) komutlardan herhangi biri hakkında daha fazla ayrıntı ve örnek için yardımı kullanın .


2
@iblue, tüm değişiklikleri kaybetme, taahhüt geçmişini kaldırma ancak dosya değişikliklerini tutma veya her bir taahhüdü yeni başlığın üstüne uygulama girişimi arasında seçim yapar. En basit seçenek muhtemelen yumuşak bir sıfırlamadır.
AD7six

1
@iblue İş arkadaşınız `` git reabse origin / master '' kelimesini kullandığında ve daha önce bazı taahhütlerde bulunduklarında, git taahhüdünüzü arkasına yazacaksınız.
Tim

6
Bu farklı bir dal git reset origin/otherbranch --hard
içinse

Yani, bu, açıklığa kavuşturmak için ya Seçenek 1: reset --hard, ya da Seçenek 2: reset --soft+ rebase, değil mi?
PlazmaBinturong

2
@PlasmaBinturong sayılı git reset --soft origin/masteruzaktan uzaktan ve sahne farklılıkları maç için tarih taahhüt değişecektir sonra kararlı olmak . Bu senaryoda yeniden temellendirmeye gerek yoktur (ve taahhüt edilmemiş değişiklikler nedeniyle bunu yapmanız engellenir) çünkü işlem geçmişinde hiçbir fark yoktur. İki seçenek sıfırlanır veya yeniden oluşturulur - her ikisinin bir kombinasyonu değildir. Senaryonun burada yanıtladığımdan farklı olup olmadığını lütfen bir soru sorun .
AD7six

16

Bu, zaten içinde istemediğiniz koda sahip olan dalları düzeltmez (bunun nasıl yapılacağı için aşağıya bakın), ancak bir dal çekmişlerse ve şimdi temiz olmasını (ve "önde" olmamasını istiyorsanız) kökeni / bazı şube) basitçe:

git checkout some-branch   # where some-branch can be replaced by any other branch
git branch base-branch -D  # where base-branch is the one with the squashed commits
git checkout -b base-branch origin/base-branch  # recreating branch with correct commits

Not: Bunların hepsini && arasına koyarak birleştirebilirsiniz.

Not2: Florian bir yorumda bundan bahsetti, ama cevap ararken yorumları kim okuyor?

Not3: Kontamine dallarınız varsa, yeni "aptal dal" a dayanarak yeni dallar oluşturabilirsiniz ve sadece kiraz toplama işlemi tamamlanır.

Ör:

git checkout feature-old  # some branch with the extra commits
git log                   # gives commits (write down the id of the ones you want)
git checkout base-branch  # after you have already cleaned your local copy of it as above
git checkout -b feature-new # make a new branch for your feature
git cherry-pick asdfasd   # where asdfasd is one of the commit ids you want
# repeat previous step for each commit id
git branch feature-old -D # delete the old branch

Şimdi özellik-yeni ekstra (muhtemelen kötü) taahhüt olmadan şubeniz!


Gerçekten istediğim buydu. Birisi ana dalı yeniden bastı (çünkü tanrı hangi sebebi biliyor) ama üzerinde çalışmak istediğim herhangi bir yerel değişiklik yoktu. Tek yapmam gereken yerel usta şubemi silmekti (ki bu gerçekten garipti) ve tekrar ödeme yapmaktı. Teşekkürler!
Danilo Carvalho

@ peter-mortensen Düzenlemeler stackoverflow.com/help/editing'e
Tom Prats

Son adım için, ayrıca kullanabilirsiniz git checkout -b base-branch origin/base-branchilegit checkout --track origin/base-branch
bluesmonk

2

Rebase ile çekin

Düzenli olarak çekme getirme + birleştirme, ancak istediğiniz getirme + rebase. Bu, şu pullkomutla bir seçenektir :

git pull --rebase

Tarihte tüm bu birleştirme taahhütleri olmadan master'dan en son kodu özellik dalıma almak için bunu her zaman kullanıyorum.
Herman
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.