SORU
30 Mayıs 2009, CUMARTESİ


Nasıl gıt hep çelişkide birleştirmesi için benim yerel sürümünü seçmek için söyle belirli bir dosyada mı?

Git deposu üzerinden birileri ile işbirliği olduğumu söylüyor, ben asla herhangi bir dış değişiklikleri kabul etmek için istediğiniz belirli bir dosya var.

Beni şikayet etmek için değil benim yerel repo kurmak için herhangi bir şekilde bir kafam gıt her zaman çekme birleştirme var mı? Bu dosyayı birleştirirken her zaman benim yerel sürümünü seçmek için istiyorum.

CEVAP
30 Mayıs 2009, CUMARTESİ


Bir yapılandırma dosyası belirli örneği, Ron's answer ile aynı fikirdeyim:
bir yapılandırma olmalıdır "özel" çalışma (dolayısıyla "", ".gitignore Bir dosya olarak ilan edildi"). göz ardı
Bir yapılandırma dosyası olabilirşabloniletokenized değerleribu, bir komut dosyası config.template (göz ardı) özel bir yapılandırma dosyası bu dosya dönüştürme.


Ancak, belirli bir açıklama daha genel daha geniş bir soruya ne cevap vermez, yani soru(!):

Nasıl gıt hep çelişkide birleştirmesi için benim yerel sürümünü seçmek için söyle belirli bir dosyada mı ?(dosya herhangi bir dosya ya da grup için)

Birleştirme bu tür bir "" her zaman kopyalayacak olan, 'bizim' ya da 'onların' bir çatışma olduğunda. bir dosyanın sürüm kopya birleştirme

(Brian Vandenberg notlar in the comments,'ours' ve '14* *' burada bir birleştirme için kullanılır.
Onlartersinebir içinrebase: "Why is the meaning of “ours” and “theirs” reversed with git-svn" rebase kullanan, , "git rebase, keeping track of 'local' and 'remote'") . bakın

"(Bir dosya genel olarak konuşursak, bir" config "kötü bir örnek olduğu için dosyası), özel bir komut ile birleştirir adlı bu elde eder." bir dosya için
Git bir tanımlamak zorunda kalacak, çünkü bu komut arayacak bir tanımlayan gitattributes value,özel sürücü birleştirme.

"Özel sürücü birleştirme", bu durumda, temelde değişmeden geçerli sürümü, bu yüzden her zaman yerel sürümünü seçmek için izin tutacak çok basit bir betik.


Hadi basit bir senaryoda, sadece bir MS-DOS oturumu: Windows msysgit bir 1.6.3 ile test

cd f:\prog\git\test
mkdir copyMerge\dirWithConflicts
mkdir copyMerge\dirWithCopyMerge
cd copyMerge
git init
Initialized empty Git repository in F:/prog/git/test/copyMerge/.git/

Şimdi, diyelim ki çakışmalar olur, her ikisi de, ama farklı birleştirilecek olan iki dosya olun.

echo a > dirWithConflicts\a.txt
echo b > dirWithCopyMerge\b.txt
git add -A
git commit -m "first commit with 2 directories and 2 files"
[master (root-commit) 0adaf8e] first commit with 2 directories and 2 files

""İki farklı gıt dallar: hem bu dosyaların içeriği . bir çatışma tanıtacağız

git checkout -b myBranch
Switched to a new branch 'myBranch'
echo myLineForA >> dirWithConflicts\a.txt
echo myLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in myBranch"
[myBranch 97eac61] add modification in myBranch

git checkout master
Switched to branch 'master'
git checkout -b hisBranch
Switched to a new branch 'hisBranch'
echo hisLineForA >> dirWithConflicts\a.txt
echo hisLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in hisBranch"
[hisBranch 658c31c] add modification in hisBranch

Şimdi, diyelim ki birleştirmek için deneyin"""",: . myBranch üzerine hisBranch

  • çelişkili birleştirmesi için manuel çözüm
  • hariçben her zaman tutmak istediğiniz dirWithCopyMerge\b.txt içinbenimb.txt sürüm.

Yana birleştirme 'MyBranch', geri dönün ve Ekle 'gitattributes' birleştirme davranışı özelleştirebilirsiniz hangi direktifleri. olacağız oluşur

git checkout myBranch
Switched to branch 'myBranch'
echo b.txt merge=keepMine > dirWithCopyMerge\.gitattributes
git config merge.keepMine.name "always keep mine during merge"
git config merge.keepMine.driver "keepMine.sh %O %A %B"
git add -A
git commit -m "prepare myBranch with .gitattributes merge strategy"
[myBranch ec202aa] prepare myBranch with .gitattributes merge strategy

Biz bir .gitattributes dosya tanımlanan dirWithCopyMerge dizin (tanımlı sadece şube nerede birleşecek oluşur: myBranch) ve .git\config dosya şimdi içeren bir sürücü birleştirme.

[merge "keepMine"]
        name = always keep mine during merge
        driver = keepMine.sh %O %A %B

Eğer Henüz neyse birleştirme keepmine.sh ve fırlatma tanımlarsanız, burada ne olsun.

git merge hisBranch
sh: keepMine.sh: command not found
fatal: Failed to execute internal merge
git st
# On branch myBranch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   dirWithConflicts/a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

type dirWithConflicts\a.txt
a
<<<<<<< HEAD:dirWithConflicts/a.txt
myLineForA
=======
hisLineForA
>>>>>>> hisBranch:dirWithConflicts/a.txt

Sorun:

  • a.txt birleştirilmek için hazır ve çatışma vardır
  • *32 sabit sürücü (ve dizini* 33 *dosyasındaki yönergesi nedeniyle) dikkat çekmek gerekiyordu birleştirme beri dokunulmamış.

keepMine.sh %PATH% (ya da $PATH Unıx arkadaşımız için. senin herhangi bir yerde Define Her ikisi de elbette var: Sanal bir oturum) Ubuntu oturumu var

keepMine.sh

# I want to keep MY version when there is a conflict
# Nothing to do: %A (the second parameter) already contains my version
# Just indicate the merge has been successfully "resolved" with the exit status
exit 0

(basit bir birleştirme sürücüsü oldu ;) )
Eğer başka bir sürümünü kullanmaya devam etmek istiyorsan (sadece exit 0 satırından önce ekleyin:
cp -f $3 $2.
İşte bu kadar. Sürücü uzağa sürümü diğer şubeden gelmesini, ağır basan herhangi bir yerel değişiklik) birleştirme

Şimdi yeniden denemek için izin en baştan birleştirme:

git reset --hard
HEAD is now at ec202aa prepare myBranch with .gitattributes merge strategy

git merge hisBranch
Auto-merging dirWithConflicts/a.txt
CONFLICT (content): Merge conflict in dirWithConflicts/a.txt
Auto-merging dirWithCopyMerge/b.txt
Automatic merge failed; fix conflicts and then commit the result.

Birleştirme başarısız olursadece a.txt için.
A.txt düzen ve hat izni'',: . hisBranch

git add -A
git commit -m "resolve a.txt by accepting hisBranch version"
[myBranch 77bc81f] resolve a.txt by accepting hisBranch version

B.txt bu sırasında muhafaza edildiğini kontrol edelim birleştirme

type dirWithCopyMerge\b.txt
b
myLineForB

Son temsil ediyor işlemektambirleştirme:

git show -v 77bc81f5e
commit 77bc81f5ed585f90fc1ca5e2e1ddef24a6913a1d
Merge: ec202aa 658c31c
git merge hisBranch
Already up-to-date.

(Çizgi Birleştirme ile başlayan kanıtlamak)


Tanımlamak, birleştirmek ve ya sürücü, Gıt gibi/üzerine birleştirebilirsiniz göz önünde bulundurun:

  • inceleyin <dir>/.gitattributes söz konusu yol ile aynı dizinde (): dizin .gitattributes diğeri üzerine galip gelecektir
  • Sonra .gitattributes üst dizin olan) inceler, sadece yönergeleri kümesi değilse zaten koyacaktır
  • Sonunda $GIT_DIR/info/attributes inceler. Bu dosyada-ağaç ayarları geçersiz kılmak için kullanılır. <dir>/.gitattributes direktifleri üzerine yazılır.

.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kev5124

    kev5124

    9 Kasım 2008
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011
  • Tinkernut

    Tinkernut

    28 Aralık 2006