“Git pull” i yerel dosyaların üzerine yazmaya nasıl zorlarım?


7183

Üzerindeki yerel dosyaların üzerine yazmayı nasıl zorlarım git pull?

Senaryo aşağıdaki gibidir:

  • Bir ekip üyesi üzerinde çalıştığımız bir web sitesinin şablonlarını değiştiriyor
  • Görüntüler dizinine bazı resimler ekliyorlar (ancak kaynak kontrolü altında eklemeyi unutuyorlar)
  • Görüntüleri daha sonra bana posta ile gönderiyorlar
  • Görüntüleri kaynak denetimi altına ekliyorum ve diğer değişikliklerle birlikte GitHub'a aktarıyorum
  • Git dosyalarının üzerine yazmak istemediği için GitHub'dan güncelleme alamazlar.

Bu hata alıyorum:

hata: İzlenmeyen çalışma ağacı dosyasının 'public / images / icon.gif' birleştirme ile üzerine yazılır

Git'i bunların üzerine yazmaya nasıl zorlarım? Kişi bir tasarımcı - genellikle, tüm çatışmaları elle çözüyorum, bu yüzden sunucu sadece bilgisayarlarında güncellemeleri gereken en son sürüme sahip.


17
bunu okuyan herkes dosyaları kaybedebileceğini düşünüyor, bu pozisyondaydım ve Yüce Metin arabelleğinin beni kurtardığını gördüm - bir şey üzerinde çalışıyorsam, buna benzer bir sorunu çözmeye çalışarak veya kullanarak her şeyi yanlışlıkla sil Bu soruya bir cevap ve Sublime'da dosyaları açmış (ki bu iyi bir şans var) o zaman dosyalar hala orada olacak ya da geri alma tarihinde Sublime olacak
Toni Leigh

62
git reset --hard origin/branch_to_overwrite
Andrew Atkinson

1
temel olarak, sadece ilk ödeme -b sonra geliştirme bir çekme yapın. işini yap, sonra içeri it.
ldgorman

1
Kısa cevap: dalı silin ve yeniden oluşturun. 1. Şube silin: git branch <branch> -D2. Çatışmadan önce bir taahhüdüne sıfırlayın: git reset <commit> --hard3. Şube yeniden oluşturun: git branch <branch>4. İzlemeyi sunucuya ayarlayın: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`
Nino Filiu

1
Tüm CRLF'yi LF sonlarına değiştirmek için (temizlemeye başla)git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
Chloe

Yanıtlar:


10034

Önemli: Yerel değişiklikleriniz varsa bunlar kaybolur. --hardSeçenekli veya seçeneksiz olarak, itilmemiş yerel taahhütler kaybolacaktır. [*]

Eğer herhangi bir dosya varsa değil Git (örneğin yüklenen kullanıcı içeriği) tarafından izlenen, bu dosyalar etkilenmeyecektir.


Bence bu doğru yol:

git fetch --all

Sonra iki seçeneğiniz var:

git reset --hard origin/master

VEYA Başka bir şubedeyseniz:

git reset --hard origin/<branch_name>

Açıklama:

git fetch hiçbir şeyi birleştirmeye veya yeniden pazarlamaya çalışmadan uzaktan en son sürümü indirir.

Ardından git resetana dalı yeni getirdiğiniz şeye sıfırlar. Bu --hardseçenek, çalışma ağacınızdaki tüm dosyaları,origin/master


Mevcut yerel taahhütleri koru

[*] : masterSıfırlamadan önce bir şube oluşturarak mevcut yerel taahhütleri sürdürmenin mümkün olduğunu belirtmek gerekir :

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Bundan sonra, tüm eski taahhütler saklanacaktır new-branch-to-save-current-commits.

Taahhüt edilmemiş değişiklikler

Ancak, taahhüt edilmemiş değişiklikler (aşamalı olarak bile) kaybedilecektir. İhtiyacınız olan her şeyi sakladığınızdan ve taahhüt ettiğinizden emin olun. Bunun için aşağıdakileri çalıştırabilirsiniz:

git stash

Ve sonra bu taahhüt edilmemiş değişiklikleri yeniden uygulamak için:

git stash pop

14
Dikkat et! Yerel unpushed taahhütleriniz varsa, bu onları şubenizden kaldıracaktır! Bu çözüm, depodaki dosyaları bozulmamış halde tutar, ancak diğer her şeyin üzerine yazar.
Matthijs P

479
Bu popüler bir soru, bu yüzden en üstteki yorumda açıklığa kavuşturmak istiyorum. Bu cevapta açıklandığı gibi komutları çalıştırdım ve TÜM yerel dosyaları kaldırmadı. Yalnızca uzaktan izlenen dosyaların üzerine yazılmıştır ve burada bulunan her yerel dosyaya dokunulmamıştır.
Kırmızı

14
uzak şube adı "master" dan farklı olan bir git reset --hard origin/branch-name
repodan çekiyorsanız

97
Bu soru ve cevap için upvotes miktarı göz önüne alındığında, git gibi bir komut içermesi gerektiğini düşünüyorumgit pull -f
Sophivorus

7
Donanımdan sıfırlamadan önce itilmeyen komutlar, git reflogtüm taahhütleri listeleyen, ayrıca temelsiz olanlar kullanılarak kurtarılabilir . Yerel kopyanızı kullanarak temizleyene kadar git gc, hepsi kaybolur
Koen.

933

Bunu dene:

git reset --hard HEAD
git pull

İstediğinizi yapmalı.


16
Bunu yaptım ve artık repoda olmayan bazı yerel dosyalar diskte kaldı.
Piotr Owsiak

26
Bunun doğru olduğunu düşünmüyorum. yukarıdakiler, birleştirme işlemini gerçekleştirir, üzerine yazılmayan sorguyu sorar: "Git üzerine yazılmaya nasıl zorlanır?" Cevabım yok, şu anda arıyorum ... şu anda ben "git checkout BranchWithCodeToKeep" tutmak istediğiniz kod ile şubeye geçmek, sonra "git branch -D BranchToOverwrite" ve sonra nihayet "git checkout -b BranchToOverwrite". artık birleştirme yapmak zorunda kalmadan BranchToOverwrite dalındaki BranchWithCodeToKeep kodunun tam koduna sahip olacaksınız.
felbus

252
'git pull' kullanarak birleştirmek yerine git fetch --all ardından 'git reset --hard origin / master'
Lloyd Moore

5
Evet, @lloydmoore çözümü benim için çalıştı. Sadece bir yorum değil, bir cevap olarak yapabilirdi.
Max Williams

2
Bu, mevcut değişiklikleri çekilen son şube taahhüdüne sıfırlar. Ardından git pull, en son şubedeki değişiklikleri birleştirir. Bu tam olarak ne yapmak istediğini yaptı .. Teşekkürler!
Codeversed

459

UYARI: git cleanizlenmeyen tüm dosyalarınızı / dizinlerinizi siler ve geri alınamaz.


Bazen clean -fyardımcı olmaz. İzlenmeyen DIRECTORIES'niz varsa, -d seçeneği de gereklidir:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

UYARI: git cleanizlenmeyen tüm dosyalarınızı / dizinlerinizi siler ve geri alınamaz.

Önce -n( --dry-run) bayrağını kullanmayı düşünün . Bu, hiçbir şeyi silmeden nelerin silineceğini gösterir:

git clean -n -f -d

Örnek çıktı:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

33
Harika ... Bu benim dotfiles repo karşı koştu ... benim ev dizininde. Orada gerçekten önemli bir şeyim yok ...
Lauri

7
Bence senaryo açıklaması, içeriği gerçekten atmak istemediğini açıkça ortaya koyuyor. Bunun yerine, dosyaların üzerine yazarken git baulking'i durdurmak istiyor. @ Laura, bu senin başına gelmemeliydi. Ne yazık ki insanlar senaryo açıklamasının özünü yanlış anlamış görünüyor - önerime bakın.
Hedgehog

19
Nihayet . git clean -f -d her şeyi temizleyemediğinde temiz olur.
earthmeLon

7
@crizCraig eklenmedikçe.gitignore
Kanama Parmaklar

5
@earthmeLon, bunun için isteyebilirsiniz git clean -dfx. -xYoksaydıklarınız .gitignore. Genellikle yapı ürünleriniz .gitignore olacaktır.
Paul Draper

384

Kirpi gibi bence cevaplar korkunç. Ama Kirpi'nin cevabı daha iyi olsa da, bunun olabildiğince zarif olduğunu düşünmüyorum. Bunu bulduğum yol, tanımlanmış bir stratejiyle "getirme" ve "birleştirme" kullanmaktır. Bu, yerel değişikliklerinizin üzerine yazmaya zorladığınız dosyalardan biri olmadığı sürece korunmasını sağlar.

İlk önce değişikliklerinizi yapın

 git add *
 git commit -a -m "local file server commit message"

Ardından değişiklikleri getirin ve bir çakışma varsa üzerine yazın

 git fetch origin master
 git merge -s recursive -X theirs origin/master

"-X" bir seçenek adıdır ve "onların" da bu seçeneğin değeridir. Bir çakışma olması durumunda "sizin" değişiklikleriniz yerine "onların" değişikliklerini kullanmayı tercih edersiniz.


56
Bu şimdiye kadar gördüğüm en iyi cevap. Bunu denemedim, ancak diğer cevapların aksine, bu, izlenmeyen dosyalarınızı nükleer silahlara atmaya çalışmaz, bu da bariz nedenlerden dolayı çok tehlikelidir.
huyz

5
Ditto - Bu, benim sahip olduğum şeyin üstünde hepsini kabul etmek istediğim çok büyük bir birleştirme (GitHub çekme isteği) yaparken benim için çalıştı. İyi cevap! Benim durumumda son iki komut şuydu: 1) get fetch other-repo; 2)git merge -s recursive -X theirs other-repo/master
quux00

2
Bu, yerel dosyalarınızla değil, depo dosyalarıyla ilgili çakışmaların üzerine yazacaktır, değil mi?
Nathan F.

2
En iyi cevap. Kabul edilen en yüksek cevap, benim davamda müstakil kafamda bıraktı. Yerel ana şube ve ran geri anahtarlamalıgit merge -X theirs origin/master
petergus

2
Bu (mükemmel) cevapla ilgili sorun, tüm yerel dosyaları ekliyor olması, bazen istediğiniz şey olmayabilir. Sadece atlanan belirli dosyaları eklemek isteyebilirsiniz. Ancak bunun en iyi yanı, onu yapması gereken şeyi yapması - yerel olarak eklemektir. Aynı görüntü oldukları için muhtemelen -X stratejisine ihtiyacınız olmayacak. Aslında, ilk başta, sadece herhangi bir anormallik olup olmadığını öğrenmek ve eğer varsa, 'onların' her zaman doğru seçim olduğunu inceledikten sonra eklemeyi öneriyorum. Ama sonra paranoyak oluyorum.
Bob Kerns

279

Yapmak yerine:

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

Aşağıdakileri yapmanızı tavsiye ederim:

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

Başlangıç ​​/ ana dalı sıfırlayacaksanız tüm uzaktan kumandaları ve dalları getirmeye gerek yok mu?


3
Cevabınız, temsilciniz için ihtiyaç duyduğunuz şeydir. Sormalıyım, bu da izlenmemiş tüm dosyaları kaldırıyor mu?
Nicolas De Jay

5
Evet, temsilcimin çoğu buradan geliyor :) Bu ayrıca izlenmeyen tüm dosyaları da kaldıracak.
Unutmuştum

1
Bu diğer
yanıttaki

Bu, izlenmeyen dosyalarımı kaldırmadı; bu aslında beklediğim şey. Bazıları için olabilir, bazıları için değil mi?
arichards

İzlenmeyen dosyalar git reset tarafından etkilenmez4. Bunların da kaldırılmasını istiyorsanız git add ., önce yapıngit reset --hard
Johanneke

131

Görünüşe göre en iyi yol ilk yapmanın yolu:

git clean

İzlenmeyen tüm dosyaları silmek ve ardından her zamanki gibi devam etmek için git pull...


4
Aynı sorunu çözmek için "git clean" kullanmayı denedim, ancak çözmedi. git status "Dalınız ve" başlangıç ​​noktanız / kaptanınız "birbirinden ayrıldı, # ve her biri sırasıyla 2 ve 9 farklı taahhüde sahip." ve git pull yukarıdakine benzer bir şey söylüyor.
slacy

43
git clean oldukça künt bir enstrümandır ve saklamak isteyebileceğiniz birçok şeyi fırlatabilir. Git başarılı olana kadar şikayetçi olan dosyaları kaldırmak veya yeniden adlandırmak daha iyidir.
Neil Mayhew

2
Bunun genel olarak işe yaradığını düşünmüyorum. Temelde git git klonunu zorla git çekme yoluyla yapmanın bir yolu yok mu?
mathtick

10
@mathick:git fetch origin && git reset --hard origin/master
Arrowmaster

3
git cleaniyi cevap burada? Dosyaları kaldırmak mutlaka OP'nin istediği gibi değil. Silinmemesi için 'yerel dosyaların üzerine yazma' istediler.
JohnAllen

111

Uyarı, gitignore dosyanızda herhangi bir dizin / * girişi varsa dosyalarınızı kalıcı olarak siler.

Bazı cevaplar korkunç görünüyor. David Avsajanishvili önerisini takip ederek @Lauri'ye ne olduğu anlamında korkunç.

Aksine (git> v1.7.6):

git stash --include-untracked
git pull

Daha sonra saklanma geçmişini temizleyebilirsiniz.

Manuel olarak, tek tek:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Acımasızca, bir kerede:

$ git stash clear

Tabii ki sakladığınız şeye geri dönmek istiyorsanız:

$ git stash list
...
$ git stash apply stash@{5}

2
Hayır öyle düşünmüyorum. Stashing, taahhüt edilmeyen dosyaları ortadan kaldırır. Yukarıdakiler, git'in izlemediği dosyaları da taşır (saklar). Bu, uzaktan kumandaya eklenmiş, ancak makinenize henüz çekilmemiş ancak oluşturduğunuz (!) Dosyaların aşağı çekilmesini önler. Tamamlanmamış işi yok etmeden. Bu mantıklı mı?
Hedgehog

3
1.7.6'nız yoksa, tüm deponuzu --include-untrackedgeçici olarak- git addardından hemen saklayarak taklit edebilirsiniz .
nategood

3
Kirpi ile hemfikirim. Burada popüler cevapları yaparsanız, istemeden kaybetmek istemediğiniz birçok şeyi yanlışlıkla öldürdüğünüzü bulmanız daha olasıdır.
Guardius

1
Diğer izlenmemiş dosyalar vardı - birleştirme / çekme üzerine yazmak istedim yanı sıra, bu çözüm en iyi çalıştı. git stash applybirleştirme işleminin zaten oluşturduğu istisnalar dışında tüm izlenmemiş dosyalarımı geri getirdim: "zaten var, ödeme yok." Mükemmel çalıştı.
BigBlueHat

2
Bu en temiz cevaptır ve kabul edilen cevap olmalıdır. Bazı yazarak kaydetmek için kısa formu kullanabilirsiniz: git stash -u.
ccpizza

93

Bu komutu yerel değişiklikleri atmak için yararlı bulabilirsiniz:

git checkout <your-branch> -f

Ve sonra bir temizleme yapın (izlenmemiş dosyaları çalışma ağacından kaldırır):

git clean -f

İzlenmemiş dosyalara ek olarak izlenmemiş dizinleri kaldırmak istiyorsanız:

git clean -fd

Bence senaryo açıklaması, içeriği gerçekten atmak istemediğini açıkça ortaya koyuyor. Bunun yerine, dosyaların üzerine yazarken git baulking'i durdurmak istiyor. Önerime bakın.
Hedgehog

3
Bu cevap tam olarak açıklamaya uymasa da, beni yine de satır başı döndürme ile dönme hayal kırıklığından kurtardı (autocrlf false ile olay). Git reset --hard HEAD sizi değiştirilmiş dosyalarla "no" bırakmazsa, bu "-f" bayrakları oldukça faydalıdır. Çok teşekkürler.
Kellindil

88

İle birleşmek yerine şunu git pulldeneyin:

git fetch --all

bunu takiben:

git reset --hard origin/master.


61

Benim için işe yarayan tek şey:

git reset --hard HEAD~5

Bu sizi beş taahhüdü geri götürecek ve sonra

git pull

Bunu Git birleşmesinin nasıl geri alınacağına bakarak buldum .



Merhaba, aslında bu bir work aroundama gerçekten etkili bir numara . Bazı çakışmalarda bazı çakışmalar olabileceğinden, 5 taahhüdün geri alınması uzaktan kodla çakışma olmadığından emin olur.
Hoang Le

54

Tüm bu çözümlerle ilgili sorun, hepsinin çok karmaşık olması veya daha da büyük bir sorun olması, her zaman ihtiyaç duyulan yapılandırma dosyaları olduğu için istemediğimiz web sunucusundan izlenmeyen tüm dosyaları kaldırmasıdır. sunucuya gidin ve Git deposunda değil.

İşte kullandığımız en temiz çözüm:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • İlk komut en yeni verileri getirir.

  • İkinci komut, depoya eklenen dosyaların olup olmadığını kontrol eder ve izlenmeyen dosyaları yerel depodan çakışmalara neden olacak şekilde siler.

  • Üçüncü komut, yerel olarak değiştirilen tüm dosyaları denetler.

  • Son olarak, en yeni sürüme güncellemek için bir çekiş yapıyoruz, ancak bu sefer herhangi bir çakışma olmadan, çünkü repodaki izlenmemiş dosyalar artık mevcut değil ve yerel olarak değiştirilen tüm dosyalar zaten depodaki ile aynı.


Git git deposundan herhangi bir değişikliği aşağı çektiğiniz için "git pull" yerine son satır olarak "git merge origin / master" kullanılması (notunuzda söylediğiniz gibi) daha hızlı olacaktır.
Josh

1
Evet tabiki, git merge origin/master daha hızlı ve muhtemelen daha güvenli olacak. Birisi bu komut dosyasının dosyalarının kaldırılması sırasında yeni değişiklikler iterse (ki bu gerçekleşmesi muhtemel değildir, ancak mümkündür), tüm çekme başarısız olabilir. Buraya koymamın tek nedeni pull, biri ana dalda çalışmıyor olabilir, ancak başka bir dalda ve senaryonun evrensel olmasını istedim.
Strahinja Kustudic

Seçenek dosyaları gibi yerel olarak dosyalar oluşturduysanız, bunları içeri koyun .gitignore.
Sebi

52

Her şeyden önce, standart yolu deneyin:

git reset HEAD --hard # To remove all not committed changes!
git clean -fd         # To remove all untracked (non-git) files and folders!

Uyarı : Yukarıdaki komutlar veri / dosya kaybına ancak bunları yapmadıysanız neden olabilir! Emin değilseniz yedeklemeyi önce tüm depo klasörünüzden yapın.

Sonra tekrar çekin.

Yukarıdakiler yardımcı olmazsa ve izlenmeyen dosyalarınızı / dizinlerinizi umursamıyorsanız (her durumda yedeklemeyi yapın), aşağıdaki basit adımları deneyin:

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

Bu, tüm git dosyalarını KALDIRIR ( .git/tüm taahhütlerin olduğu direm dizini) ve tekrar çeker.


Neden git reset HEAD --hardbazı durumlarda başarısız olabilir?

  1. İçindeki özel kurallar .gitattributes file

    Having eol=lf.gitattributes kuralı git bazı metin dosyalarındaki LF içine CRLF satır sonları dönüştürerek bazı dosya değişiklikleri değiştirmeye neden olabilir.

    Bu durumda, bu CRLF / LF değişikliklerini (gözden geçirerek git status) gerçekleştirmeniz veya: git config core.autcrlf falsegeçici olarak yok saymayı denemeniz gerekir.

  2. Dosya sistemi uyumsuzluğu

    İzin özniteliklerini desteklemeyen dosya sistemi kullanırken. Örneğin, biri Linux / Mac ( ext3/ hfs+) ve diğeri FAT32 / NTFS tabanlı dosya sisteminde olmak üzere iki havuzunuz var .

    Fark ettiğiniz gibi, iki farklı dosya sistemi vardır, bu nedenle Unix izinlerini desteklemeyen sistem temelde bu tür izinleri desteklemeyen sistemdeki dosya izinlerini sıfırlayamaz, bu yüzden nasıl --harddenerseniz deneyin, git her zaman bazı "değişiklikleri" tespit edin.


47

Ben de aynı problemi yaşadım. Kimse bana bu çözümü vermedi, ama benim için çalıştı.

Ben çözdüm:

  1. Tüm dosyaları silin. Sadece dizinden .gitayrıl.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Şimdi çalışıyor.


1
Burada aynı. Bazen sadece çok zor bir çözüm çalışır, sık sık sadece sıfırlama ve temiz bir şekilde yeterli değildir ...
jdehaan

41

Bonus:

Önceki cevaplarda çekme / getirme / birleştirme konusundan bahsetmişken, ilginç ve üretken bir hile paylaşmak istiyorum,

git pull --rebase

Yukarıdaki komut Git hayatımda çok zaman kazandıran en kullanışlı komuttur.

Yeni taahhüdünüzü sunucuya aktarmadan önce, bu komutu deneyin; en son sunucu değişikliklerini (getirme + birleştirme ile) otomatik olarak senkronize eder ve taahhüdünüzü Git günlüğünün en üstüne yerleştirir. Manuel çekme / birleştirme konusunda endişelenmenize gerek yoktur.

Ayrıntıları bulun "git çekme --rebase" ne yapmak? .


3
Kısaca: git pull -r.
kenorb

29

Benzer bir sorun yaşadım. Bunu yapmak zorundaydım:

git reset --hard HEAD
git clean -f
git pull

6
git cleandikkatli kullanın
nategood

29

Diğer cevapları özetledim. Hatasız çalıştırabilirsiniz git pull:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

Uyarı : Bu komut dosyası çok güçlü, bu nedenle değişikliklerinizi kaybedebilirsiniz.


2
Bu, değiştirilmiş dosyaların (daha önce teslim edilmiş olan dosyaların) üzerine yazılır ve izlenmeyen dosyaları (hiç teslim edilmemiş olan dosyalar) kaldırır. Tam olarak aradığım şey, teşekkürler!
styfle

3
Üçüncü satırın git reset --hard HEADgereksiz olabileceğinden şüpheleniyorum ; yerel kılavuz sayfam (2.6.3) reset, ikinci satırda git reset --hard origin/master "varsayılan olarak tüm biçimlerde HEAD"
arichards

2
@arichards Sanırım şüpheliniz doğru ama ikinci satır işe yaramazsa (herhangi bir nedenle) üçüncü satır sıfırlamak için iyi çalışır. Bu çözümün optimize edilmesi gerekmez. Sadece diğer cevapları özetledim. Bu kadar. Yorumun için teşekkür ederim. :)
Robert Moon

28

Kendi benzer deneyimlerime dayanarak, yukarıda Strahinja Kustudic'in sunduğu çözüm açık ara en iyisidir. Diğerlerinin işaret ettiği gibi, sadece sert sıfırlama yapmak tüm bu tür yapılandırma dosyalarını olarak kaldırılmasını istemediğini pek çok şey, içerebilir izlenmeyen dosyaları. Daha güvenli olan, yalnızca eklenmek üzere olan dosyaları kaldırmaktır ve bu nedenle, güncellenmek üzere olan yerel olarak değiştirilmiş dosyaları da kontrol etmek istersiniz.

Bunu akılda tutarak, Kustudic'in senaryosunu tam da bunu yapmak için güncelledim. Ayrıca bir yazım hatası düzeltildi (orijinalinde bir eksik ').

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

Git git deposundan herhangi bir değişikliği aşağı çektiğiniz için "git pull" yerine son satır olarak "git merge origin / master" kullanılması (notunuzda söylediğiniz gibi) daha hızlı olacaktır.
Josh

Değiştirilmiş dosyaların teslim alınması gerekir, bu nedenle bu işlem% 100 oranında çalışır. Senaryomu uzun zaman önce güncelledim ama burada da güncellemeyi unuttum. Ben de sizden biraz farklı kullanıyorum. Ben sadece M değil, her türlü değişiklik olan dosyaları ödeme, bu yüzden her zaman çalışır.
Strahinja Kustudic

24

Ayrı ayrı çözülmesi gereken iki olası çatışma nedeni olduğuna inanıyorum ve yukarıdaki cevapların hiçbirinin her ikisiyle de ilgilenmediğini söyleyebildiğim kadarıyla:

  • İzlenmeyen yerel dosyaların manuel olarak (daha güvenli) veya diğer yanıtlarda önerildiği gibi silinmesi gerekir. git clean -f -d

  • Uzak dalda olmayan yerel işlemlerin de silinmesi gerekir. IMO'ya ulaşmanın en kolay yolu şudur: git reset --hard origin/master(üzerinde çalıştığınız dal ile 'master'ı değiştirin ve git fetch originbirincisini çalıştırın )


22

Daha kolay bir yol:

git checkout --theirs /path/to/file.extension
git pull origin master

Bu işlem gittiğiniz dosyayla yerel dosyanızı geçersiz kılar


21

Buradaki cevapların çoğu, master şubeye ; ancak, aynı özellik dalında iki farklı yerde çalıştığım zamanlar var ve birindeki bir rebazın, çemberlerden çok fazla atlamadan diğerine yansıtılmasını istiyorum.

RNA'nın yanıtı ve torek'in benzer bir soruya verdiği cevapların bir kombinasyonuna dayanarak, harika bir şekilde çalışan bir şey buldum:

git fetch
git reset --hard @{u}

Bunu bir şubeden çalıştırdığınızda yerel şubenizi yalnızca yukarı akış sürümüne sıfırlar.

Bu güzel bir git alias ( git forcepull) içine konabilir :

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Veya .gitconfigdosyanızda:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

Zevk almak!


Bu cevap da güzel çünkü hangi dalda olursanız olun çalışır!
leafmeal

19

Aynı sorunu yaşadım ve bir sebepten dolayı bile git clean -f -dbunu yapmazdım. Nedeni: Bazı nedenlerden dolayı, dosyanız Git tarafından göz ardı edilirse (bir .gitignore girişi yoluyla, sanırım), daha sonra çekerek bunun üzerine yazma konusunda rahatsızlık veriyor , ancak eklemediğiniz sürece bir temizleme kaldırılmayacak -x.


19

Çok daha kolay ve daha az acı verici bir yöntem biliyorum:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

Bu kadar!


18

Bunu kendim çözdüm:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

Burada son komut, yerel değişikliklerinizin bir listesini verir. "Tmp" dalını kabul edilinceye kadar değiştirmeye devam edin ve ardından aşağıdakilerle master'a tekrar birleştirin:

git checkout master && git merge tmp

Bir dahaki sefere, muhtemelen "git stash şubesine" bakarak daha temiz bir şekilde halledebilirsiniz, ancak stash ilk birkaç denemede sorun yaratacaktır, bu yüzden kritik olmayan bir projede ilk denemeyi yapın ...


17

Garip bir durum ki, ne var git cleanya git reseteserler. git indexİzlenmeyen her dosyada aşağıdaki komut dosyasını kullanarak çakışan dosyayı kaldırmak zorundayım :

git rm [file]

Sonra gayet iyi çekebiliyorum.


16

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


14

Orijinal soruya rağmen, en iyi yanıtlar benzer bir sorunu olan ancak yerel dosyalarını kaybetmek istemeyen kişiler için sorunlara neden olabilir. Örneğin, Al-Punk ve crizCraig'in yorumlarına bakın.

Aşağıdaki sürüm, geçici bir dalda ( tmp) yerel değişikliklerinizi yapar , orijinal dalı (varsayalım) denetler masterve güncellemeleri birleştirir. Bunu ile yapabilirsiniz stash, ancak şube / birleştirme yaklaşımını kullanmanın genellikle daha kolay olduğunu gördüm.

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

diğer deponun olduğunu varsayalım origin master.


13

Bu dört komut benim için çalışıyor.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

Bu komutları uyguladıktan sonra kontrol etmek / çekmek için

git pull origin master

Çok denedim ama sonunda bu komutlarla başarılı oldum.


2
"git branch -D master" dalı sil. bu yüzden dikkatli olun. Yeni bir adla yeni bir şube oluşturan "git checkout origin / master -b <new branch name>" kullanmayı tercih ettim ve 3,4 satıra ihtiyacınız var. Ayrıca "git clean -f" kullanılması önerilir.
Chand Priyankara

13

Sadece yap

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

Bu nedenle, saklamak istediğiniz dosyaları veya dizinleri silmek gibi istenmeyen tüm yan etkilerden kaçınırsınız.


12

Dizini ve başlığı origin/mastersıfırlayın, ancak çalışma ağacını sıfırlamayın:

git reset origin/master

Şahsen bunu en yararlı buldum. Daha sonra tekrar kontrol edebilmeniz için çalışma ağacınızı tutar. Benim sorunum için, takılı olarak aynı dosyaları silinmiş vardı, bu yüzden sıkışmış oldu. Tuhaf, biliyorum.
Jason Sebring

12

Gereksinimler:

  1. Yerel değişiklikleri takip edin, böylece burada kimse onları kaybetmez.
  2. Yerel deponun uzaktaki kaynak deposu ile eşleşmesini sağlayın.

Çözüm:

  1. Yerel değişiklikleri saklayın .
  2. Fetch bir ile temiz bir dosya ve dizinleri görmezden .gitignore ve donanım sıfırlaması için menşe .

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard 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.