Yerel dosyaların üzerine yazmadan dosyaları uzaktan nasıl çekerim?


113

Önceden var olan bir uzak depoya yeni bir git deposu kurmaya çalışıyorum.

Yerel dosyalarımın uzak deponun üzerine yazmasını istiyorum, ancak git ilk önce bu uzak dosyaları içeri çekip birleştirmem gerektiğini söylüyor.

Çekmenin herhangi bir yolu var mı, ancak uzaktan kumanda tarafından yerel dosyaların üzerine yazılmadığından emin olun?

Yanıtlar:


182

Peki, evet ve hayır ...

Yerel kopyalarınızın uzaktan kumandadakileri "geçersiz kılmasını" istediğinizi anlıyorum, ama, adamım, eğer birisi uzak depodaki dosyaları farklı bir şekilde değiştirdiyse ve siz onların değişikliklerini görmezden gelerek "zorlamaya" çalışırsanız Olası çatışmalara bakmadan kendi değişiklikleriniz , peki, sizin (ve iş arkadaşlarınız) için ağlıyorum ;-)

Bununla birlikte, "doğru şeyi" yapmak gerçekten çok kolay ...

Aşama 1:

git stash

yerel deponuzda. Bu, yerel güncellemelerinizi zulaya kaydedecek, ardından değiştirilmiş dosyalarınızı düzenleme öncesi durumuna geri döndürecektir.

Adım 2:

git pull

değiştirilmiş sürümleri almak için. Şimdi, umarım bu, endişelendiğiniz dosyaların yeni sürümlerini almaz. Olmazsa, sonraki adım sorunsuz çalışacaktır. O takdirde yapar , o zaman yapmamız gereken işler var ve sen yaptın memnuniyet duyarız.

Aşama 3:

git stash pop

Bu, Adım 1'de sakladığınız değiştirilmiş sürümlerinizi Adım 2'de yeni çıkardığınız sürümlerle birleştirir. Her şey yolunda giderse, o zaman hazır olacaksınız!

Öte yandan, 2. Adımda yaptıklarınızla yaptığınız değişiklikler arasında gerçek çatışmalar varsa (bu arada başka birinin düzenlemesi nedeniyle), öğrenecek ve bunları çözmeniz söylenecektir. Yap.

İşler bu şekilde çok daha iyi yoluna girecek - sizi ciddi, ciddi sorunlar konusunda uyarırken muhtemelen sizin herhangi bir gerçek çalışma yapmadan değişikliklerinizi koruyacaktır.


5
neden sadece git commityerel değişiklikler değil git pull?
Don Cheadle

10
Bazen kodu işlemek istemediğim bir konumdayım, ancak onu yerel makinemde tutmak istiyorum, bu komutlar seti bunun için gerçekten yardımcı oluyor.
Vargan

3
Birden çok dosyanız varsa, bazılarının üzerine yazmak istediğiniz ve bazılarının üzerine yazmak istemediğinizde bu kullanışlı değildir. Çekme sırasında GIT'ye dosyaları göz ardı etmesini söylemenin bir yolu yok mu? .Gitignore neden sadece zorlamak için çalışıyor, bu tasarım kararını hiç anlamıyorum ...
Bobak Hashemi 10'16

25

Önce yerel değişikliklerinizi saklayabilir, ardından çekebilir ve ardından zulayı açabilirsiniz.

git stash
git pull origin master
git stash pop

Uzaktan yapılan değişiklikleri geçersiz kılan herhangi bir şey, manuel olarak çözmeniz gereken çakışmalara sahip olacaktır.


4
"Kaydedilecek yerel değişiklik olmadığını"
söylemesi

bence bu en iyi strateji.
Jimmy Obonyo Abor

13

Böylece yerel değişikliklerinizi yerel deponuza kaydetmiş olursunuz. Daha sonra yerel dosyalarınızda değişiklik yapmadan yerel deponuzda uzaktan değişiklikler yapmak için kullanabilirsiniz git fetch. Aslında git pulliki aşamalı bir işlemdir: tahribatsız ve git fetchardından a git merge. Bakın 'git çekme' ve 'git getirme' arasındaki fark nedir? daha fazla tartışma için.

Ayrıntılı örnek:

Deponuzun böyle olduğunu varsayalım (değişiklikler yaptınız test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

Ve originarşiv şu şekildedir (başkası taahhüt etmiştir test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

Bu noktada git şikayet edecek ve test2uzak deponuzu zorlamaya çalışırsanız önce sizden çekmenizi isteyecektir . Yerel deponuzu değiştirmeden test1'in ne olduğunu görmek istiyorsanız, şunu çalıştırın:

$ git fetch

Sonuç yerel deponuz şöyle olacaktır:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

Artık başka bir dalda uzaktan değişiklikler var ve yerel dosyalarınızı sağlam tutuyorsunuz.

O zaman sırada ne var? (Bir git mergeöncekiyle git pullbirleştirildiğinde) ile aynı etkiye sahip olacak bir yapabilir git fetchveya tercih ettiğim gibi git rebase origin/master, değişikliğinizi üstüne uygulamak için bir yapabilirsiniz origin/master, bu size daha temiz bir geçmiş sağlar.


git
pull'ı
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.