değiştirilen dosyaları check-in için başka bir şubeye taşıma


422

Bu sık sık başıma geliyor: Bazı kodlar yazıyorum, değişiklikleri kontrol etmeye gidiyorum ve sonra bu değişiklikleri kontrol etmek için uygun şubede olmadığımı fark ediyorum. Ancak değişikliklerim geri alınmadan başka bir şubeye geçemiyorum. Değişiklikleri orada kontrol edilecek başka bir şubeye taşımanın bir yolu var mı?

Yanıtlar:


751

git stash senin arkadaşın.

Henüz taahhütte bulunmadıysanız, çalıştırın git stash. Bu, tüm değişikliklerinizi kaydedecektir.

Değişikliklerin açık olmasını istediğiniz dalı değiştirin ve çalıştırın git stash pop.

Git stash için birçok kullanım alanı vardır. Bu kesinlikle daha yararlı nedenlerden biridir.

Bir örnek:

# work on some code
git stash
git checkout correct-branch
git stash pop

122
İstenmeyen saklanmaya gerek yok değişti, bir şube kontrol ettiğinizde sizinle birlikte gidiyorlar. Stash, geçici şeylerin daha uzun süreli depolanması için daha fazladır (daha sonra bitirmek ve işlemek istediğiniz şeyler, ancak şu anda başka bir şey yapmanız gerekiyor).
Tekkub

2
Bunu anladım. Bu yüzden saklamak, şube değiştirmek ve sonra pop C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
zorunda

3
@Tekkub "geçici şeylerin daha uzun süreli depolanması" demek çok garip hissettiriyor, saklamak için başka bir nokta onu bir yığına itiyor, bu yüzden onu taşımak ve başka bir şey üzerinde çalışmak istemiyorsanız bu şekilde yararlı . Evet, zorunda değilsiniz ama sadece daha temiz ve daha kontrol altında hissediyorsunuz.
Atherion

bravo bebeğim! taahhütlerini yerine
getirdiysen

2
@Tekkub Bu, yalnızca geçmekte olduğunuz dalın bulunduğunuz dal ile güncel olması durumunda geçerlidir. Örneğin kazara ürün dalı üzerinde çalışıyorsanız ve sahne dalına geçmeniz gerekiyorsa, ancak ortalama süre saklamakta sahne değiştiğinde, anahtarı yapmanın tek yolu budur.
danielson317

248

Değişikliklerinizi henüz yapmadıysanızgit checkout , yeni şubeye geçmek için kullanın ve ardından normal şekilde taahhüt edin; dosyalarda yapılan değişiklikler siz taahhüt edene kadar belirli bir şubeye bağlı değildir.

Eğer varsa var zaten değişiklikleri taahhüt:

  1. Yazın git logve taşımak istediğiniz taahhüt ait SHA hatırlıyorum.
  2. Taahhüdü taşımak istediğiniz dalı kontrol edin.
  3. Tip git cherry-pick SHAyukarıdan SHA ikame edilerek kullanılmıştır.
  4. Orijinal şubenize geri dönün.
  5. git reset HEAD~1Yanlış şube işleminize başlamadan önce sıfırlamak için kullanın .

cherry-pick verilen bir taahhüdü alır ve bunu şu anda kullanıma alınmış olan kafasına uygular, böylece taahhüdü yeni bir şubeye kopyalamanıza olanak tanır.


9
Burada kiraz toplamanız bile gerekmiyor. git reset HEAD~N --softve şimdi kullanılmayan kodun git checkout -btümünü yeni bir şubeye taşımak için.
Aaron

19
dosyalarda yapılan değişiklikler siz taahhüt edene kadar belirli bir şubeye bağlı değildir. <- bu. Bu benim için bir gizemi çözdü. Teşekkürler.
Tschallacka

8
Dalları değiştirmeye çalışırken şu hatayı alıyorum: "aşağıdaki dosyalarda yapılan yerel değişiklikler ödeme ile üzerine yazılır". Yani, farklı bir şubeye gidip normal bir şekilde işleyebileceğim gibi görünmüyor.
Mischa

3
@Mischa Farklı geçmişlere sahip iki dal arasında geçiş yaparsanız çalışmaz
watashiSHUN

1
@Aaron çok daha hoş (taahhüt sonrası senaryosu için)! Lütfen ayrı bir cevap verin.
Jacktose

16

Ne yazık ki bu bana oldukça düzenli bir şekilde oluyor ve daha git stashönce hatamı fark ettiysem git commitve git cherry-pickbaşka şekilde kullanırsam , her iki komut da diğer cevaplarda oldukça iyi açıklanır

Aşağıdakiler için açıklama eklemek istiyorum git checkout targetBranch: Bu komut yalnızca targetBranch geçerli dalınızla aynı geçmişe sahipse çalışma dizininizi ve aşamalı anlık görüntünüzü koruyacaktır

Değişikliklerinizi henüz yapmadıysanız, yeni şubeye gitmek için git checkout'u kullanın ve ardından normal şekilde taahhüt edin

@ Amber'ın ifadesi yanlış değildir, bir newBranch'a geçtiğinizde , git checkout -b newBranchyeni bir işaretçi oluşturulur ve geçerli dalınızla tam olarak aynı taahhüdü işaret eder.
Aslında, geçmişi mevcut şubenizle paylaşan başka bir şubeniz olduysa (her ikisi de aynı taahhütte) ve "değişikliklerinizi"git checkout targetBranch

Ancak, genellikle farklı dallar farklı geçmiş anlamına gelir ve Git kirli bir çalışma dizini veya hazırlama alanı ile bu dallar arasında geçiş yapmanıza izin vermez. bu durumda git checkout -f targetBranch(temiz ve takas değişikliklerini) veya git stage+ git checkout targetBranch( değişiklikleri temizleyip kaydetme ) yapabilirsiniz, sadece çalıştırmak git checkout targetBranchbir hata verecektir:

hata: Aşağıdaki dosyalarda yaptığınız yerel değişikliklerin yerine ödeme yapılarak yazılabilir: ... Lütfen şubeleri değiştirmeden önce değişikliklerinizi yapın veya saklayın. durduruluyor


5

Bir yumuşak git sıfırlama taahhüt değişiklikler endeksi içine geri koyacağız. Ardından, taahhüt etmek istediğiniz şubeyi kontrol edin. Sonra git yeni bir taahhüt mesajı ile taahhüt.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

Gönderen git docs :

git reset [<mode>] [<commit>]Bu form, geçerli şube kafasını sıfırlar ve bağlı olarak dizini (ağacına sıfırlayarak) ve çalışma ağacını günceller. Atlanırsa, varsayılan olarak - karışır. Aşağıdakilerden biri olmalıdır:

--softDizin dosyasına veya çalışma ağacına hiç dokunmaz (ancak tüm modlarda olduğu gibi kafayı sıfırlar). Bu, git durumunun belirteceği gibi, değiştirilen tüm dosyalarınızı "Taahhüt edilecek değişiklikler" olarak bırakır.

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.