Git Yerel Değişiklikleri Yoksayırken Çekin?


489

git pullHerhangi bir yerel dosya değişiklikleri dizini havaya uçurmadan ve bir yapmak zorunda yok sayar yapmak için bir yolu var mı git clone?


17
"Yoksay" ile "overwites" mi demek istediniz?
Cascabel

@Cascabel Tüm yerel değişiklikleri geri almak, tüm yerel işlemleri iptal etmek, tüm yerel yeni dosyaları ve dizinleri silmek, yerel olarak silinen tüm dosyaları ve dizinleri vb. Geri almak anlamına gelir rm -rf local_repo && git clone remote_url.
Victor

Yanıtlar:


820

Çekme işleminin yerel değişikliklerin üzerine yazmasını, birleştirme işlemini çalışan ağaç temizmiş gibi yapmak istiyorsanız, çalışma ağacını temizleyin:

git reset --hard
git pull

İzlenmemiş yerel dosyalar varsa, git cleanbunları kaldırmak için kullanabilirsiniz . Kullanım git clean -f, izlenmeyen dosyaları kaldırmak -dfizlenmeyen dosyaları ve dizinleri kaldırmak ve -xdfizlenmeyen veya göz ardı dosyaları veya dizinleri kaldırın.

Öte yandan yerel değişiklikleri bir şekilde saklamak istiyorsanız, çekmeden önce saklamak için saklamak, ardından daha sonra tekrar uygulamak için:

git stash
git pull
git stash pop

Değişiklikleri tam anlamıyla görmezden gelmenin bir anlamı olduğunu düşünmüyorum - çekmenin yarısı birleştirildi ve içeriğin taahhütlü sürümlerini getirdiği sürümlerle birleştirmesi gerekiyor.


4
Sonra ise git resetdosyalarınızın hâlâ uzak, salt farklı stackoverflow.com/questions/1257592/...
Albay Panik

3
Git şimdiye kadarki en tuhaf şey. Git reset --hard tamamlandı. Sonra git durumu: Şubeniz 2 taahhüt öndedir.
Mart'ta

21
@shailenTJ "Yerel değişiklikler" burada taahhüt edilen değişiklikler değil, yerel taahhütler anlamına gelir. git reset --hardikincisini değil ikincisini etkiler. Uzaktan kumandanın durumuna tamamen sıfırlamak istiyorsanız, git reset --hard origin/<branch>ancak sıklıkla ve bu durumda, menşei ilerisinde olduğunuz bu iki taahhüt atmak istediğiniz bir şey değil, yaptığınız iştir.
Cascabel

2
Yani bu yerel depoyu yok etmek ve yeniden indirmekle aynı şey, değil mi? Sadece kolaylık sağlamak için çekme ve üzerine yazma değişikliklerini zorlamak istiyorum. Zaman zaman% 99 yanlışlıkla yerel olarak bir şey berbat ve sadece repo baştan başlamak istiyorum bu hata iletisini alıyorum.
sudo

Yerel bir değişikliğe karşı muhatap olamıyorsanız ne olur? Örneğin, repo büyük / küçük harfe duyarlı bir dosya sisteminde yapılmıştır ve büyük / küçük harfe duyarlı olmayan bir dosya sistemine kopyalanmıştır ve aynı ada sahip 2 dosya farklı kasaya sahiptir?
xster

305

Benim için aşağıdakiler işe yaradı:

(1) Önce tüm değişiklikleri getir:

$ git fetch --all

(2) Ardından master'ı sıfırlayın:

$ git reset --hard origin/master

(3) Çekme / güncelleme:

$ git pull

22
Üst cevap ile ilgili bir sürü sorun vardı benim için harika çalıştı. Teşekkürler!
0x0

6
Bu bile u yerel değişiklikleri taahhüt
ettikten

16
Bu en iyi cevap olmalı :)
Purus

5
@Marco Servetto: Önce tüm git değişikliklerinizi alırsınız, ancak henüz uygulama. Daha sonra master'ı son duruma sıfırlarsınız (güncellenir). İlk adımı atlarsanız, değişiklikleri eski master'a (yerel) geri döndürürsünüz. Deneyimlerime göre, tarif ettiğim gibi, asla sorun yaratmaz. Diğer tüm denemeler sonunda yapılır.
Artur Barseghyan

1
Bu benim için çalıştı, silinen dosyaları kurtarmak da dahil olmak üzere tüm yerel değişiklikleri görmezden gelmek istedim
Neri

28

Sadece tam olarak aynı sonucu veren bir komut istiyorsun rm -rf local_repo && git clone remote_url, değil mi? Ben de bu özelliği istiyorum. Git neden böyle bir komut ( git recloneveya gibi git sync) sağlamadığını merak ediyorum , ne svn böyle bir komut ( svn recheckoutveya gibi svn sync) sağlamaz .

Aşağıdaki komutu deneyin:

git reset --hard origin/master
git clean -fxd
git pull

Kaldırmak istediğiniz yerel taahhütleriniz olsa bile, gerçekten işe yarıyor.
Yuri Ghensev

5
Uyarı çocuklar !! git clean -fxddosyaları .gitignoreda kaldırır .
Ramesh Navi

@RameshNavi Tabii. Bu tam olarak istenen şey. İstenen, yeniden klonlamanın daha hızlı bir yoluna sahip olmak, yani tüm yerel repoyu silmek ve daha sonra klonlamaktır.
Victor

27

Körük komutu her zaman çalışmaz . Sadece yaparsanız:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

ve bunun gibi...

İçin gerçekten tüm yerel değişiklikleri thebranch indirme ve üzerine yazarak baştan başlamak, sadece yapın:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Bu işe yarayacak.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
EVET. Nihai "yerel olan hakkında bir F vermeyin" yaklaşımı için ihtiyacım olan buydu. Teşekkürler. :)
Adambean


8

Tüm yerel değişikliklerinizi bir "stash dosyasına" koymak ve son işleme geri dönmek için git stash'a bakın . Bu noktada, saklanan değişikliklerinizi uygulayabilir veya atabilirsiniz.


8

Linux'taysanız:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

For döngüsü, yerel depoda değiştirilen tüm izlenen dosyaları silecektir, bu nedenle git pullsorunsuz çalışacaktır.
Bununla ilgili en güzel şey, sadece izlenen dosyaların üzerine repodaki dosyalar tarafından yazılması, diğer tüm dosyaların dokunulmadan bırakılmasıdır.


Sanırım tam olarak ihtiyacım olan "izlenen dosyalar" demek istiyorsun, teşekkürler.
Ali

Powershell için eşdeğeri var mı?
Earlee

8

Bunu yapmanın en kısa yolu:

git pull --rebase --autostash

daha --autostashönce bilmiyordum , teşekkürler!
shiro

7

bu benim için çalıştı

git fetch --all
git reset --hard origin/master
git pull origin master

kabul edilen cevapla çakışma hataları alıyorum


Bu Artur Barseghyan'ın 2015 cevabına çok benziyor ... ama yine de 3. komutun amacının ne olduğunu bilmek istiyorum: çalışma dosyaları 2. komuttan sonra değişti ve 3. komut "Zaten güncel "
mike kemirgen

bu benim ortamımda çalışan tek kombinasyon, belki farklı bir şey görüyorsun, benim için üç komuta ihtiyacım vardı
Pablo Pazos

İlginç. Versiyon olabilir. Git 2.7.4'teyim. Ama ayrıca Artur Barseghyan'dan yeni bir yorum gördüm: "Aksi takdirde kendinizi yanlışlıkla eskimiş bir usta üzerinde çalışırken bulabilirsiniz."
mike kemirgen

belki, ama söyleyebileceğim tek şey "bu başka bir çözüm olmadığında benim için çalıştı", bu yüzden başkalarına yardımcı olabilir
Pablo Pazos


2

Bu, geçerli dalı getirecek ve ustalaşmak için bir hızlı ileri almaya çalışacaktır:

git fetch && git merge --ff-only origin/master

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.