Soru Yerel dosyaları üzerine yazmak için “git çek” i nasıl zorlayabilirim?


Yerel dosyaların üzerine yazmayı nasıl zorlayabilirim? git pull?

Senaryo şunları takip ediyor:

  • Bir ekip üyesi üzerinde çalıştığımız bir web sitesinin şablonlarını değiştiriyor
  • Görüntüler dizinine bazı görüntüler ekliyorlar (ancak bunları kaynak denetimi altında eklemeyi unutuyorlar)
  • Fotoğrafları bana postayla gönderiyorlar, sonra bana
  • Görüntüleri kaynak kontrol altına ekliyorum ve diğer değişikliklerle birlikte GitHub'a aktarıyorum
  • GitHub'dan güncellemeleri alamıyor çünkü Git dosyaları üzerine yazmak istemiyor.

Bu aldığım hatadır:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

Git'i bunların üzerine yazmak için nasıl zorlayabilirim? Kişi bir tasarımcıdır - genellikle tüm anlaşmazlıkları el ile çözerim, böylece sunucu sadece bilgisayarlarında güncellemeleri gereken en yeni sürüme sahiptir.


5217
2017-07-14 14:58


Menşei


Dosyayı kaybedeceklerini düşünen herkesi okuyan, bu pozisyonda bulundum ve Sublime Text'in arabasının beni kurtardığını buldum - eğer bir şey üzerinde çalışıyorsam, o zaman buna benzer bir sorunu çözmeye çalışarak ya da kullanarak her şeyi yanlışlıkla siliyorum. Bu soruya bir cevap ve (eğer iyi bir şansı vardır) Sublime'de dosyaları açmışsa, o zaman dosyalar hala orada ya da geri alınmamış tarihte Sublime olacaktır. - Toni Leigh
git reset --hard origin/branch_to_overwrite - Andrew Atkinson


Cevaplar:


Önemli: Yerel değişiklikleriniz varsa kaybolurlar. Birlikte veya ayrı --hard seçeneği, itilmemiş herhangi bir yerel taahhütler kaybolacak.[*]

Herhangi bir dosyanız varsa değil Git tarafından izlenen (ör. yüklenen kullanıcı içeriği), bu dosyalar etkilenmez.


Bence bu doğru yol:

git fetch --all

Sonra iki seçeneğiniz var:

git reset --hard origin/master

VEYA Başka bir dalda iseniz:

git reset --hard origin/<branch_name>

Açıklama:

git fetch Bir şeyi birleştirmeyi veya yeniden oluşturmayı denemeden en son uzaktan indirir.

Sonra git reset Ana dalı, yeni getirdiğiniz şeye sıfırlar. --hard seçeneği çalışma ağacındaki tüm dosyaları dosyadaki dosyalarla eşleştirir. origin/master


Mevcut yerel işlemleri koru

[*]: Şube oluşturmak suretiyle mevcut yerel taahhütleri sürdürmenin mümkün olduğunu belirtmek gerekir. master sıfırlamadan önce:

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 tutulacak new-branch-to-save-current-commits.

Kayıtsız değişiklikler

Ancak kabul edilmeyen değişiklikler (hatta aşamalı) kaybedilecek. İhtiyacınız olan her şeyi sakladığınızdan emin olun. Bunun için aşağıdakileri çalıştırabilirsiniz:

git stash

Ve sonra bu kabul edilmeyen değişiklikleri yeniden uygulamak için:

git stash pop

7301
2018-01-17 00:02



Dikkat et! Eğer yerel hazırlıksız taahhütleriniz varsa, bunlar şubenizden kaldırılacaktır! Bu çözüm, depodaki izlenmemiş dosyaları bozulmadan korur, ancak diğer her şeyin üzerine yazar. - Matthijs P
Popüler bir soru, bu yüzden buradaki en iyi yoruma açıklık getirmek istiyorum. Komutları bu yanıtta açıklandığı gibi çalıştırdım ve TÜM yerel dosyaları silmedi. Sadece uzaktan izlenen dosyaların üzerine yazılmıştır ve burada bulunan her yerel dosya el değmeden bırakılmıştır. - Red
Bu benim için çalıştı ve yerel dosyaları silinmedi. - Tastybrownies
uzak şube adını "ana" den farklı olan bir repodan çekiyorsanız git reset --hard origin/branch-name - Nerrve
Bu soruya verilen cevapların miktarı ve cevabı göz önüne alındığında, git git gibi bir komut içermesi gerektiğini düşünüyorum git pull -f - Sophivorus


Bunu dene:

git reset --hard HEAD
git pull

İstediğini yapmalı.


761
2018-05-09 19:45



Bunu yaptım ve artık repoda olmayan bazı yerel dosyalar diskte kaldı. - Piotr Owsiak
Bunun doğru olduğunu düşünmüyorum. Yukarıdaki soruya, "Git'in üzerine yazmak için zorlamak nasıl?" Cevabım yok, şu anda onu arıyorum .. Şu anda "git checkout BranchWithCodeToKeep git" saklamak istediğim kodla şubeye geçiyorum, daha sonra "git branch -D BranchToOverwrite" yap ve sonra "git checkout -b BranchToOverwrite". Şimdi bir şube yapmaya gerek kalmadan BranchWithCodeToKeep şubesinden BranchToOverwrite koduna sahip olacaksınız. - felbus
'git pull' kullanarak birleştirmek yerine, git fetch --all 'git reset --hard origin / master' ifadesini deneyin. - Lloyd Moore
Evet, @lloydmoore çözümü benim için çalıştı. Sadece yorumdan ziyade bir cevap ile yapabilirdi. - Max Williams
Bu, mevcut değişiklikleri geri çekilerek son şube taahhüdüne geri döner. Daha sonra git çekme, son daldaki değişiklikleri birleştirir. Bu tam olarak ne yapmak istedim yaptı ... Teşekkürler! - Codeversed


UYARI: git clean Programlanmamış tüm dosyaları / dizinleri siler ve geri alınamaz.


Bazen sadece clean -f yardım etmiyor. DIRECTORIES programına sahip değilseniz, -d seçeneği de gereklidir:

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

UYARI: git clean Programlanmamış tüm dosyaları / dizinleri siler ve geri alınamaz.


381
2018-03-19 09:10



Awesome ... Bu benim dotfiles repo karşı koydum ... Benim ev dizininde. İyi ki gerçekten önemli bir şeyim olmadı ki ... - Lauri
Bence senaryo açıklaması, içeriği gerçekten atmak istemediğini açıkça gösteriyor. Onun yerine istedikleri, dosyaların üzerine yazarak git baulking'i durdurmaktır. @ Lauri, bu sana olmazdı. Maalesef insanlar senaryo açıklamasının özünü yanlış görüyorlar - önerimi gör. - Hedgehog
EN SONUNDA. Git temiz -f -d, her şeyi temizlemek için temiz başarısız olduğunda kullanışlıdır. - earthmeLon
eklendiklerinde @crizCraig .gitignore - Bleeding Fingers
@earthmeLon, bunun için isteyebilirsiniz git clean -dfx. -x yok sayar. Genellikle yapı ürünleriniz .gitignore içinde olur. - Paul Draper


Hedgehog gibi, cevapların korkunç olduğunu düşünüyorum. Ancak Hedgehog'un cevabı daha iyi olsa da, olabildiğince şık olduğunu düşünmüyorum. Bunu yapmamın yolu, tanımlanmış bir stratejiyle "getir" ve "birleştirme" kullanmaktır. Bu, yerel değişikliklerin üzerine yazmaya zorlamakta olduğunuz dosyalardan biri olmadıkları sürece korunur.

Öncelikle değişikliklerinizi gerçekleştirin

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

Ardından değişiklikleri toplayın 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" bu seçeneğin değeridir. Çatışma varsa "kendi" değişikliklerini yerine "kendi" değişikliklerini kullanmayı tercih edersiniz.


335
2018-04-11 20:13



Şimdiye kadar gördüğüm en iyi cevap bu. Denemedim, ama diğer cevaplardan farklı olarak, bu, tüm izini sürülmeyen dosyalarınızı yok etmeye çalışmaz, ki bu da belli sebeplerden dolayı çok tehlikelidir. - huyz
Ditto - bu benim için çok büyük bir birleştirme (GitHub çekme isteği) yaparken benim için çalıştı, ben sadece ne sahip olduğumu üstüne sadece kabul etmek istedim. İyi cevap! Benim durumumda son iki komut vardı: 1) get fetch other-repo; 2) git merge -s recursive -X theirs other-repo/master - quux00
Soru: -X nedir? Onlarınki nedir? - AlxVallejo
Bu, yerel dosyalarınızı değil, depo dosyalarındaki çakışmaların üzerine yazacaktır, değil mi? - Nathan Fiscaletti
"-X" bir seçenek adıdır ve "onların" bu seçeneğin değeridir. Çatışma varsa "kendi" değişikliklerini yerine "kendi" değişikliklerini kullanmayı tercih edersiniz. - Richard Kersey


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

Köken / ana branşa sıfırlanacaksanız tüm uzaktan kumandaları ve şubeleri almanıza gerek yok mu?


237
2018-04-26 13:48



Cevabınız, temsilciniz için ihtiyaç duyduğunuz şey. Sormalıyım, bu da tüm izlenmeyen dosyaları kaldırıyor mu? - Nicolas De Jay
Evet, repomun çoğu buradan geliyor :) Bu da tüm programlanmamış dosyaları kaldıracak. Sadece 2 gün önce unuttuğum ve acı içinde hatırladığım bir şey ... - Johanneke
Bu diğer cevap hakkındaki yorumları görün: stackoverflow.com/a/8888015/2151700 - Johanneke
Bu, programlanmamış dosyalarımı silmedi; aslında beklediğim şey bu. Bazı insanlar için başkaları için değil, bir sebep olabilir mi? - arichards
Untracked dosyalar git reset ile etkilenmez. Onları da kaldırılmasını istiyorsanız git add . önce git reset --hard - Johanneke


İlk yapmanın en iyi yolu gibi görünüyor:

git clean

Programlanmamış tüm dosyaları silmek ve sonra normal ile devam etmek git pull...


122
2017-07-14 15:16



Aynı sorunu çözmek için "git clean" kullanmayı denedim, ancak çözmedi. git durumu "Şube ve 'başlangıç ​​/ ana' bölümünüz birbirinden ayrıldı," ve sırasıyla 2 ve 9 farklı işlem (ler) var "diyor. ve git çekme, yukarıda sahip olduğunuza benzer bir şey söylüyor. - slacy
git clean oldukça künt bir enstrümandır ve saklamak isteyebileceğiniz pek çok şeyi atabilir. Git, işaret başarılı oluncaya kadar şikayet eden dosyaları kaldırmak veya yeniden adlandırmak için daha iyidir. - Neil Mayhew
Bunun genelde işe yaradığını sanmıyorum. Temelde bir git klonu uzaktan bir zorla git çekiyle yapmanın bir yolu yok mu? - mathtick
@mathick: git fetch origin && git reset --hard origin/master - Arrowmaster
mı git clean En iyi cevap burada mı? Dosyaların kaldırılması, OP'nin istediği gibi değildir. "Yerel dosyaların üzerine yazılmasını" istemiyorlardı. - JohnAllen


Uyarı, bunu yapmak, 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ğuyla ilgili olarak korkunç.

Aksine (git> v1.7.6):

git stash --include-untracked
git pull

Daha sonra stash tarihini temizleyebilirsiniz.

Elle, 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, hepsi bir kerede:

$ git stash clear

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

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

97
2018-02-11 23:00



Hayır, öyle düşünmüyorum. Stashing sadece kaydedilmemiş dosyaları yoldan çıkarır. Yukarıdaki, gitmenin izlemediği hamle (stashes) dosyalarıdır. Bu, uzaktan makineye henüz eklenmemiş, ancak makinenize çekilmemiş, ancak sizin (!) Yarattığınız dosyaları çekilmesini engeller. Hepsi, işten çıkarılan işi yok etmeden. Umarım bu mantıklıdır? - Hedgehog
Eğer 1.7.6'niz yoksa, taklit edebilirsiniz --include-untracked sadece geçici olarak git addBütün repo'yu al, sonra derhal durdu. - nategood
Hedgehog ile aynı fikirdeyim. Buradaki popüler cevapları yaparsanız, gerçekten kaybetmek istemediğiniz birçok şeyi yanlışlıkla öldürdüğünüzden çok daha fazlasını bulacaksınız. - Guardius
Başka bir izlenimsiz dosyalar vardı - birleştirme / çekme üzerine yazmak istediği yanı sıra, bu çözüm en iyi şekilde çalıştı. git stash apply Tüm untracked dosyalarımı, birleştirme zaten oluşturmuş olanların istisnası (haklı olarak) ile geri getirdi: "zaten var, hiçbir ödeme yok." Mükemmel çalıştı. - BigBlueHat
Bu en temiz cevaptır ve kabul edilen kişi olmalıdır. Bazı yazarak kaydetmek için kısa formu kullanabilirsiniz: git stash -u. - ccpizza


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

git checkout <your-branch> -f

Ve sonra bir temizleme yapın (çalışmayan ağaçtan çıkarılmamış dosyaları kaldırır):

git clean -f

Programlanmamış dizinlere ek olarak, izlenmeyen dizinleri kaldırmak isterseniz:

git clean -fd

86
2017-08-05 18:06



Bence senaryo açıklaması, içeriği gerçekten atmak istemediğini açıkça gösteriyor. Onun yerine istedikleri, dosyaların üzerine yazarak git baulking'i durdurmaktır. Önerimi görün. - Hedgehog
Bu cevap tam olarak açıklamaya uygun olmasa da, hala beni gidip gitme kararından (autocrlf false ile olayı) geri döndürmekten kurtardı. Git reset -hard HEAD, "no" modifiye edilmiş dosyalar ile sizi bırakmazsa, bu "-f" bayrakları oldukça yardımcı olur. Çok teşekkürler. - Kellindil


İle birleştirmek yerine git pull, bunu dene:

git fetch --all

bunu takiben:

git reset --hard origin/master.


72
2017-11-22 10:56





Benim için çalışan tek şey şuydu:

git reset --hard HEAD~5

Bu sizi beş işi geri alacak ve sonra

git pull

Bakarak buldum. Git birleştirme nasıl geri alınır.


51
2018-05-05 21:53



Bu benim için nihayetinde çalışmıştı, çünkü benim gücüm kökeni menşe repoya itti ve uzaktaki repo'ya çekmeye çalışırken çatışmaları birleştirmeye devam etti. - jwfrench
Merhaba, aslında bu bir hile work around ama gerçekten etkili. Bazı anlaşmazlıklar yalnızca birkaç işlemde gerçekleşebileceğinden, 5 sözleşmeyi geri almak, uzak kodla çakışmamasını sağlar. - Hoang Le


Tüm bu çözümlerin problemi, hepsi ya çok karmaşık ya da daha büyük bir problemdir, çünkü tüm ihtiyaç duyulmayan dosyaları web sunucusundan kaldırmamızdır. sunucu 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 veriyi alır.

  • İkinci komut, depoya eklenmiş herhangi bir dosya olup olmadığını denetler ve karşılaşılmamış dosyaları yerel depodan çakışmalara neden olacak şekilde siler.

  • Üçüncü komut, yerel olarak değiştirilmiş 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, repoda olan izlenmeyen dosyalar artık mevcut olmadığından ve tüm yerel olarak değiştirilmiş dosyalar depoda olduğu gibi zaten aynı.


50
2017-11-05 23:32



"Git birleştirme / kökeni" son satır olarak (notta yazdığınız gibi) "git çekme" yerine, git repo'dan herhangi bir değişiklik yapmış olduğunuzdan daha hızlı olacaktır. - Josh
Evet tabiki, git merge origin/master Daha hızlı ve muhtemelen daha güvenli olacak. Bu senaryodaki dosyaların silinmesi sırasında (ki bunun gerçekleşmesi muhtemel değil, fakat olası) birisi yeni değişiklikler yaptıysa, tüm çekişme başarısız olabilir. Tek nedeni pull Orada birileri ana dalda değil, başka bir dalda çalışıyor olabilir ve ben de senaryonun evrensel olmasını istedim. - Strahinja Kustudic
Seçenek dosyaları gibi yerel olarak oluşturulmuş dosyalar varsa .gitignore. - Sebi