Bir şubeden tüm commit'leri çek, belirtilen commit'leri diğerine aktar


102

Aşağıdaki şubelerim var:

  • master
  • production

ve aşağıdaki uzak şubeler:

  • origin/master
  • origin/production

origin/masterDalı getiren ve son getirmemden ( log -p master..origin/master) farklı olanın farkını alan bir komut dosyam var . Sonra birleşiyorum origin/master.

Bulunan işlemeler bir kod inceleme aracına aktarılır.

Başarılı taahhütleri - ve sadece onları - üretim şubesine ve sonra tabii ki itmek istiyorum origin/production.

Bunu nasıl yapabilirim?

Ayrıca, çalışan 2 komut dosyam var: Biri gelen origin/master, ayrıntıları bir veritabanına aktaran ve birleştiren ve şu anda yazdığım, başarılı taahhütleri zorlayacak olan diğeri.

Yarış koşullarından / birleştirme çatışmasından kaçınırken bu 2 komut dosyasının çalışmasını istiyorum. Sadece belirli kayıtlarla çalışmak istediğime göre, belki de istemediğim taahhütlerden kurtulmanın bir yolu vardır?


'Başarılı taahhütler' ile neyi kastediyorsunuz?
bdonlan

gözden geçirilmiş ve başarılı olarak işaretlenmiş olan. burada gerçekten önemli değil, önemli olan tutmak istediğim ve başka bir şubeye itmek istediğim taahhütler ve kurtulmak / görmezden gelmek istediğim diğerleri.
Sylvain

Yanıtlar:


315

Sanırım aradığınız terim bir 'kiraz kıracağı'. Yani, bir dalın ortasından tek bir işlem alıp diğerine ekleyin:

A-----B------C
 \
  \
   D

olur

A-----B------C
 \
  \
   D-----C'

Bu tabii ki git cherry-pick komutuyla yapılabilir.

Bu commit ile ilgili sorun, git'in commit'leri onlardan önceki tüm geçmişi dahil etmeyi düşünmesidir - bu nedenle, eğer böyle üç commit varsa:

A-----B-----C

Ve B'den kurtulmaya çalışın, şu şekilde tamamen yeni bir commit oluşturmalısınız:

A-----------C'

C 'farklı bir SHA-1 kimliğine sahip olduğunda. Aynı şekilde, bir daldan diğerine bir işlem seçen kiraz, temelde bir yama oluşturmayı, sonra onu uygulamayı ve bu şekilde de geçmişi kaybetmeyi içerir.

Kaydetme kimliklerinin bu şekilde değiştirilmesi, git'in diğer şeylerin yanı sıra birleştirme işlevini bozar (gerçi, eğer idareli kullanılırsa, bunun üzerine bilgi verecek buluşsal yöntemler vardır). Daha da önemlisi, işlevsel bağımlılıkları görmezden gelir - eğer C gerçekten B'de tanımlanan bir işlevi kullanırsa, asla bilemezsiniz.

Belki de bunun üstesinden gelmenin daha iyi bir yolu, daha ince taneli dallara sahip olmak olabilir. Yani, sadece bir 'ana' sahip olmak yerine, 'özellikA', 'hata düzeltmeB', vb. Var işiniz bittiğinde bir şube. Bu, git'in tasarlandığı iş akışı ve iyi olduğu şey :)

Yamalar düzeyinde bir şeylerle uğraşmakta ısrar ediyorsanız, darcs'e bakmak isteyebilirsiniz - depoyu bir dizi yama olarak görür ve bu nedenle kiraz toplama temel işlem haline gelir. Ancak bunun, çok yavaş olması gibi kendine özgü sorunları vardır :)

Düzenleme: Ayrıca, iki senaryo hakkındaki ikinci sorunuzu anladığımdan emin değilim. Belki olayların kafa karıştırmasını önlemek için onu daha ayrıntılı olarak, muhtemelen ayrı bir soru olarak tanımlayabilirsiniz?


İkinci sorumla ilgili olarak, farklı dallarla çalışırken, değişiklikleri getirme (1. komut dosyası) ve verilen taahhütleri başka bir konuma (2. komut dosyası) gönderme işlemlerinin yarış durumu / birleştirme çatışması olmadan çalışabileceğinden emin olmak istiyorum. Ama sonunda sanırım 2 senaryoyu tek bir senaryoda birleştirebildiğim için bu önemli değil, böylece 2 senaryo aynı anda çalışmaz :)
Sylvain

9
"Bu commit kimliklerinin değiştirilmesi, git'in
Narek

5
@Narek Muhtemelen, ikinci dalı birleştireceğiniz zaman, C 'işlemindeki değişikliklerin, C işlemindeki aynı değişikliklerle çakışacağı anlamına geliyor. Bu, commit C'nin ardındaki tarihi kaybetmenin sonucudur
bytefu

1
"Ve B'den kurtulmaya çalışın" - neden B'den kurtulmaya çalışıyorsunuz?
d512

3
@ user1334007, eskiden ABC olduğu anlamına geliyor. Şimdi, C kiraz seçiminiz nedeniyle, dalınız artık 'B' içermeyen AD-C'dir.
AnneTheAgile

1

Bunun eski bir soru olduğunun farkındayım, ancak burada başvuruluyor: Git'te belirli bir commit nasıl birleştirilir

Bu nedenle, daha yeni bir cevap: Özellik dallarını ve çekme isteklerini kullanın.

Neye benziyor, burada fA, A özelliğine sahip bir işlemdir ve fB, B özelliğine sahip bir işlemdir:

            fA   fC (bad commit, don't merge)
           /  \ /
master ----A----B----C
                \  /
                 fB

Çekme istekleri GitHub'ın işlevselliğiyle ilişkilidir, ancak gerçekten tek söylemek istediğim, birisinin özellik dallarını ana olarak birleştirme sorumluluğuna sahip olmasıdı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.