Hata: Yeniden tabanla çekilemez: Hazırlanmamış değişiklikleriniz var


139

Bir projede birkaç arkadaşımla işbirliği yapmaya başladım ve heroku git deposunu kullanıyorlar.

Depoyu birkaç gün önce klonladım ve o zamandan beri bazı değişiklikler yaptılar, bu yüzden en son güncellemeleri almaya çalışıyorum

git pull --rebaseKomutu burada belirtildiği gibi çalıştırdım (Bunu yapmanın doğru yolu bu mu?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

Şu hatayı alıyorum:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

Tahminim, kodla uğraştığım ve şimdi değişiklikleri onaylamamı ya da atmamı istiyor (bu, saklamak ne anlama geliyor?). Olan bu mu? Bu durumda, yapmış olabileceğim tüm değişiklikleri atmak ve sadece güncellenmiş kodu git deposundan almak istiyorum.

Ne yapabileceğime dair bir fikrin var mı?

Yanıtlar:


174

Yapın git status, bu size hangi dosyaların değiştiğini gösterecektir. Değişiklikleri saklamak istemediğinizi belirttiğinizden beri yapabilir git checkout -- <file name>ya git reset --hardda değişikliklerden kurtulabilirsiniz.

Çoğunlukla, git size değişiklikler hakkında ne yapmanız gerektiğini söyleyecektir. Örneğin, hata mesajınız git stashdeğişikliklerinize yazıyordu. Bu, onları saklamak isteseydin olurdu. Çektikten sonra yaparsınız git stash popve değişiklikleriniz yeniden uygulanır.

git status ayrıca dosyanın kesinleştirme için hazırlanıp hazırlanmadığına bağlı olarak değişikliklerden nasıl kurtulacağına sahiptir.


1
Bu iş gibi görünüyordu ama şimdi başka bir hatayla karşılaşıyorum (gelecekteki ziyaretçileri şaşırtmamak için yeni sorular başlattım): stackoverflow.com/questions/23518247/…
user3597950

Bunu tam anlamıyla her seferinde yaşıyorum, yakın zamanda. Önceden, mevcut değişikliklerinizi etkilemeyen dosyaları çekmek sorun değil, ancak şimdi saklamak için değiştirdiğiniz her şeyi gerektirir. git push -f
İtemiyorum

@KarmaBlackshaw Zorlamanıza gerek yok. Bir zorlama yapmanız gerekiyorsa, bu, yerel geçmişinizin ve uzak geçmişinizin farklı olduğu anlamına gelir ve bu, bu cevabın kapsadığından farklı bir sorudur.
Schleis

Bu sorunun kapsamının sağladığından gerçekten farklıdır. Ama mevcut şubeyi silip geliştirmeden yeni bir şube yaparak bir yol buldum. Sanırım bazı şeyleri yanlış yapılandıran şubemdi.
Karma Blackshaw

91

Yeniden ödeme yaparken çalışma değişikliklerinizi korumak istiyorsanız, kullanabilirsiniz --autostash. Gönderen belgeler :

Yeniden sunmaya başlamadan önce, gerekirse yerel değişiklikleri saklayın ( git-stash [1] 'e bakın ) ve bittiğinde zulayı uygulayın.

Örneğin:

git pull --rebase --autostash

7
Modern cevap budur.
adl

13
Otomatik stash'in varsayılan davranış olmasını istiyorsanız, ayarlayabilirsiniz Bu git config --global rebase.autoStash true durumda anahtarı geçmeniz gerekmez.
Zoredache

1
BU, aradığım şey! (komut satırı anahtarının git 2.9'dan kullanılabildiğini, ancak seçeneğin rebase.autostash2.6'dan itibaren mevcut olduğunu unutmayın).
jjmontes

Bu da harika çalışıyor git rebase --interactive!
Dan Dascalescu

6
Neden bu varsayılan değil?
Nick

49

Rebase ile çekme, genel olarak iyi bir uygulamadır.

Ancak, dizininiz temiz değilse, yani taahhüt edilmemiş değişiklikler yaptıysanız bunu yapamazsınız.

Değişikliklerinizi korumak istediğinizi varsayarak, bunu çözmek için yapabilirsiniz:

  1. değişikliklerinizi şununla saklayın: git stash
  2. Rebase ile ustadan çek
  3. (1) ile sakladığınız değişiklikleri tekrar uygulayın: git stash apply stash@{0}veya daha basitgit stash pop

1
Bu işe yarıyor gibi görünüyordu ama şimdi başka bir hatayla karşılaşıyorum (gelecekteki ziyaretçileri şaşırtmamak için yeni sorular başlattım): stackoverflow.com/questions/23518247/…
user3597950

6
@nehemiahjacob git stash popEn son saklanan değişiklikleri de uygulayabilir ve daha uzun süre ezberlemekten kaçınabilirsiniz apply stash@{0}.
Kostas Rousis

Bunu her zaman yapmak zorundayım. Daha kolay bir yol var mı?
Alper

@alper genellikle başka bir (özellik) dalında çalışırsınız. Tecrübelerime göre, sadece işimi yaptıktan sonra ustaya karşı getirip yeniden ödeme yapıyorum, bu yüzden saklamaya / pop yapmaya gerek yok. Geliştirme iş akışınız sırasında kendinizi bunu çok .bashrcalias stashpull='git stash; git pull; git stash pop'
sık

@KostasRousis Bende tam olarak bu takma ad var, lol. Ona 'sppgit' diyorum
luizfls

30

İlk önce bir git status

Bekleyen değişiklikleriniz olup olmadığına bakın. Onları atmak için koşun

git reset --hard

Bu iş gibi görünüyordu ama şimdi başka bir hatayla karşılaşıyorum (gelecekteki ziyaretçileri şaşırtmamak için yeni sorular başlattım): stackoverflow.com/questions/23518247/…
user3597950

16

Bu benim için çalışıyor:

git fetch
git rebase --autostash FETCH_HEAD

1
Ah autostash, bu bana fazladan iki komut kazandırıyor. Bu doğru cevap IMO olmalıdır.
Erik Berkun-Drevnig

10

Her zaman yapabilirsin

git fetch && git merge --ff-only origin/master

ve ya (a) yukarı akış değişiklikleriyle çelişen taahhüt edilmemiş değişiklikleriniz varsa değişiklik olmaz veya (b) stash / pull / apply ile aynı etkiye sahip olursunuz: sizi HEAD'deki en son değişiklikleri ve taahhüt edilmeyen değişikliklerinizi bırakacak bir geri ödeme olduğu gibi.


6

Aşamasız değişiklik git bir dosyadaki eol kurallarını düzeltmeye çalıştığı için (her zaman benim durumumda olduğu gibi), hiçbir saklama, teslim alma veya sıfırlama miktarı ortadan kaldırmaz.

Ancak, amaç gerçekten yeniden başlatmak ve aşamalı olmayan değişiklikleri göz ardı etmekse, o zaman yaptığım şey şubeyi yerel olarak silip tekrar kontrol etmektir.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

İşte bu kadar! Henüz beni hayal kırıklığına uğratmadı.


2

Değişikliklerinizi otomatik olarak saklamak ve her yeniden ödeme için saklamak istiyorsanız, bunu yapabilirsiniz:

git config --global rebase.autoStash true

1
Git'in en yeni sürümünün Git'in geçmişte her zaman çalıştığı şekilde çalışmasını sağlayan tek cevap budur. --autostashOtomatik olabildiği halde neden insanlar eklemeye zorlasın?
Andrew Koster
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.