yerel değişiklikleri atmadan git anahtarı dalı


181

Pekala, bir gün bir sürü değişiklik yaptığımızı ve bunları taahhüt ettiğimizde yanlış dal üzerinde çalıştığımızı fark ettiğimizi varsayalım.

Git'i yerel değişiklikleri atmadan şubeleri değiştirmeye nasıl zorlayabiliriz .

Bir cevap beklerken muhtemelen bu konuda naif bir yoldan gideceğim, ama daha önce başıma gelmediğini söylersem yalan söyleyeceğim doğru bir prosedür olup olmadığını bilmek istiyorum ...

  • Yedekleme değişti repo
  • git reset --hard
  • git checkout right-branch
  • Değişiklikleri geri yükle
  • git commit -m "changes"

Yanıtlar:


342

Ne kadar uzakta olduğunuza ve onları hangi dallarda istediğinize bağlı olarak bir dizi farklı yol vardır.

Klasik bir hata yapalım:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

Yani şimdi Henüz hiç işlememiş olmaları bu değişiklikler, istediğiniz master, üzerinde olmak develop.

  1. Eğer varsa yoksa bir develophenüz, yöntem oldukça basittir:

    $ git checkout -b develop
    

    Bu, developşu an bulunduğunuz yerden başlayarak yeni bir şube oluşturur . Artık taahhütte bulunabilirsiniz ve yeni şeyler devam ediyor develop.

  2. Sen var bir develop. Git'in hiçbir şey yapmadan geçiş yapmanıza izin verip vermeyeceğini görün:

    $ git checkout develop
    

    Bu başarılı olur ya da şikayet eder. Başarılı olursa harika! Sadece taahhüt et. Değilse ( error: Your local changes to the following files would be overwritten ...), hala birçok seçeneğiniz vardır.

    En kolayı muhtemelen git stash(beni tıklatmaya vuran diğer tüm cevaplayıcıların postsöylediği gibi). git stash saveVeya git stash push, 1 veya sadece / git stashiçin kısa olan sade çalıştırın :savepush

    $ git stash
    

    Bu, garip bir şube-y yöntemi kullanarak kodunuzu (evet, gerçekten bazı taahhütler yapar) taahhüt eder. Yaptığı taahhütler herhangi bir dalda "açık" değildir, ancak artık depoda güvenli bir şekilde saklanır, böylece şimdi dallar arasında geçiş yapabilir, daha sonra zulayı "uygulayabilirsiniz":

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    Her şey yolunda giderse ve sonuçları git stash dropbeğenirseniz, saklamak gerekir . Bu, garip şube olmayan y işlemlerine yapılan referansı siler. (Hala depodalar ve bazen acil bir durumda alınabilirler, ancak çoğu amaç için bu noktada gittiğini düşünmelisiniz.)

applyAdım seyahatseverlerin Git güçlü yatan birleştirme makineleri, şube birleştirmeleri yaparken kullandığı şey aynı tür kullanılarak saklanmış değişikliklerin, bir birleştirme yapar. Bu, üzerinde çalıştığınız dal yanlışlıkla üzerinde çalışmayı düşündüğünüz daldan yeterince farklıysa "birleşme çatışmaları" elde edebileceğiniz anlamına gelir. Bu nedenle , Git'in herhangi bir birleştirme çatışması tespit etmemiş olsa bile , saklamanın temiz bir şekilde uygulandığını varsaymadan önce sonuçları dikkatlice incelemek iyi bir fikirdir .

Birçok kişi git stash popkısa süreliğine kullanır git stash apply && git stash drop. Bu gittikçe iyi, ancak uygulama bir karmaşa ile sonuçlanırsa ve bu yolda ilerlemek istemediğinize karar verirseniz, saklamayı kolayca geri alamazsınız. Bu yüzden apply, ayrı ayrı tavsiye ediyorum , sonuçları dropsadece tatmin edildiyse / memnun kaldığımda kontrol ediyorum . (Bu elbette başka bir kahve molası verebileceğiniz ve ne yaptığınızı unutabileceğiniz, geri dönüp yanlış bir şey yapabileceğiniz başka bir noktayı tanıtmaktadır , bu yüzden mükemmel bir tedavi değildir.)


1save içinde git stash saveyeni bir zulası oluşturmak için eski fiildir. Git sürüm 2.13, işleri daha tutarlı hale getirmek popve create komutuna daha fazla seçenek eklemek için yeni fiili tanıttı . Git sürüm 2.16, eski fiili resmen kullanımdan kaldırmıştır (yine de, bunu düzenlerken en son sürüm olan Git 2.23'te çalışıyor).


3
Geçerli dalı taahhüt etmeden başka bir şubeye geçmek (örneğin değişiklikler tamamlanmadı) ve daha sonra devam etmek için geri dönmek istersem ne olur?
stt106

@ stt106: Hala işlemek gerekir, ancak aracılığıyla size, bu ve diğer cevaplar olduğu gibi, bunu yapabilir git stashböylece kaydedilmesini-için bunu git stashelde edersiniz iki alışılmadık içinde zula giriş başına kaydedilmesini, üzerinde düzenleme-olan hiçbir dalı. Çok kısa vadeli özel durumlar dışında, genellikle normal bir taahhütte bulunmayı tercih ederim. Şunları yapabilirsiniz git reset --softveya git reset --mixedüzeri veya kullanmak git commit --amendkenara itmek için, ne zaman o dal üzerinde çalışmaya sen geri. (Modern git worktree add
Git'te

"Bu başarılı olacak ya da şikayet edecek." Ödeme yaparken başarı veya hata nedenleri hangileri olabilir?
nanocv


<a> şubesinde olduğum ve değişikliklerimi yaptığım yukarıdaki adımlarla geçiş yaptığımda tüm yerel değişikliklerim kayboluyor ve <b> şubesine geçmek ve buradaki tüm değişiklikleri itmek istiyorum. git stash yaparken ve diğer şubelere taşırken <b> şubesinin tüm dosyalarını çekiyor ve yerel değişikliklerim kayboluyor
Mukul Munjal

38

Git stash kullan

git stash

Değişiklikleri bir yığına iter. Onları geri çekmek istediğinizde

 git stash apply

Tek tek öğeleri bile çıkarabilirsiniz. Zulayı tamamen havaya uçurmak için:

 git stash clear

7
Son komut muhtemelen git stash drop; git stash clear, bu komut kümesiyle ilgisiz olasılıklar da dahil olmak üzere tüm yığın yığınını siler.
Leland

15
  • git stash taahhüt edilmemiş değişikliklerinizi kaydetmek için
  • git stash list kaydedilmemiş kaydedilmemiş depolarınızı listelemek için
  • git stash apply stash@{x} burada x 0,1,2 olabilir.

4

Şunlardan birini yapabilirsiniz:

  • git stashDeğişikliklerinizi rafa kaldırmak için kullanın veya,

  • Başka bir şube oluşturun ve değişikliklerinizi orada yapın ve ardından bu dalı çalışma dizininizle birleştirin

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.