Şubeyi farklı dalda belirli bir kaydetmeden oluşturma


107

Ana şubede birkaç işlem yaptım ve bunları geliştirme şubesine birleştirdim.

İlk olarak ana dalda taahhüt edilen geliştirme dalındaki belirli bir işlemden şube oluşturmak istiyorum.

Komutları kullandım:

git checkout dev
git branch  <branch name> <commit id>

Ancak bu, şubeyi beklediğim dev dalından değil, ana daldan oluşturur. Kaydetme kimliği, ana dalda ve geliştirme dalında aynıdır. Peki, aynı commit kimliğini farklı dallarda nasıl ayırt edebilirim?

Not: Burada github'da bir örnek yaptım https://github.com/RolandXu/test_for_branch

Komutları kullandım:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

Beklediğim şey, test dalının aa.txt bb.txt cc.txt içermesidir. Ancak, test dalı yalnızca aa.txt ve cc.txt içerir. Büyük ihtimalle şubeyi ana şubeden oluşturmuştur.

Yanıtlar:


154

branchKomutun bu biçimini kullanıyorsanız (başlangıç ​​noktasıyla), nerede olduğunuzun bir HEADönemi yoktur.

Ne yapıyorsun:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
  • Önce HEADşubeye ayarladın dev,

  • İkincisi, commit üzerine yeni bir dal başlatırsınız 07aeec98. Bu commit'de bb.txt yok (github deponuza göre).

Yeni teslim aldığınız konumda yeni bir şube başlatmak istiyorsanız, başlangıç ​​noktası olmadan şubeyi çalıştırabilirsiniz:

git branch test

veya diğerinin yanıtladığı gibi, tek bir işlemde şubeye gidin ve kontrol edin:

git checkout -b test

Sanırım 07aeec98şubenin bir parçası olan bu gerçek kafanızın karışabileceğini düşünüyorum dev. Bu taahhüdün bir atası olduğu doğrudur, deven son taahhüde ulaşmak için değişikliklere ihtiyaç vardır dev. Ancak, en yeniye ulaşmak için gerekli olan diğer işlemlerdir devve bunlar mutlaka tarihinde değildir 07aeec98.

8480e8ae(bb.txt eklediğiniz yer) örneğin geçmişinde değil 07aeec98. Den dallarsanız 07aeec98, tarafından yapılan değişiklikleri alamazsınız 8480e8ae.

Başka bir deyişle: A dalını ve B dalını C dalına birleştirirseniz, ardından A işleminde yeni bir dal oluşturursanız, B'de tanıtılan değişiklikleri alamazsınız.

Aynı burada, dev'de birleştirdiğiniz master ve dev olmak üzere iki paralel dalınız vardı. Bir ana taahhüdünden (birleştirmeden daha eski) dallanma, dev değişikliklerini size sağlamaz.


Ana öğeden yeni değişiklikleri kalıcı olarak özellik dallarınıza entegre etmek istiyorsanız , masterbunlarla birleşmeli ve devam etmelisiniz . Bu, özellik şubelerinizde birleştirme işlemleri oluşturacaktır.

Eğer özellik dalları yayınlamadıysanız, ayrıca güncellenen ana bunları rebase: git rebase master featureA. Olası çatışmaları çözmeye hazırlıklı olun.

Özellik dalları üzerinde birleştirme taahhütleri olmadan çalışabileceğiniz ve yine de ana sürümdeki yeni değişikliklerle entegre olabileceğiniz bir iş akışı istiyorsanız, aşağıdakileri öneririm:

  • her yeni özellik dalını bir usta taahhüdüne dayandırın
  • devusta taahhüdünde bir şube oluştur
  • Özellik dalınızın ana kopyadaki yeni değişikliklerle nasıl bütünleştiğini görmeniz gerektiğinde, hem ana parçayı hem de özellik dalını dev.

devDoğrudan taahhütte bulunmayın , yalnızca diğer şubeleri birleştirmek için kullanın.

Örneğin, A ve B özelliği üzerinde çalışıyorsanız:

a---b---c---d---e---f---g -master
    \       \
     \       \-x -featureB
      \
       \-j---k -featureA

devYeni ana makineyle iyi çalışıp çalışmadıklarını kontrol etmek için dalları bir dalda birleştirin :

a---b---c---d---e---f---g -master
    \       \            \
     \       \            \--x'---k' -dev
      \       \             /    /   
       \       \-x----------    /    -featureB
        \                      /
         \-j---k--------------- -featureA

Özellik dallarınız üzerinde çalışmaya devam edebilir ve hem ana hem de özellik dallarından devdüzenli olarak yeni değişikliklerle birleşmeye devam edebilirsiniz .

a---b---c---d---e---f---g---h---i----- -master
    \       \            \            \
     \       \            \--x'---k'---i'---l' -dev
      \       \             /    /         /
       \       \-x----------    /         /  -featureB
        \                      /         /  
         \-j---k-----------------l------ -featureA

Yeni özellikleri entegre etme zamanı geldiğinde, özellik dallarını (değil dev!) Ana öğeye birleştirin .


Teşekkürler. Soruma cevap ver. Git dal kipini anlamakta yanılıyorum. Ve benim sorunum için herhangi bir öneriniz var mı? Başkalarından zamanında birçok taahhüdü olan ana şubeye sahibim (perforce ile senkronize). Geliştirme şubem var, kişisel işlerim var. Ana daldan ve dev daldan gelen tüm commit'leri içeren bir dal istiyorum, sonra bu daldan kolayca dal oluşturabilirim, sonra özel çalışmaya başlayabilirim.
RolandXu

Bir yoruma cevap veremedim, bu yüzden cevabımı önerilen iş akışlarıyla güncelliyorum.
Gauthier

Hey - parlak ve kapsamlı cevap için teşekkürler! Sadece merak ediyorum: Sonunda, neden biri merge the feature branches (not dev!) into master?
cassi.lup

devŞubede gerçek anlamda yeni bir gelişme yok . Şubelerinizi özel tutmalısınız. devyalnızca birleştirme kaydetmeleri içerir. Tüm yeni özellikleri doğrudan ile masterbirleştirmek, özellikleri bir araya getirip ardından sonucu ile birleştirmekten daha mantıklıdır master.
Gauthier

@Gauthier Neden sorusuna değinmediniz. Bana öyle bir birleştirme gibi geliyor devsadece özelliklere sahip A Bve Ciçine içine birleştirilecek masterayrı ayrı birleştirme aynıdır A Bve Ciçine master. Aksi takdirde, git'in nasıl çalıştığını anlamama meydan okuyor ve nedenini çok merak ediyorum!
Steven Lu

55

Argümanlar yanlış sırada var:

git branch <branch-name> <commit>

ve bunun için hangi şubenin kontrol edildiği önemli değil; ne dersen onu yapacak. (Kaydetme bağımsız değişkenini atlarsanız, varsayılan olarak mevcut olanla aynı yerde bir şube oluşturmaya başlar.)

Yeni şubeyi oluştururken kontrol etmek isterseniz:

git checkout -b <branch> <commit>

commit argümanını atlarsanız aynı davranışla.


22

Herkesin bahsettiği gibi bunu yerel olarak yapabilirsiniz.

git checkout -b <branch-name> <sha1-of-commit>

Alternatif olarak, bunu github'da da yapabilirsiniz, aşağıdaki adımları izleyin:

1- Depoda tıklayın Commits.

2- Dalmak istediğiniz <>kayıtta, geçmişin bu noktasında depoya göz atmak için tıklayın .

tarih işliyor

3- tree: xxxxxxSol üstteki simgesine tıklayın . Sadece yeni bir şube adı girin Create branch xxx, aşağıda gösterildiği gibi tıklayın .

yeni şube oluştur

Artık o şubeden değişiklikleri yerel olarak alıp oradan devam edebilirsiniz.


İhtiyacım olan buydu .. Web sitesinde nasıl yapılır
eharo2

Ben hiç bilmiyordum. Budur. GUI olayı harika ve CLI'den uzak olmak istedim.
Rohit Gupta

Bu Cevap olarak işaretlenmelidir ¡
Sandeep Anand

11

Deneyin

git checkout <commit hash>
git checkout -b new_branch

İşleme, iki ayrı dalda değil, ağacınızda yalnızca bir kez bulunmalıdır.

Bu, belirli bir taahhüdü kontrol etmenize ve ne istediğinizi adlandırmanıza olanak tanır.


merhaba git log dev ve git log master'ı deniyorum, commit hash id'sini ana daldan dev dalına birleştirdiğim commit için aynı buldum
RolandXu

gitkgünlüğünüzü görselleştirmek gibi bir şey kullanmak yardımcı olabilir
ZMorek

Github'a yeni bir örnek ekledim. Ve Gauthier zaten soruma git dal modunu yanlış anladığımı cevapladı. Teşekkürler :)
RolandXu

Sanırım bu gerçekten cevap. Teşekkürler
virusss8

9

Yapmak zorundasın:

git branch <branch_name> <commit>

(şube adını ve commit'i değiştiriyordunuz)

Veya yapabilirsiniz:

git checkout -b <branch_name> <commit>

Yerine şube adını kullanırsanız, şubenin ucundan bir şube alırsınız.


Anlamı bu değil HEAD. Bunun yerine "dalın ucu" veya "şubenin işaret ettiği taahhüt" diyebilirsiniz.
Cascabel

@Jefromi - Saf olmak gerekirse, dalın kendisi dalın ucunu işaret ettiği için sadece dalı söyleyebiliriz.
manojlds
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.