İki dalım (A ve B) var ve A dalından tek bir dosyayı B Dalından karşılık gelen tek bir dosyayla birleştirmek istiyorum.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
İki dalım (A ve B) var ve A dalından tek bir dosyayı B Dalından karşılık gelen tek bir dosyayla birleştirmek istiyorum.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Yanıtlar:
Ben de aynı problemle karşılaştım. Kesin olmak gerekirse, iki şubem var A
ve B
aynı dosyalarla ama bazı dosyalarda farklı bir programlama arayüzü var. Şimdi, f
iki daldaki arayüz farklılıklarından bağımsız olan dosya yöntemleri dalda değiştirildi B
, ancak değişiklik her iki dal için de önemli. Böylece, sadece dosyayı birleştirmek için gereken f
şube B
dosyasına f
şube A
.
Bütün değişiklikler her iki branşta kararlı olduklarını varsayarsak basit bir komut zaten benim için sorun çözüldü A
ve B
:
git checkout A
git checkout --patch B f
İlk komut şubeye A
, B
dosyanın sürümünü birleştirmek istediğim yere geçer f
. İkinci komut , of f
ile dosyasını yamalar . Yamanın tek parçalarını bile kabul edebilir / atabilirsiniz. Yerine herhangi burada taahhüt belirtebilir, böyle olmak zorunda değildir .f
HEAD
B
B
HEAD
Topluluk düzenleme : f
üzerindeki dosya henüz B
mevcut değilse seçeneği A
kaldırın --patch
. Aksi takdirde, "Değişiklik Yok" alırsınız. İleti.
git checkout --patch B -- f
işe almak için kullanmak zorunda kaldım.
a
basmak yerine etkileşimli aşamada basabileceğinizi eklemeniz yeterlidiry
. Veya git checkout B -- f
bunun yerine komutu kullanın.
İşte bu durumlarda yaptığım şey. Bu bir çamur ama benim için iyi çalışıyor.
Yamalamayı denedim ve durumum bunun için çok çirkindi. Kısacası şöyle görünecektir:
Çalışma Dalı: Bir Deney Dalı: B (katlamak istediğim değişiklikleri içeren file.txt dosyasını içeriyor.)
git checkout A
A temelli yeni şube oluşturun:
git checkout -b tempAB
B'yi tempAB ile birleştir
git merge B
Birleştirmenin sha1 karmasını kopyalayın:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Çalışma şubenizi kontrol edin:
git checkout A
Düzeltilen dosyanızı kontrol edin:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Ve işte buna sahip olmalısınız. Sonucunu taahhüt et.
A
uzaklaşmıştır B
. Kopyalama bu farklılıkların üzerine yazılacaktır.
Bu git'in dahili diftoolünü kullanır. Belki küçük bir iş ama doğrudan ileri.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(Boş bağımsız değişken etiketi) kullanımını açıklığa kavuşturmak için git checkout docs: ARGUMENT DISAMBIGUATION şunu söylüyor: " git checkout -- <pathspec>
bu yolları dizinden çıkarmak istiyorsanız kullanın." Bunun nedeni, aynı ada sahip bir dalınız ve bir dosya / yolunuz olabilir. Bu gibi durumlarda, sizden her ikisi de mevcut olduğunda dalın veya yolun kontrol edilmesi gerekip gerekmediğini netleştirmek istemiyorsanız, git varsayılan olarak dalı ödemeyi seçer. Bununla birlikte, --
önekliler git yerine dosya / yolu kullanıma alır.
Bu yaklaşımı basit ve kullanışlı buldum: Başka bir şubeden belirli dosyaları "birleştirmek"
Anlaşıldığı gibi, çok çalışıyoruz. İyi arkadaşımız git checkout, iş için doğru araçtır.
git checkout source_branch <paths>...
Git checkout'a A özellik dalının adını ve ana dalımıza eklemek istediğimiz belirli dosyaların yollarını verebiliriz.
Daha fazla anlayış için lütfen makalenin tamamını okuyun
-p
seçeneği kullanmak istedin. Daha sonra, çalışma ağacı dosyanızda, yama değişikliklerinden önce maalesef, kontrolünüzden daldan ayrılmış olan bölümlerin üzerine yazılır.
Kullanabilirsin:
git merge-file
İpucu: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
git merge-file
Aşağıdaki komut (1) doğru dalın dosyasını karşılaştırır, ana (2) etkileşimli olarak hangi değişikliklerin uygulanacağını sorar.
git checkout --patch master
Düzenlemem reddedildi, bu yüzden uzak bir daldan birleştirme değişikliklerini nasıl ele alacağımı ekliyorum.
Bunu yanlış birleştirme işleminden sonra yapmanız gerekirse, şöyle bir şey yapabilirsiniz:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
Mevcut dalın B olduğunu varsayarsak:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Bunun yalnızca yerel dosyadaki değişiklikler için geçerli olduğunu unutmayın. Daha sonra taahhütte bulunman gerekecek.
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Birleştirmek için dosyanın eski sürümüne göz atabilir, farklı bir ad altında kaydedebilir, ardından iki dosyada birleştirme aracınız ne olursa olsun çalıştırabilirsiniz.
Örneğin.
git show B:src/common/store.ts > /tmp/store.ts
(burada B, şube adı / taahhüt / etikettir)
meld src/common/store.ts /tmp/store.ts
Olarak yapacağım
git format-patch branch_old..branch_new file
bu dosya için bir yama oluşturur.
Hedef branch_old'a yama uygula
git am blahblah.patch