2010-04-02 15 views
742

Bağlam: Basit bir özellik ekleyerek ana üzerinde çalışıyorum. Birkaç dakika sonra, bu kadar basit olmadığını ve yeni bir dalda çalışmak daha iyi olmalıydı.Git: Ana sayfadaki dengesiz/yüklenmemiş değişikliklerden bir şube oluşturma

Bu her zaman bana kalır ve başka bir şubeye nasıl geçeceğimi ve tüm bu istenmeyen değişiklikleri benim ana dalı temiz bırakarak nasıl alacağımı bilmiyorum. Ben sadece bunu başarmak istiyorum git stash && git stash branch new_branch gerekiyordu ama bu elde ediyoruz: Bunu gerçekleştirmenin bir yolu varsa

~/test $ git status 
# On branch master 
nothing to commit (working directory clean) 

~/test $ echo "hello!" > testing 

~/test $ git status 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

~/test $ git stash 
Saved working directory and index state WIP on master: 4402b8c testing 
HEAD is now at 4402b8c testing 

~/test $ git status 
# On branch master 
nothing to commit (working directory clean) 

~/test $ git stash branch new_branch 
Switched to a new branch 'new_branch' 
# On branch new_branch 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 
Dropped refs/[email protected]{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b) 

~/test $ git s 
# On branch new_branch 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

~/test $ git checkout master 
M testing 
Switched to branch 'master' 

~/test $ git status 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

biliyor musunuz?

+0

sorununuza basit bir çözüm, size ne istediğini farklıysa ne elde sonuç içinde belirtebilirsiniz olmasına rağmen? – Gauthier

+1

Yukarıdakileri veya cevapları en altta yaparak, istenmeyen değişiklikler hem ana hem de yeni dal üzerindedir. Onları sadece yeni şubede istiyorum, bu yüzden master'ı kontrol edebilirim ve bu değişikliklerin – knoopx

+1

etrafında dolanmadan başka bir şey üzerinde çalışabilirim. Temiz bir ana ödeme yapmak istiyorsanız, yerel şubenizi yeni şubeye eklemeniz gerekir. Yerel değişiklikler yalnızca geçerli HEAD ile diskteki dosyalarınız arasındaki farklardır. Yerel dosyalardaki bu değişiklikler, sürümlendirilmemiş, daha sonra almak istiyorsanız, onları bir yere kaydetmek için git söylemeniz gerekir. – Gauthier

cevap

884

saklamak gerek yok. Yerel değişikliklere dokunmuyor. ( ) Sadece mevcut HEAD'den şube oluşturur ve orada HEAD'yi ayarlar. Yani sanırım istediğin bu. ödeme ustanın sonucunu açıklamak için

--- Düzen ---

Yaptığınız değişiklikleri silmek gelmez checkout master çünkü karıştı mı?

Değişiklikler yalnızca yerel olduğundan, git bunları kolayca kaybetmenizi istemez. Dal değiştiğinde, git yerel değişikliklerin üzerine yazmaz. senin checkout master sonucudur:

M testing 

, çalışma dosyalarınızı temiz olmadığı anlamına gelir. git HEAD'i değiştirdi, ancak yerel dosyalarınızın üzerine yazmadı. Bu nedenle, son durumunuz hala master numaralı telefonda olmanıza rağmen yerel değişikliklerinizi gösterir.

Yerel değişiklikleri gerçekten silmek isterseniz, ödemeyi -f ile zorlamanız gerekir.

git checkout master -f 

Yaptığınız değişiklikler hiçbir zaman işlenmediğinden, bunları kaybedersiniz.

Şubenize geri dönün, değişikliklerinizi yapın ve ana bilgisayarı tekrar kontrol edin.

git checkout new_branch 
git commit -a -m"edited" 
git checkout master 
git status 

İlk ödeme sonra bir M mesajı alır, ancak o zaman artık değil checkout master sonra ve git status hiçbir modifiye dosyaları göstermelidir.

--- Düzen

ilk yorumuna cevap olarak dizin (yerel dosya) ---

çalışma hakkında karışıklığı temizlemek için, yerel değişiklikler, şey ... sadece yereldir. Git bunları otomatik olarak kaydetmez, daha sonra kaydetmek için bunu söylemelisiniz. Değişiklikler yaparsanız ve bunları açıkça taahhüt veya saklamıyorsanız, git onları sürümlendirmez. HEAD (checkout master) değiştirirseniz, kaydedilmemiş olduğundan yerel değişikliklerin üzerine yazılmaz.Yapabileceğiniz

+0

Her zaman böyle yaparım. Tam olarak nasıl olmasını istersin. – synic

+0

dostum, bu önemli noktayı kaçırıyordum. Sanırım bunun neden olduğunu anladım ve neden önce onları yapmazsam, değişikliklerin açıkça (göz ardı etmeden) göz ardı edemeyeceğine inanıyorum. Teşekkürler: D – knoopx

+22

Burada kafa karıştırıcı olan şey, git’in adam sayfası, 'git checkout'' komutunu gösterir; “Çalışan ağaçtaki dosyaları, dizindeki veya belirtilen ağaçtaki sürümle eşleştirmek için günceller.”. Bu, dosya sistemindeki değişikliklerin ardından * GONE * olacağını varsayar. Onları geri alma şansı yok. Yapmayacaklarını söyleseniz bile, bu hala çok kötü bir his bırakır. Buna hiç güvenmiyorum * *. Belgeler gerçekten kötü ya da git’in varsayılan davranışı gerçekten tehlikelidir. Bu durumda, değişikliklerinizi kaybetmek istemediğinizi saptamak için bazı “otomagic” sezgisel yaklaşımlara güvenmek zorunda kalmamalı. – Evi1M4chine

46

Dene:

git stash 
git checkout -b new-branch 
git stash apply 
+5

Bu sadece 'git checkout -b new-branch' işlemini kendi başına yapmaktan farklı mıdır? –

+0

Cevabın orijinal olarak yazıldığı sanmıyorum, ama yanılıyor olabilirim. Ne yazık ki çalışma koşulum nedeniyle, son birkaç yıldır performansım var, bu yüzden şimdi doğruluğunu kanıtlayamıyorum. –

+2

Ya da son iki adım yerine: git stash şubesi – rethab

12

İki şey:

git stash -u 
git branch sillyname [email protected]{0} 

veya

git checkout -b sillyname 
git commit -am "silly message" 
git checkout - 

-

(git checkout - < (git stash -u < -u o da unstaged değişiklikleri alır demektir) - dash, olduğunuz önceki dalın kısayoludur)

4

GitHub Windows istemcisini (olduğum haliyle) kullanıyorsanız ve yeni bir şubeye taşımak istediğiniz, değiştirilmemiş değişiklikler yapmış olmanız durumunda, GitHub istemcisi aracılığıyla "Yeni bir şube ayır" komutunu kullanabilirsiniz. . Yeni oluşturulan şubeye geçecek ve değişikliklerinizi koruyacaktır.

enter image description here

+0

(bunları Mac OS'de 223 sürümü) –

İlgili konular