Git şubelerinden belirli dosyalar nasıl birleştirilir


179

2 git şube branch1 ve branch2 var ve branch2 dosya.py branch1 dosya.py içine dosya ve sadece bu dosya birleştirmek istiyorum.

Özünde, branch1'deki file.py üzerinde çalışmak istiyorum ancak birleştirme komutundan yararlanmak istiyorum. Bunu yapmanın en iyi yolu nedir?



Yanıtlar:


207

İçerik olduğunda file.pygelen Branch2 için geçerlidir artık edilir branch1 , bazı değişiklikler toplama ve diğerlerini bırakarak gerektirir. Tam kontrol için --patchanahtarı kullanarak etkileşimli birleştirme yapın :

$ git checkout --patch branch2 file.py

Kullanılacak git-add(1)tuşları açıklamak için kılavuz sayfasındaki etkileşimli mod bölümü :

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk nor any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk nor any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

Bölme komutu özellikle kullanışlıdır.


3
Yamayı nasıl kullanabiliriz ve aynı zamanda bir birleştirme aracı kullanabilir miyiz? önemli şeyler yerine
Gabriel

@Gabriel Git'i yama dosyaları ve tarball'larla bile kullandım çünkü bir repo ( git init <dir>) oluşturmak ve sonunda atmak ( ) çok kolay rm -r <dir>.
pdp

105

Birleştirme olmamasına rağmen , bazen başka bir daldaki başka bir dosyanın tüm içeriğine ihtiyaç duyulur. Jason Rudolph blog yazısı dosyaları bir şubeden diğerine kopyalamak için basit bir yol sağlar. Tekniği aşağıdaki gibi uygulayın:

$ git checkout branch1 # ensure in branch1 is checked out and active
$ git checkout branch2 file.py

Şimdi file.pyartık branch1 .


91
Kolay, ama bu aslında bir birleşme değil . Sadece file.pyşube 2'de ne varsa üzerine
yazıyor

Dosyayı branch1'den branch2'ye geri birleştirirseniz ne olur? Çatışma olacak!
Amir

Bu, tarih tutmaya devam ediyor mu?
C2H50H

18

Diğer geçerli yanıtların hiçbiri sanki birleştirme komutunu kullanıyormuşsunuz gibi dosyaları "birleştirmez". (En iyi ihtimalle onlar elle diffs seçmenizi gerek duyarız.) Aslında ortak bir atadan gelen bilgiler kullanılarak birleştirilmesi yararlanmak istiyorsanız, bulunan birine dayanarak bir prosedür takip edebilirsiniz "Gelişmiş birleştirme" bölümünde GYTE Başvuru Kılavuzu.

Bu protokol için, 'path / to / file.txt' dosyasını origin / master'dan HEAD'e birleştirmek istediğinizi varsayıyorum - uygun şekilde değiştirin. (Deponuzun üst dizininde olmanız gerekmez, ancak yardımcı olur.)

# Find the merge base SHA1 (the common ancestor) for the two commits:
git merge-base HEAD origin/master

# Get the contents of the files at each stage
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show HEAD:path/to/file.txt > ./file.ours.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt

# You can pre-edit any of the files (e.g. run a formatter on it), if you want.

# Merge the files
git merge-file -p ./file.ours.txt ./file.common.txt ./file.theirs.txt > ./file.merged.txt

# Resolve merge conflicts in ./file.merged.txt
# Copy the merged version to the destination
# Clean up the intermediate files

git merge-file , biçimlendirme ve benzerleri için tüm varsayılan birleştirme ayarlarınızı kullanmalıdır.

Ayrıca, "bizimkinin" çalışan kopya sürümü ise ve aşırı derecede dikkatli olmak istemiyorsanız, doğrudan dosya üzerinde çalışabileceğinizi unutmayın:

git merge-base HEAD origin/master
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt
git merge-file path/to/file.txt ./file.common.txt ./file.theirs.txt

15

Tüm değişiklikler Are file.pyiçinde branch2kendi kaydedilmesini diğer dosyalara değişiklikler ayrı,? Öyleyse, sadece cherry-picküzerindeki değişiklikleri yapabilirsiniz :

git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>

Aksi takdirde, mergesiz de sadece yaratabilir ... fazla bireysel yolları çalışmaz git diffait yama file.pygelen değişikliklere branch2ve git applyonları için branch1:

git checkout branch2
git diff <base-commit-before-changes-to-file.py> -- file.py > my.patch
git checkout branch1
git apply my.patch

8

Şunları yapabilirsiniz stashve stash popdosya:

git checkout branch1
git checkout branch2 file.py
git stash
git checkout branch1
git stash pop

Bu işlem, branch1 / file.py dosyasının çözümlenecek birleştirme çakışmasını yükseltmesi gereken birleştirme yerine branch2 / file.py içeriğinin üzerine yazar.
plumSemPy

2

Yalnızca branş2'deki değişiklikleri birleştirmek file.pyiçin diğer değişiklikleri iptal edin.

git checkout -B wip branch2
git read-tree branch1
git checkout branch2 file.py
git commit -m'merging only file.py history from branch2 into branch1'
git checkout branch1
git merge wip

Birleştirme asla başka bir dosyaya bakmaz. Ağaçlar yeterince farklıysa kasaları '-f' yapmanız gerekebilir.

Bunun, branch1'i, branch2'nin tarihindeki o noktaya kadar olan her şeyin birleştirilmiş gibi göründüğünü unutmayın; bu, istediğiniz şey olmayabilir. Yukarıdaki ilk kasanın daha iyi bir sürümü muhtemelen

git checkout -B wip `git merge-base branch1 branch2`

bu durumda taahhüt mesajı muhtemelen

git commit -m"merging only $(git rev-parse branch2):file.py into branch1"

0

Aynı durumdayım, 2 şubede çok fazla taahhüt bulunan bir şubeden bir dosyayı birleştirmek istiyorum. Yukarıda birçok yol denedim ve diğer internette buldum ve hepsi başarısız oldu (çünkü taahhüt geçmişi karmaşık olduğu için) yolumu yapmaya karar verdim (çılgın yol).

git merge <other-branch>
cp file-to-merge file-to-merge.example
git reset --hard HEAD (or HEAD^1 if no conflicts happen)
cp file-to-merge.example file-to-merge

0

Yaptığım şey biraz manuel, ama ben:

  1. Dalları normal olarak birleştirdi; İle birleştirmeyi geri döndürdürevert ;
  2. İçin tüm dosyalarıma göz at HEAD~1Birleştirme işlemindeki , yani durumlarına baktım;
  3. Bu hackeriyi taahhüt tarihinden gizleme taahhüdümü geri aldım.

Çirkin? Evet. Hatırlaması kolay? Ayrıca evet.

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.