Git'i ve komut satırını kullanarak birleştirme sırasında yerel dosyayı veya uzak dosyayı nasıl saklayabilirim?


195

Vimdiff kullanarak değişiklik birleştirme biliyorum, ama, sadece tüm dosyanın tutmak veya atmak için iyi olduğunu varsayarsak, bunu nasıl yapabilirim?

Her biri için vimdiff açmak istemiyorum, 'yerel tut' veya 'uzak tut' yazan bir komut istiyorum.

EG: Değiştirilmiş olarak işaretlenmiş dosyalar ile birleştirme aldım, çünkü biri pencerenin altında açmış, EOL'yi değiştirmiş ve sonra işlemiş. Birleştirirken, sadece kendi versiyonumu korumak ve ondan vazgeçmek istiyorum.

Ayrıca tam tersine de ilgileniyorum: Büyük zamanımı mahvettim ve değişiklikleri kabul edip uzak dosyayı kabul etmek istiyorum.

Yanıtlar:


310

Siz de yapabilirsiniz:

git checkout --theirs /path/to/file

uzak dosyayı tutmak ve:

git checkout --ours /path/to/file

yerel dosya tutmak için.

Sonra git addonlar ve her şey yapılır.

Sürüm: Bunun bir mergesenaryo için olduğunu unutmayın . Bir rebase --theirsbaşvuru sırasında çalıştığınız şubeyi ifade eder.


4
Bunu yaptım .. ama hiçbir şey olmuyor .. doğru dosyayı aldığını nasıl bilebilirim? Bu önemliyse kullanıyorum git version 1.8.4.
Rosdi Kasım

3
neden ters kelime kullanılır? "Onların" uzak dosya ve "bizim" benim dosya olacağını
varsayalım

1
Yani, @ LưuVĩnhPhúc
Bekleyen Dev ...

7
hayır, anlamları ters çevrildi stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 onların dosyaları benim olacak ve bizimki uzak daldaki dosyalar
phuclv

6
"Kolay", evet. Sezgisel? Hayır.
Wilbur Whateley

109

Bu yaklaşım, her bir dosyayı ayrı ayrı seçmekten kaçınarak daha basit görünür:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

veya

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Doğrudan kopyalanan: Git birleştirme çakışmalarını, çekme sırasındaki değişikliklerinin lehine çözme


3
Bunu sevdim. Özellikle birden fazla dosya varsa.
Tek

Soru iki farklı komut içindi, ancak bu ikisinin ne yaptığına dair bir açıklama yok. Her satır ne yapar?
Alex

Bunu bulmadan önce en az beş stackoverflow yanıtından geçtim, istediğim buydu. Teşekkürler.
Bolton Bailey

14

git checkout {branch-name} -- {file-name}

Bu işlem, seçtiğiniz daldaki dosyayı kullanacaktır.

Bunu seviyorum çünkü posh-gitotomatik tamamlama bununla harika çalışıyor. Ayrıca, hangi şubenin uzak ve hangisinin yerel olduğu konusundaki belirsizlikleri de ortadan kaldırır. Ve --theirsyine de benim için çalışmadı.


Belirsizlik yok, hem {mine} hem de {onların} için çalışıyor, tüm dizinleri eklemeyi destekliyor. Bu kabul edilen cevap olmalı.
dotancohen

9

Satır sonu thingie için bakınız man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Windows klonunu eklediğinizden autocrlf = falseve / veya eklediğinizden emin olun safecrlf = false(.git / config)

Git mergetool kullanma

Böyle bir birleştirme aracı yapılandırırsanız:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Sonra basit

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

İşi yapacak

Basit git komutlarını kullanma

Diğer durumlarda, sanırım

git checkout HEAD -- path/to/myfile.txt

hile yapmalı

Tersini yapmak için düzenleyin (vidalandığınız için):

git checkout remote/branch_to_merge -- path/to/myfile.txt

+1 için ipuçları, ancak kabul edilmedi ama istediğim bu değil. Sadece örnek vakalarda değil, tüm durumlarda işe yarayan bir şey istiyorum. Artı "git checkout remote / branch_to_merge - yol / to / myfile.txt", birleştirme işleminizi zaten başlattıysanız çalışmaz: bir birleştirme işleminin ortasında olduğunuzu ve bunu engellemenizi engelleyecektir.
e-satis

1
@ e-satis: bu şaşırtıcı. Bir hata ile ödeme düzenli bir ödeme olmadığı için bir hata olduğunu düşünürdüm (ve HEAD etkilemez). Şimdi deneyeceğim çünkü inanamıyorum
17'de sehe

1
@ e-satis: Soooo ... Haklıydım; git checkout remote/branch_to_merge -- path/to/myfile.txtbirleşme çatışmasını çözerken bir cazibe gibi çalışır. (git 1.7.1)
sehe

1
Git Mergetool'a dayalı bir çözüm eklendi
Sehe
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.