it-swarm-tr.com

"Git pull" u yerel dosyaların üzerine yazmaya nasıl zorlarım?

Bir git pull üzerindeki yerel dosyaların üzerine yazılmasını nasıl zorlarım?

Senaryo şöyledir:

  • 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)
  • Görüntüleri daha sonra bana postayla gönderiyorlar.
  • Görüntüleri kaynak kontrol altına ekliyorum ve diğer değişikliklerle birlikte GitHub'a itiyorum
  • GitHub'dan güncellemeler alamazlar çünkü Git dosyalarının üzerine yazmak istemiyor.

Bu alıyorum hatadır:

error: İzlenmeyen çalışma ağacı dosyası 'public/images/icon.gif' birleştirme işleminin üzerine yazılacak

Git’i onları üzerine yazmaya nasıl zorlarım? İnsan bir tasarımcı - genellikle tüm çatışmaları el ile çözüyorum, bu yüzden sunucu bilgisayarlarında güncellemeleri gereken en yeni sürüme sahip.

5771
Jakub Troszok

Önemli: Yerel değişiklikleriniz varsa kaybolurlar. --hard seçeneğiyle veya bu seçenek olmadan, itilmemiş tüm yerel taahhütler kaybolacak.[*]

Git tarafından izlenen değil izlenen dosyalarınız varsa (örneğin, yüklenen kullanıcı içeriği), 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 dalda iseniz:

git reset --hard Origin/<branch_name>

Açıklama:

git fetch, hiçbir şeyi birleştirmeye ya da yeniden düzenlemeye çalışmadan en son uzaktan indirir.

Ardından, git reset, ana dalını az önce aldığınız şeye sıfırlar. --hard seçeneği, çalışma ağacınızdaki tüm dosyaları Origin/master içindeki dosyalarla eşleşecek şekilde değiştirir


Mevcut yerel komisyonları koru

[*]: Sıfırlamadan önce master öğesinden bir dal oluşturarak mevcut yerel taahhütleri korumanın 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, eski taahhütlerin tümü new-branch-to-save-current-commits içinde tutulacaktır. 

Taahhütsüz değişiklikler

Ancak, değişiklik yapılmadan yapılan değişiklikler (hatta aşamalı olarak) kaybedilecek. Sakladığın ve ihtiyacın olan her şeyi yerine getirdiğinden emin ol. 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
8139
RNA

Bunu dene:

git reset --hard HEAD
git pull

Ne istersen yapmalı.

808
Travis Reeder

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


Bazen sadece clean -f yardımcı olmaz. İzlenmemiş yönetmelikleriniz varsa, -d seçeneğinin de ihtiyacı vardı:

# WARNING: this can't be undone!

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

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

Önce -n (--dry-run) bayrağını kullanmayı düşünün. Bu, bir şeyi silmeden silinecek olanı 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
...
409

Kirpi gibi bence cevaplar korkunç. Ancak Kirpi'nin cevabı daha iyi olsa da, olabileceği kadar zarif olduğunu sanmıyorum. Bunu bulmamın yolu tanımlanmış bir stratejiyle "getir" ve "birleştir" kullanmak. Yerel değişikliklerin, üzerine yazmaya zorlamaya çalıştığınız dosyalardan biri olmadığı sürece korunmasını sağlayacak şekilde olması gerekir. 

Öncelikle değişikliklerinizi taahhüt edin

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

Ardından değişiklikleri alı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. Bir çakışma varsa "sizin" değişiklikleriniz yerine "onların" değişikliklerini kullanmayı seçiyorsunuz.

347
Richard Kersey

Yapmak yerine:

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

Aşağıdakileri yapmanızı öneririm:

git fetch Origin master
git reset --hard Origin/master

Origin/master dalına sıfırlayacaksanız, tüm uzaktan kumandaları ve şubeleri getirmeye gerek yok mu?

251
Johanneke

İlk olarak yapmanın en iyi yolu şöyle görünür:

git clean

İzlenmeyen tüm dosyaları silmek ve ardından normal git pull.. ile devam edin.

125
Jakub Troszok

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

Bazı cevaplar korkunç görünüyor. David Avsajanishvili önerisini izleyerek @Lauri'nin başına gelenler anlamında korkunç.

Aksine (git> v1.7.6):

git stash --include-untracked
git pull

Daha sonra stash geçmişini temizleyebilirsiniz.

Bire bir el ile:

$ git stash list
[email protected]{0}: WIP on <branch>: ...
[email protected]{1}: WIP on <branch>: ...

$ git stash drop [email protected]{0}
$ git stash drop [email protected]{1}

Acımasızca, hepsi bir arada:

$ git stash clear

Elbette sakladığın şeye geri dönmek istersen:

$ git stash list
...
$ git stash apply [email protected]{5}
102
Hedgehog

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

git checkout <your-branch> -f

Sonra bir temizleme yapın (çalışma ağacından izlenmeyen dosyaları siler):

git clean -f

İzlenmeyen dosyalara ek olarak izlenmeyen dizinleri kaldırmak istiyorsanız:

git clean -fd
88
Vishal

git pull ile birleştirmek yerine, şunu deneyin: 

git fetch --all

bunu takiben:

git reset --hard Origin/master.

82
Lloyd Moore

İşe yarayan tek şey şuydu:

git reset --hard HEAD~5

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

git pull

Ararken bir Git birleştirme 'nin nasıl geri alınacağını öğrendim.

55
Chris BIllante

Tüm bu çözümlerle ilgili sorun, hepsinin çok karmaşık olması ya da daha da büyük bir sorun olması nedeniyle, izlenen tüm dosyaları web sunucusundan kaldırmalarıdı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 verileri getirir.

  • İkinci komut, depoya eklenmekte olan herhangi bir dosya olup olmadığını kontrol eder ve izlenmeyen dosyaları yerel depodan çakışmaya neden olacak şekilde siler.

  • Üçüncü komut, yerel olarak değiştirilmiş tüm dosyaları kontrol eder.

  • Sonunda, en yeni sürüme güncelleme yapmak için bir çaba sarfediyoruz, ancak bu kez herhangi bir ihtilaf olmadan, çünkü depodaki izlenen dosyalar artık mevcut değil ve yerel olarak değiştirilen tüm dosyalar depodakilerle aynı.

51

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!

Warning: Komutların üstünde, yalnızca onları işlemediyseniz veri/dosya kaybıyla sonuçlanabilir! Emin değilseniz, önce tüm depo klasörünüzün yedeğini alın.

Sonra tekrar çekin.

Yukarıdakiler yardımcı olmazsa ve takip edilmeyen dosyalarınızı/dizinlerinizi umursamıyorsanız (yedekleri ilk önce 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 işlem, tüm git dosyalarını (muafiyet .git/ dir, tüm görevlendirmelerin yapıldığı yer) ortadan kaldıracak ve yeniden çekecektir.


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

  1. Özel kurallar .gitattributes file

    .Gitattributes içinde eol=lf kuralının olması, bazı metin dosyalarında CRLF satır sonlarını LF öğesine dönüştürerek git'in bazı dosya değişikliklerini değiştirmesine neden olabilir.

    Bu durumda, bu CRLF/LF değişikliklerini kabul etmelisiniz (git status içinde inceleyerek) veya geçici olarak yoksaymak için şunu deneyin: git config core.autcrlf false.

  2. Dosya sistemi uyumsuzluğu

    İzin özelliklerini desteklemeyen dosya sistemini kullanırken. Örneğin, biri Linux/Mac'te (ext3/hfs+) diğeri de FAT32/NTFS tabanlı dosya sisteminde iki havuzunuz var.

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

44
kenorb

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

Bunu çözdüm:

  1. Tüm dosyaları silin. Sadece .git dizinini bırakın.
  2. git reset --hard HEAD
  3. git pull
  4. git Push

Şimdi çalışıyor.

39

Bonus:

Önceki cevaplarda çekme/alma/birleştirme konusunda, ilginç ve üretken bir numarayı paylaşmak isterim,

git pull --rebase

Bu yukarıdaki komut Git hayatımdaki çok zaman kazandıran en kullanışlı komuttur.

Sunucunuza yeni bir taahhütte bulunmadan önce bu komutu deneyin; en son sunucu değişikliklerini otomatik olarak senkronize edecek (getirme + birleştirme ile) ve işleminizi Git günlüğünde en üste yerleştirecektir. Manuel çekme/birleştirme konusunda endişelenmenize gerek yok.

Ayrıntıları - "git pull - rebase" ne yapar?.

33

Ben de benzer bir problem yaşadım. Bunu yapmak zorundaydım:

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

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

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 yüzden değişikliklerinizi kaybedebilirsiniz.

27
Robert Moon

Kendi benzer deneyimlerime dayanarak, yukarıda Strahinja Kustudic tarafından sunulan çözüm bugüne dek en iyisidir. Diğerlerinin de belirttiği gibi, basit şekilde sıfırlama yapmak, config dosyaları gibi kaldırılmasını istemediğiniz birçok şeyi içerebilecek tümü izlemeyen dosyaları kaldırır. Daha güvenli olan, yalnızca eklenmek üzere olan dosyaları kaldırmaktır ve bu konuda, muhtemelen güncellenmek üzere olan yerel olarak değiştirilmiş dosyaları da kontrol etmek isteyebilirsiniz.

Bunu akılda tutarak, Kustudic'in senaryosunu tam da bunu yapmak için güncelledim. Ayrıca bir yazım hatası düzelttim (orijinalinde 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
26
Rolf Kaiser

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öyleyebileceğim kadarıyla:

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

  • Uzak dalda olmayan yerel taahhütlerin de silinmesi gerekir. IMO bunu başarmanın en kolay yolu şudur: git reset --hard Origin/master (üzerinde çalıştığınız dalın bulunduğu 'master'ı değiştirin ve önce bir git fetch Origin çalıştırın)

23
tiho

Daha kolay bir yol şudur:

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

Bu işlem, yerel dosyanızı git halindeki dosyayla

20
maximus 69

Görünüşe göre buradaki cevapların çoğu master dalına odaklanmış; ancak, aynı özellik dalı üzerinde iki farklı yerde çalıştığım zamanlar oluyor ve bir çemberin içinde zıplamadan diğerine yansımasını istiyorum.

RNA'nın cevabı ve torek'in benzer bir soruya cevabı kombinasyonuna dayanarak, görkemli bir şekilde işe yarayan bir durumla karşılaştım:

git fetch
git reset --hard @{u}

Bunu bir şubeden çalıştırın, yalnızca yerel şubenizi yukarı akış sürümüne sıfırlayın.

Bu, aynı zamanda bir git diğer adına da (git forcepull) yerleştirilebilir:

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

Veya, .gitconfig dosyanızda:

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

Keyfini çıkarın!

20
JacobEvelyn

Aynı problemi yaşadım ve bir nedenden ötürü, bir git clean -f -d bile yapmazdı. İşte nedeni: Bir nedenden ötürü, dosyanız Git tarafından görmezden gelinirse (bir .gitignore girişi aracılığıyla, sanırım), daha sonra pull ile bunun üzerine yazmaktan rahatsız olur, ancak bir clean-x eklemediğiniz sürece kaldırın.

19
Tierlieb

Bunu sadece 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

son komut yerel değişikliklerin neler olduğuna dair bir liste verir. Kabul edilebilir hale gelinceye kadar "tmp" dalını değiştirmeye devam edin ve ardından ana ile tekrar birleştirme: 

git checkout master && git merge tmp

Bir dahaki sefere, muhtemelen "git stash şubesini" arayarak daha temiz bir şekilde halledebilirsiniz, ancak stash ilk birkaç denemede sorun çıkarmanıza neden olabilir, bu yüzden ilk önce kritik olmayan bir proje üzerinde deney yapın ...

18
Simon B.

git clean veya git reset öğelerinin çalışmadığı garip bir durumum var. Takip edilmeyen her dosyada aşağıdaki betiği kullanarak çakışan dosyayı git index'dan kaldırmam gerekiyor:

git rm [file]

O zaman gayet iyi çekebiliyorum.

17
Chen Zhang

Çok daha kolay ve daha az acı veren 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!

16
ddmytrenko

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ı yürüttükten sonra kontrol etmek/çekmek için

git pull Origin master

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

13
vishesh chandra

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

Böylece saklamak istediğiniz dosyaları veya dizinleri silmek gibi istenmeyen yan etkilerden kaçınırsınız.

12
user2696128

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

Aşağıdaki sürüm, yerel değişikliklerinizi geçici bir şubeye (tmp) gönderir, orijinal dalı (master olduğunu varsayıyorum) kontrol eder ve güncellemeleri birleştirir. Bunu stash ile yapabilirsiniz, 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 depo 'nun Origin master olduğunu varsaydığımız yerde.

12
Snowcrash

Dizini ve başını Origin/master olarak sıfırlayın, ancak çalışan ağacı sıfırlamayın:

git reset Origin/master
11
user811773

Gereksinimler:

  1. Yerel değişiklikleri takip edin, böylece buradaki hiç kimse onları kaybetmez.
  2. Yerel deponun uzaktaki Origin deposuyla eşleşmesini sağlayın.

Çözüm:

  1. Stash yerel değişiklikler.
  2. Getirtemiz ile dosya ile _ ve dizinler _ görmezden .gitignore ve donanımdan sıfırlamaMenşei ile.

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard Origin/master
    
9
vezenkov

Tüm cevapları okudum ama bunun için tek bir komut arıyordum. İşte yaptığım şey. .Gitconfig dosyasına git takma adı eklendi

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

Komutunuzu olarak çalıştırın 

git fp Origin master

eşittir

git fetch Origin master
git reset --hard Origin/master
9
Venkat Kotra

git reset --hard kullanmayın. Bu tamamen istenmeyen olabilecek değişikliklerini silecektir. Yerine:

git pull
git reset Origin/master
git checkout <file1> <file2> ...

Tabii ki açıkça birleşmeyeceği için git fetch yerine git pull kullanabilirsiniz, ancak genellikle çekerseniz buraya çekmeye devam etmek mantıklı olur.

Öyleyse burada olan şey şu: git pull Kökeninizi/ana referansınızı günceller ; git reset yerel şube referansınızı günceller on, herhangi bir dosyayı güncellemeden Origin/master ile aynı olacak şekilde çalışır; daha sonra git checkout dosyaları gerektiği gibi yerel şube dizin durumunuza döndürür . Tam olarak aynı dosyanın canlı ve akış yukarı ana üzerine eklendiği durumlarda, dizin sıfırlamayı izleyen dosyaya zaten uyar, bu nedenle genel durumda git checkout hiç yapmanıza gerek yoktur.

Yukarı akış dalı ayrıca otomatik olarak uygulamak istediğiniz taahhütleri içeriyorsa, işlemdeki ince bir değişikliği takip edebilirsiniz:

git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull
8
Jim Driscoll

Değişiklikleri geri almak için en iyi yöntem budur:

  • git commit Aşamalı değişikliklerinizi yapın, böylece bunlar reflog içine kaydedilir (aşağıya bakın)
  • git fetch En son akış değişikliklerini alın
  • git reset --hard Origin/master Origin ana dalına sabit sıfırlama

reflogyerel depoda güncellenen dalları ve diğer referansları kaydeder. Ya da basitçe söylemek gerekirse - reflog, değişikliklerin geçmişi'dir.

Bu yüzden taahhüt etmek her zaman harika bir uygulamadır. Taahhütler, silinen kodu almak için her zaman bir yolunuz olmasını sağlayan reflog'a eklenir.

7
Jordan Georgiev

Bu komutu, çek/birleştirme işlemini gerçekleştirmemi engelleyen yerel dosyalardan kurtulmak için kullandım. Ama dikkat et! Yalnızca gerçekten kaldırmak istediğiniz dosyaların olup olmadığını görmek için önce git merge … komutunu çalıştırın.

git merge Origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
  • git merge, diğerlerinin yanı sıra tüm bu dosyaları listeler. Beyaz bir boşluk tarafından hazırlanırlar.
  • 2>&1 >/dev/null, hata çıktısını standart çıktıya yönlendirir, böylece grep tarafından algılanır.
  • grep ^[[:space:]], yalnızca dosya adlarına sahip satırları filtreler.
  • sed s/^[[:space:]]//g, beyaz boşluğu baştan keser.
  • xargs -L1 rm, bu dosyaların her birini rm çağırır ve siler.

Dikkatli kullanın: git merge çıktısı ne olursa olsun, rm, beyaz boşlukla başlayan her satırına çağrılır.

5
Glutexo

Angular2-Webpack-Starter'da Material2 dalını kullanmaya çalışıyordum ve bir süre uğradım. Bu dalı indirip kullanabilmemin tek yolu buydu.

git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git

cd angular2-webpack-starter/

git checkout -b material2

Proje klasörünü açın ve tüm gizli olmayan dosya ve klasörleri silin. Bütün gizli olanları bırak.

git add .

git commit -m "pokemon go"

git reset --hard

git pull Origin material2

(Editör açıldığında, ': wq' tuşuna basın ve ardından tuşuna basın. Enter)

Şimdi hazırsın.

5
Helzgate

Windows'ta şu tek komutu uygulayın:

git fetch --all & git reset --hard Origin/master
3
Luca C.

Bu dosyayı proje taban klasörünüzdeki bir dosyayla yok sayabilirsiniz:

.gitignore

public/images/*

Sonra değişiklikleri çekin ve bu satırı gitignore dosyanızdan kaldırın.

3
Daniel Gaytán

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

1
Suge

1: Bir önceki göreve sıfırla

git reset --hard HEAD

2: İzlenmeyen Dosyaları Sil

git clean -f

3: taahhütleri çekin

git pull

Kaynaklar:

0
abhijithvijayan

Deneyebilirsin

git pull --force

tüm yerel dosyaların üzerine yazmak istiyorsanız

0
Ultan Kearns
git fetch --all

o zaman ana dalda iseniz

git reset --hard Origin/master

else

git reset --hard Origin/master<branch_name>
0
SUJITKUMAR SINGH

uzaktan izleme şubesine genel bir şekilde sıfırlamak istiyorsanız, aşağıdakileri kullanın:

git fetch
git reset --keep Origin/$(git rev-parse --abbrev-ref HEAD)

yerel değişikliklerinizi de sıfırlamak istiyorsanız:

git fetch
git reset --hard Origin/$(git rev-parse --abbrev-ref HEAD)
0
warch