Geçerli değişikliklerle Git dalı oluşturma


848

Görevimin kolay olacağını düşünerek ana dalım üzerinde çalışmaya başladım . Bir süre sonra daha fazla iş gerektirdiğini fark ettim ve tüm bu işleri yeni bir dalda yapmak istiyorum.

Nasıl yeni bir şube oluşturabilir ve tüm bu değişiklikleri kirli usta olmadan yanımda alabilirim ?




4
Evet bunlar yinelenen sorular, ancak ifadeler o kadar farklı ki, bunun saklanması yararlı olduğunu düşünüyorum. Burada anahtar kelimeleri Not: branch current changesvs existing uncommited branch. İngilizce bilen herkes hemen aynı olduklarını görecek, ancak arama motorları muhtemelen olmayacak. Bu soruyu saklayın.
Scott Biggs

Yanıtlar:


691

Henüz bir taahhütte bulunmamış olsaydınız, sadece (1: şube) ve (3: ödeme) yeterli olacaktır.
Veya bir komutta:git checkout -b newBranch

Belirtildiği gibi git resetadam sayfası :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Bazı taahhütler yaptınız, ancak bunların " master" dalında bulunmak için erken olduklarını fark ettiniz . Bir konu dalında parlatmaya devam etmek istiyorsunuz, bu nedenle geçerli alandan " topic/wip" dal oluşturun HEAD.
  2. masterBu üç taahhütten kurtulmak için dalı geri sarar.
  3. " topic/wip" Dalına geçin ve çalışmaya devam edin.

Not: bir git reset --hardkomutun "yıkıcı" etkisi nedeniyle (dizin ve çalışma ağacını sıfırlar. Çalışma ağacında izlenen dosyalarda yapılan herhangi bir değişiklik <commit>atıldığından beri ), tercih ediyorum:

$ git reset --soft HEAD~3  # (2)

Bu, herhangi bir özel dosyayı (dizine eklenmemiş) kaybetmediğimden emin olur. Seçeneği (ancak kafa sıfırlar dizin dosyası ne de tüm çalışan ağaç dokunmaz tüm modlar yaptığımız gibi).
--soft<commit>


İle Git 2.23+ , yeni komutgit switch (aynı tür ile bir satır ayağı sağlayacaktır reset --hardböylece etkisi dikkat,):

git switch -f -c topic/wip HEAD~3

6
Ayrıca, diğer kişilerin çektiği bir depoda ana dalınıza konu malzemesi işlediyseniz bunun iyi bir fikir olmayacağını da belirtmek gerekir. Ya da en azından, bir sıfırlama yapmanız gerekiyorsa, insanlara ne yaptığınızı söylemeniz gerekir, böylece bir sonraki çekimlerindeki uyarılar çok fazla şok olmaz.
Andrew Walker

39
Gelecekteki okuyuculara not: aşağıdan yukarıya doğru okuyun (ya da her şeyi okuduğunuzdan emin olun). git reset --harddeğişikliklerinize engel olur ve henüz taahhüt edilmezlerse kurtarılamazlar! İhtiyacınız olabilirgit checkout -b …
Conrad Meyer

3
@ConradMeyer İyi bir nokta. Cevabı düzenledim ve git checkout -bilkini koydum .
VonC

5
Neden konu / şube? neden sadece şube adı değil, bu adlandırma için özel bir neden var mı? sadece merak ediyorum.
Sam Stoelinga

1
@ Sadece bir ad alanı adlandırma kuralıdır ( ad alanlarını tanımlamak için hiyerarşik dal adlarını kullanarak dalları kolayca sınıflandırmanın bir yolu ): stackoverflow.com/a/2527436/6309 . Örneğin, sorunlar için: randyfay.com/content/… . Şubelerinizi adlandırırken bir hiyerarşi kullanmanız gerekmez. topic_wipçok işe
yarar

269

Bu soruda belirtildiği gibi: Git: Master : stash üzerinde etiketlenmemiş / değiştirilmemiş değişikliklerden bir dal oluşturun .

Sadece kullan:

git checkout -b topic/newbranch

Taahhütsüz çalışmalar yeni şubeye götürülecektir.

Eğer itmeye çalışırsanız aşağıdaki mesajı alırsınız

ölümcül: Geçerli şube özelliği / NEWBRANCH'ın yukarı yönlü dalı yok. Geçerli dalı itmek ve uzaktan kumandayı yukarı akış olarak ayarlamak için

git push --set-upstream origin feature/feature/NEWBRANCH

Şubeyi uzaktan oluşturmayı önerdiğin gibi yap:

git push --set-upstream origin feature/feature/NEWBRANCH


3
Yeni iş yaptığınızda değil, yalnızca yeni şubeye bastığınızda 'yukarı akış dalı yok' hatası alırsınız.
sam

2
@sam Cevabı buna göre değiştirdim
Nick Kennedy

73

Bu adımları takip et:

  1. Yeni bir şube oluşturun:

    git branch newfeature
    
  2. Checkout yeni şube: (bu, çalışmanızı sıfırlamayacaktır.)

    git checkout newfeature
    
  3. Şimdi bu yeni dalda çalışmalarınızı yapın:

    git commit -s
    

Yukarıdaki adımları kullanmak orijinal şubenizi temiz tutacaktır ve 'git reset --hard' yapmanız gerekmez.


3
3. adımda '-s' ne yapar?
Scott Biggs

12
@ScottBiggs Gereksiz, ancak bazı insanların takip ettiği bir uygulama. Bu "--signoff" kısaltmasıdır ve bu taahhüdü kınadığınızı bilmek için günlüklere bakan gelecekteki kişilerin taahhüdüne kullanıcı adınızı ekler.
Frank Bryce

5
Güzel cevap, ama -s3. adımda gerek yok
Muhammed Ali

Yorumdan yeni bir şey öğrendim, Thanks @FrankBryce
Kasparov92

30

Henüz herhangi bir taahhütte bulunmadığınızdan, tüm değişikliklerinizi saklamaya kaydedebilir, yeni bir dal oluşturabilir ve yeni bir şubeye geçebilir, ardından bu değişiklikleri tekrar çalışma ağacınıza ekleyebilirsiniz:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list

9
Veya VonC'nin 'git checkout -b newbranch' i işaret etmesi ve zulayı atlaması
willcodejavaforfood

@will: Yeni bir şube oluşturmanın sahip olduğunuz herhangi bir taahhüt edilmemiş değişikliğin üzerine yazacağını düşünüyordum, ancak bu durumda değilse, zulayı atlayabilirsiniz.
Eter

1
Ben denedim ve iyi çalıştı, git çok düşünceli ve herhangi bir yerel değişikliklerin üzerine alışkanlık
willcodejavaforfood

2
Ben bir yazım hatası olduğunu düşünüyorum ama sadece git stash pushbir komut değil bu kadar kafa . Muhtemelen kullanmak istersiniz git stashveya git stash save. İzlenmemiş dosyaları saklamak istiyorsanız, --include-untrackedseçeneği kullanın. Aynı şekilde, hem izlenmemiş hem de yoksayılmış dosyaları saklamak --addistiyorsanız, bunun yerine seçeneği kullanın.
Altı

şubeyi daha önce oluşturduysanız, bu yardımcı olur.
Elbette

13

Yeni bir şubeye yeni değişiklikler eklemek ve uzaktan kumandaya itmek için:

git branch branch/name
git checkout branch/name
git push origin branch/name

Çoğu zaman, yeni dal / bitbucket'te neden görmüyorum?

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.