İ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 Ave Baynı dosyalarla ama bazı dosyalarda farklı bir programlama arayüzü var. Şimdi, fiki 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 Bdosyası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ü Ave B:
git checkout A
git checkout --patch B f
İlk komut şubeye A, Bdosyanın sürümünü birleştirmek istediğim yere geçer f. İkinci komut , of file 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 .fHEADBBHEAD
Topluluk düzenleme : füzerindeki dosya henüz Bmevcut değilse seçeneği Akaldırın --patch. Aksi takdirde, "Değişiklik Yok" alırsınız. İleti.
git checkout --patch B -- fişe almak için kullanmak zorunda kaldım.
abasmak yerine etkileşimli aşamada basabileceğinizi eklemeniz yeterlidiry . Veya git checkout B -- fbunun 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.
Auzaklaş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
-pseç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