B dalından a'ya değişiklikleri birleştirmeden veya kaydetme eklemeden uygulama


89

Benim senaryom, derleme sürecinde (şube A) büyük iyileştirmeler yaptığım bir şubem var ve diğerinde ilgisiz bir özellik (şube B) üzerinde çalışıyorum. Şimdi, B şubesini hacklediğimde, A dalında yazdığım şeyleri almak istiyorum çünkü daha hızlı ve daha kolay yapılar istiyorum. Ancak, B şubemi "kirletmek" istemiyorum, sadece A şubesinden aşamalanmamış değişikliklere değişiklikler ekleyin.

Denediğim şey (B dalında dururken):

git merge --no-commit branchA

İşe yaramıyor çünkü sizi bir birleşmenin içine sokuyor. Olmasaydı mükemmel olurdu.

git checkout branchA -- .

Çalışmıyor çünkü değişiklikleri master..branchA değil, branchA..branchB arasında uyguluyor.

Başka herhangi bir şey?

Düzenleme: Evet, A dalındaki değişiklikler yapıldı. Bu örnekte, derleme geliştirmeleri olan yalnızca bir dal vardır, ancak bir özellik dalı üzerinde çalışırken uygulamak istediğim derleme geliştirmeleri içeren en fazla N dal olabilir.


A'daki değişiklikler zaten yapıldı mı?
Theolodis

Yanıtlar:


155

Sadece benzer bir şey yapmam --squashgerekiyordu ve birleştirme komutuna ekleyerek düzeltmeyi başardım

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes

4
Bu aynı zamanda ne yaptığına dair açıklayıcı bir not içermelidir. BranchA'dan geçerli şubenize yapılan değişikliklerin farkını aşamalıyor
KareemElashmawy

Diyelim ki, branchA'dan master'a kodu birleştirdim, ancak bir şeyi unuttum ve git geçmişinde başka bir birleştirme işlemi olarak görünmeden bu birleştirme işlemine birkaç kod / değişiklik eklemek istiyorum. bu yöntem işe yarayacak mı?
Sushmit Sagar

@Sushmit Sanırım bir yapabilirsin git commit —amendve yeni değişiklikleri son işleme ekleyecek, birleştirme işlemlerinde işe
yarayıp yaramadığından

1
Bence burada taahhüt yok mu? Varsayılan olmalıdır.
Petter

11

cherry-pick -n istediğinizi yapmalısınız, ancak neden aşamalı olmayan değişiklikler olarak yapı geliştirmelerini istediğinizden emin değilim - bu sadece birkaç şeyi daha da zorlaştırır (örneğin, değiştirilen dosyalarda diğer değişiklikleri birleştirmek veya herhangi bir şeyi yeniden oluşturmak).

Bu örnekte, derleme geliştirmeleri olan yalnızca bir dal vardır, ancak bir özellik dalı üzerinde çalışırken uygulamak istediğim derleme geliştirmeleri içeren en fazla N dal olabilir.

Bu durumda, hem A hem de B'den (ve yapı geliştirmeleri olan diğer tüm dallardan) birleştirdiğiniz yeni bir C dalı yaratırdım. Özellik dalı B'deki değişiklikleri gerçekleştirin, ardından bunları artık yapı geliştirmelerini ve özellik dalı değişikliklerini içeren C dalında birleştirin, böylece bunları birlikte test edebilirsiniz. Daha fazla değişiklik yapmanız gerekiyorsa, bunu C yerine uygun dalda yapın, sonra C ile birleştirin. Bu nedenle, C dalında hiçbir şeyi değiştirmeyin, yalnızca diğer dallardaki değişiklikleri entegre etmek için kullanın.

Bu, kirli bir ağaçta taahhüt edilmemiş değişikliklerle uğraşmak yerine, C dalındaki Git'in tüm özelliklerini kullanabileceğiniz anlamına gelir.


Şunun için UseCase cherry-pick -n: Rastgele yerlere birçok şey ekleyerek kodumun çalışan bir kopyasını oluşturdum. Şimdi bu özelliğin dalına bağlanmadan önce kodumu temizlemek istiyorum. Bu yüzden geçici bir şubeye geçiyorum, tüm değişiklikleri uyguluyorum. Devam eden özellik dalına geri dönün cherry-pick. Bunu yapmanın daha iyi bir yolu var mı?
Tejas Kale

6

Taahhütleri özenle seçebilmelisiniz (hemen taahhüt -netmekten kaçınmak için).


-n çalışmadı. Cherry-pick commit başarısız olduğu için -m seçeneği yok diyor.
Alejandro Sanz Díaz

5

Tam olarak anladığımdan% 100 emin değilim, ama benim durumumda, şubeler arasında fark yaması oluşturdum ve sonra bu yolu B dalına uyguladım.

A şubesi içi:

 git diff branchA..branchB > patch.diff
 git apply patch.diff

4

Gereksinimlerinizi anladığımdan emin değilim.

Birleştirme işlemini çalıştırabilir ve ardından arayabilirsiniz git reset HEAD~1.


Aşağıdaki sıra, arasındaki masterve branchAüzerindeki her kaydı yeniden oynatmalıdır branchB. Zaten uygulanmış olan kayıtlar branchBatlanacak.

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip

Bu, git'in istemediğim evreleme alanına dosyalar ekler. Ayrıca, yalnızca tüm dallar ana daldaki aynı işlemden dallara ayrıldığında iyi çalışıyor gibi görünüyor. Aksi takdirde, master..branchA aralığında olmayan farklar ortaya çıkar.
Björn Lindqvist

@ BjörnLindqvist: Hazırlanan --softalandaki değişiklikleri istemiyorsanız seçeneği kaldırın . Şubelerinizin nasıl kurulduğuna dair bir grafik çizebilir misiniz?
LeGEC
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.