git yerel sürümü uzak sürümle değiştir


148

Git'e yerel dosyamı yoksaymasını ve birleştirmeye ve çakışmaya neden olmadan uzak şubemden dosyayı almasını nasıl söyleyebilirim?


1
Simüle etmenin tüm olası yolları için bkz. SO answer " git komutu, bir dalı diğeri gibi yapmak için" . git merge -s their
VonC

Daha fazla ayrıntı vermeniz yararlı olacaktır. Tüm dosyaların içeriğini uzak daldan mı yoksa yalnızca bazı dosyalardan mı almak istiyorsunuz (yani bazı yerel sürümleri / değişiklikleri saklamak)? Saklamak istediğiniz yerel geçmişiniz var mı? (Yerel geçmişinizi zaten dahil etmiş başka şubeler veya depolar varsa bu önemli olabilir.) Yerel geçmişinizi korumak istiyorsanız, daha sonra ne yapmayı planlıyorsunuz? (Yerel geçmişe işaret eden bir etiket bırakabilir ve uzaktan kumandanızın sahip olduğu şubeye sıfırlayabilirsiniz veya "kendi etiketlerini birleştirmek isteyebilirsiniz").
Chris Johnsen

1
Ayrıca böyle bir iş parçacığı da var Yerel depo dalını tıpkı uzak depo KAFASI gibi sıfırla
mico

Yanıtlar:


169

Bu en güvenli çözümdür:

git stash

Artık çatışma korkusu olmadan istediğinizi yapabilirsiniz.

Örneğin:

git checkout origin/master

Uzaktan değişiklikleri ana şubeye dahil etmek isterseniz şunları yapabilirsiniz:

git reset --hard origin/master

Bu, "orijin / master" ı işaret etmek için dalınızı "master" yapar.


90
Bunun git stash; git fetch origin; git reset --hard origin/master
HEAD'ı ayıracağını belirtmek faydalı

10
Sanırım Mark Longair'in yorumu bu sorunun asıl cevabı

benim için en yararlı cevap oldu +1
Andres

Önce devlete nasıl dönülür git stash? git stash listboş.
Leo,

Sana sarılmak istiyorum
Uğur Kazdal

45

Soruyu şu şekilde anlıyorum: yukarıdan bir dosyanın (veya seçimin) içeriğini tamamen değiştirmek istiyorsunuz. Dizini doğrudan etkilemek istemezsiniz (bu nedenle her zamanki gibi add + commit'i kullanırsınız).

Basitçe yapın

git checkout remote/branch -- a/file b/another/file

Bunu kapsamlı alt ağaçlar için yapmak ve bunun yerine doğrudan dizini etkilemek istiyorsanız

git read-tree remote/branch:subdir/

Daha sonra (isteğe bağlı olarak) çalışma kopyanızı

git checkout-index -u --force

2
Bu tam olarak istediğim şeydi. Teşekkürler.
AutonomousApps

11

Anladığım kadarıyla, örneğin, yalnızca test amacıyla güncellediğiniz bir dosyayı yanlış kaydettiğinizdir. Ardından, "git status" komutunu çalıştırdığınızda dosya "Değiştirildi" olarak görünür ve bazı kötü sözcükler söylersiniz. Sadece eski sürümü geri istiyorsun ve normal çalışmaya devam ediyorsun.

Bu senaryoda sadece aşağıdaki komutu çalıştırabilirsiniz:

git checkout -- path/filename

10

Ben böyle "ana" (uzak / kökeni deposu) uzak dosya ödeme olurdu:

git checkout master <FileWithPath>

Örnek: git checkout ana bileşenleri / indexTest.html


Benim için bu gibi çalıştı "git ödeme uzaktan kumandalar / kökeni / usta <my-file>"
saravanakumar

4

Kullanın -sveya --strategykombine seçeneği -Xseçeneği. Özel sorunuzda, tüm uzak dosyaları tutmak ve aynı addaki yerel dosyaları değiştirmek istiyorsunuz.

Uzak sürümle çakışmaları değiştirme

git merge -s recursive -Xtheirs upstream/master  

çakışan tüm dosyaların uzak repo sürümünü kullanacaktır.

Çakışmaları yerel sürümle değiştirin

git merge -s recursive -Xours upstream/master

çakışan tüm dosyaların yerel repo sürümünü kullanacaktır.

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.