Aşağıdaki izlenmeyen çalışma ağacı dosyalarının üzerine birleştirme ile yazılır, ama umrumda değil


344

Şubemde .gitignore'da bazı dosyalar vardı

Farklı bir dalda bu dosyalar değildir.

Farklı şubeyi benimkiyle birleştirmek istiyorum ve bu dosyaların artık göz ardı edilip edilmeyeceği umurumda değil.

Ne yazık ki bunu alıyorum:

Aşağıdaki izlenmeyen çalışma ağacı dosyalarının üzerine birleştirme ile yazılır

Bu dosyaları kendim bulmak, taşımak veya silmek zorunda kalmadan, bu dosyaların üzerine yazmak için çekme komutumu nasıl değiştirebilirim?





1
Bu yalnızca en iyi yanıttır, çünkü yalnızca sizi birleştirmekten
alıkoyan

Yanıtlar:


539

Sorun, dosyaları yerel olarak izlememeniz, ancak aynı dosyaları uzaktan izlemenizdir, böylece sisteminizi "çekmek" için, sürüm kontrollü olmayan yerel dosyaların üzerine yazmak zorunda kalırsınız.

Koşmayı dene

git add * 
git stash
git pull

Bu, tüm dosyaları izler, bu dosyalarda yaptığınız tüm yerel değişiklikleri kaldırır ve dosyaları sunucudan alır.


59
git add -A .; git stashbenim için çalıştı. git add *Varyant ihmal yolları hakkında şikayet etti.
imsky

11
Git eklemeyi denedim., Git stash, git pull. İşe yaradı, ama hala nedenini anlamıyorum?
ARK

1
Benim için, izlenen bir uzak dosyam vardı ve yerel repoda izlenmeyen aynı dosyaya sahiptim. Bu nedenle, değişiklikleri yerel olarak saklayıp sonra çekerseniz, uzak dosyanın yerel dosyanın üzerine yazması gerekir.
userFog

2
Eğer ilgilenen varsa, bunun nasıl çalıştığını anlamak için iyi bir bağlantı. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay

2
//, Bu gerçekten bu hatanın amacına çok fazla girmiyor.
Nathan Basanese

137

İzlenmeyen dosyaları yerelden temizleme komutunu deneyebilirsiniz

Git 2.11 ve daha yeni sürümleri:

git clean  -d  -f .

Git'in eski sürümleri:

git clean  -d  -f ""

Nerede -daşağıdaki ile değiştirilebilir:

  • -x yok sayılan dosyalar ve Git tarafından bilinmeyen dosyalar da kaldırılır.

  • -d izlenmemiş dosyalara ek olarak izlenmemiş dizinleri kaldırın.

  • -f koşmaya zorlamak için gereklidir.

İşte size yardımcı olabilecek bağlantı .


23
Ben eklersiniz -iinteraktif mod için. İstenmeyen dizini silmenin yanı sıra, proje için kullanıcı ayarlarımı da sildim :-(
dumbledad

6
Yorumlarda, canın acıdığı gibi benzer bir cevaba taramaya değer -x.
dumbledad

10
Ama bu çok tehlikeli ve geri alınamaz bir görev !! çok fazla dosya kaybedebilirsiniz! DİKKATLİ OL!!
Mohamed Kawsara

16
Bu işlem , Slim Framework üzerindeki tüm tedarikçi dizinimi sildi . BU KOMUT İLE ÇOK KARIŞIN
RousseauAlexandre

2
Cevabınızdan 'x' işaretini kaldırmalısınız. Bu çok tehlikeli!
earl3s

107

Benim için çalışan tek komutlar:

git fetch --all
git reset --hard origin/{{your branch name}}

5
Alt modülleri çıkardıysanız ve bunları orijinal repoda kitaplık olarak okuduysanız, bu cevaba ihtiyaç duyulduğu unutulmamalıdır. Bir cevaba ihtiyacım vardı ve hepsi işe yaradı.
Routhinator

Alt modüller yoktu ve diğer cevaplarda önerildiği gibi git clean ve git stash denedim, ama sadece bu yardımcı oldu.
kslstn

Çeşitli alt modülleri temizledikten sonra benim için de işe yarayan tek şey buydu. Özel not, bir dosyada da büyük / küçük harf duyarlılığı sorunu yaşadım. Ör. Besteciden satıcı klasörümdeki XML.php'den Xml.php'ye.
KazaJhodo

1
Benim için de çalıştı. Neler olduğunu açıklayabilir misiniz? Anlamıyorum.
Dimitris Karamanis

1
Bu benim yerel taahhütlerimin ikisini sildi, bunu kullanmadan önce dikkat et!
David Cian

27

Bunun yerine yeni bir git mergedosya izlenmeyen dosyaların üzerine yazılır

Aşağıdaki yorumlar, 'ilgilenilen dosyalar' için 'FOI' kullanır;

  • donör dalında var,
  • alıcı dalda mevcut değil,
  • ve birleştirme işlemini engelliyorlar, çünkü bunlar çalışma dizininizde mevcut ve izlenmemiş.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Bunun yerine yeni bir git pulldosya izlenmeyen dosyaların üzerine yazılır

pull = fetch + merge, bu yüzden yukarıdaki hileyi git fetchtakip ediyoruz git checkout -f, git checkout, git merge.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Detaylı açıklama

git merge -fyok ama git checkout -fvar.

İlgilenilen Dosyaları kaldırmak için git checkout -f+ işaretini kullanacağız git checkout(yukarıya bakın) ve birleştirme işleminiz normal şekilde devam edebilir.

Adım 1. Bu adım, izlenmeyen FOI'yı donör dalının izlenen sürümleriyle zorla değiştirir (ayrıca donör dalını kontrol eder ve çalışma direktörünün geri kalanını günceller).

git checkout -f donor-branch

Adım 2. Bu adım FOI'yi kaldırır, çünkü bunlar mevcut (donör) şubemizde takip edilirler ve receiving-branchgeçiş yaptığımızda yoktur .

git checkout receiving-branch

Adım 3. Artık FOI yok olduğuna göre, donör dalında birleştirme izlenmemiş dosyaların üzerine yazılmaz, bu yüzden hata almayız.

git merge donor-branch

3
Bu 7. veya 8. Cevap olmak için çok temiz!
Majed DH

1
Teşekkürler @MajedDH, benim günümü yaptın! <3
Esteis

1
Bu tam burada aradığım instafix oldu! Teşekkürler
AFM-Horizon

Size yardımcı olmaktan mutluluk duyuyoruz, @ AFM-Horizon!
Esteis

20

İzlenmeyen tüm dosyaları kaldırın:

git clean  -d  -fx .

8
bir projede muhtemelen kullanılmış dosyaların silinmesi gerçek bir çözüm olmamalıdır
Erdinç Çorbacı

4
yikes, IDE dosyalarını da temizledi :(
kisna



12

Güncelleme - daha iyi bir sürüm

Bu araç ( https://github.com/mklepaczewski/git-clean-before-merge ):

  • git pulleşdeğerleriyle aynı olan izlenmemiş dosyaları silmek ,
  • değiştirilmiş sürümü değiştirilmiş dosyalara git pulleşdeğerleriyle aynı olan değişiklikleri geri döndürmek ,
  • git pullsürümlerinden farklı olan değiştirilmiş / izlenmemiş dosyaları bildirmek ,
  • araç --pretendherhangi bir dosyayı değiştirmeyecek seçeneğe sahiptir.

Eski versiyon

Bu cevap diğer cevaplardan nasıl farklı?

Burada sunulan yöntem, yalnızca birleştirme ile üzerine yazılacak dosyaları kaldırır. Dizinde izlenmemiş (büyük olasılıkla yoksayılmış) dosyalarınız varsa bu yöntem onları kaldırmaz.

Çözüm

Bu snippet, üzerine yazılacak tüm izlenmemiş dosyaları ayıklar git pullve siler.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

ve sonra sadece şunu yapın:

git pull

Bu git porselen komutu değildir, bu yüzden her zaman ne yapacağını iki kez kontrol edin:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Açıklama - bir astar korkutucu olduğu için:

İşte yaptığı işin bir dökümü:

  1. git pull 2>&1- git pullÇıkışı yakalayın ve hepsini kolayca yakalayabilmemiz için stdout'a yönlendirin grep.
  2. grep -E '^\s- amaç, üzerine yazılacak izlenmemiş dosyaların listesini yakalamaktır git pull. Dosya adlarının önünde bir sürü boşluk karakteri var, bu yüzden onları almak için kullanıyoruz.
  3. cut -f2- - 2'de yakalanan her satırın başındaki boşlukları kaldırın.
  4. xargs -I {} rm -rf "{}"- xargstüm dosyaları yinelemeli, adlarını "{}" içine kaydedip rmher birini çağırmalıyız . -rfİzlenmeyen dizinleri silmek ve kaldırmak için kullanırız .

1-3 adımlarını porselen komutuyla değiştirmek harika olurdu, ama eşdeğer bir şeyin farkında değilim.


Teşekkür ederim, çalışma dizinimde genellikle silinmesini veya işlenmesini istemediğim izlenmemiş dosyalar var. Benim git pullgit checkout <branch_name>
durumumla

6

-fBayrağı kullanmayı düşünüyorsanız, önce kuru çalışma olarak çalıştırabilirsiniz. Sadece ne tür ilginç bir durumla karşılaşacağınızı önceden biliyorsunuz ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

6

Kabul edilen cevaba ek olarak, artık gerekli değilse, dosyaları belirterek dosyaları kaldırabilirsiniz:

git clean -f '/path/to/file/'

Git clean'ın hangi dosyaların kaldırılacağını görmek istiyorsanız, önce -n bayrağıyla çalıştırmayı unutmayın. Bu dosyaların silineceğini unutmayın. Benim durumumda onları hiç umursamadım, bu yüzden bu benim için daha iyi bir çözümdü.


5

Bunu yapmanın bir yolu, yerel değişiklikleri saklamak ve uzak depodan çekmektir. Bu şekilde, dosyalar stash'a gideceğinden yerel dosyalarınızı kaybetmezsiniz.

git add -A
git stash
git pull

Bu komutu kullanarak yerel depolanmış dosyalarınızı kontrol edebilirsiniz - git stash list


4

Bilmeyenler için git, dosya ve klasörlerde büyük / küçük harf adı farklarını yok sayar. Bu, onları farklı bir vaka ile aynı isimle yeniden adlandırdığınızda bir kabus olduğu ortaya çıkıyor.

"Petstore" klasöründen "petstore" (büyük harf - küçük harf) olarak yeniden adlandırdığımda bu sorunla karşılaştım. Davayı görmezden gelmeyi durdurmak, değişiklikler yapmak, taahhütlerimi ezmek ve farklı bir şubeye geçmek için değişikliklerimi saklamak için .git / config dosyamı düzenledim. Depolanan değişikliklerimi diğer şubeye uygulayamadım.

Çalıştığını bulduğum düzeltme, geçici olarak yeniden görmezden gelmek için .git / config dosyamı geçici olarak düzenlemekti. Bu git stash applybaşarılı oldu. Sonra, ignoreCase öğesini tekrar olarak değiştirdim false. Sonra ne olursa olsun, git tuhaf bir şekilde iddia silindi petstore klasöründe yeni dosyalar dışında her şeyi ekledi. Değişikliklerimi yaptım, ardından git reset --hard HEADizlenmeyen yeni dosyalardan kurtulmak için koştum . Taahhüdüm tam olarak beklendiği gibi göründü: klasördeki dosyalar yeniden adlandırıldı.

Umarım bu aynı kabustan kaçınmanıza yardımcı olur.


Benim için çalışmadı. Klasördeki tüm dosyaları sildim. Sonra git pull -fo git checkout .. Ne kabustu ama.
m.rufca

Gerçekten mi? Sadece birkaç hafta önce benim için iyi çalıştı. Durumu uygun görmezden gelmeyi başlatmak / durdurmak için gitconfig dosyanızı düzenlemeyi denediniz mi?
A. Davidson

Teşekkür ederim. Klasör yolundaki kasayı düzelttikten sonra master'dan birleştirmem gerekiyordu. Git yoksayma durumu açıkken birleştirebildim, bundan sonra büyük / küçük harf duyarlılığını yeniden etkinleştirdim.
Rubenisme

3

Ne temiz / sıfırlama / zor ödeme / rebase benim için çalıştı.

Bu yüzden git'in şikayet ettiği dosyaları kaldırdım *

rm /path/to/files/that/git/complained/about

* Bu dosyaların ayrı bir klasörde yepyeni bir depoya bakılarak kaldırılıp kaldırılamayacağını kontrol ettim (dosyalar orada değildi)


1

Benim durumumda bu sorun yaşadığımda. Uzaktan kumandada yeniden adlandırdığım yerel bir dosyam vardı.

git pullGit'i denerken bana yeni dosya adı izlenmedi - henüz yerelde bulunmamasına rağmen uzaktan kumandada olduğunu söyledi.

Yerel bir örneği olmadığından , eski dosya adında (yeniden adlandırmak aptalca fikrim yüzünden ilk başta belli değildi) git pullyapılana kadar yapamadım .git rm


0

Dosyalarınız .gitignore altında yazılmışsa, dosyaları kaldırın ve git pull'u tekrar çalıştırın. Bu bana yardımcı oldu.


0

Sorun, izlenmeyen dosyayı birleştirecek gelen değişiklikler olduğunda, şikayet ediyor. Bu komutlar bana yardımcı oldu:

git clean -dxf
git pull 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.