39 Soru: Yerel dosyaların üzerine “git pull” u nasıl zorlarım?

tarafından oluşturulan soru Sun, Dec 23, 2018 12:00 AM

git pull’da yerel dosyaların üzerine yazmaya 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
  • Git'in dosyalarının üzerine yazmak istemediği için GitHub'dan güncellemeler alamazlar.

Bu alıyorum hatadır:

  

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

Git'i onları üzerine yazmaya nasıl zorlarım? Bu kişi 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.

    
6223
  1. bunu okuyan dosyaları kaybedebileceklerini düşünen herkes, bu konumda bulundum ve Sublime Text'in arabelleğinin beni kurtardığını buldu - bir şey üzerinde çalışıyorsam, o zaman buna benzer bir sorunu çözmeye çalışarak veya bu soruya bir cevap kullanarak her şeyi yanlışlıkla silin ve Sublime'da (iyi bir olasılık var) açık olan dosyaları açtıktan sonra dosyalar yine de Sublime'da olacak. veya geri alma tarihinde
    2016-01-20 08: 51: 22Z
  2. git reset --hard origin/branch_to_overwrite
    2016-03-22 08: 37: 48Z
  3. temel olarak, yalnızca başlangıçtaki ödeme işleminden sonra geliştirmeden bir çekme işlemi yapın -b. işini yap, sonra tekrar içeri gir.
    2018-08-22 09: 09: 33Z
  4. Kısa cevap: dalı sil ve yeniden oluştur. 1. Şube sil: git branch <branch> -D 2. Çatışmadan önce bir taahhüde sıfırlayın: git reset <commit> --hard 3. Şubeyi yeniden oluşturun: git branch <branch> 4. Sunucuyu izlemeyi ayarlayın: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`
    2018-09-24 08: 54: 52Z
  5. Tüm CRLF’leri LF sonuçlarına çevirmek için (temizlemeye başla) git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
    2019-01-17 02: 46: 59Z
30 Yanıtlar                              30                         

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

Git tarafından izlenmeyen dosyalarınız yoksa (ör. yüklenen kullanıcı içeriği), bu dosyalar etkilenmeyecektir.


Bunun doğru yol olduğunu düşünüyorum:

 
git fetch --all

O zaman 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 düzenlemeye çalışmadan en son sürümünü 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'daki dosyalarla eşleşecek şekilde değiştirir


Geçerli yerel taahhütleri koruyun

[*] : Sıfırlamadan önce master’dan 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, eski taahhütlerin tümü new-branch-to-save-current-commits’da tutulacaktır.

Kabul edilmeyen değişiklikler

Ancak yapılan değişiklikler (hatta aşamalı) bile kaybedilecek. Sakladığın ve ihtiyacın olan her şeyi yerine getirdiğinden emin ol. Bunun için aşağıdakini çalıştırabilirsiniz:

 
git stash

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

 
git stash pop
    
8671
2018-07-17 21: 53: 17Z
  1. Dikkat edin! Eğer yerel itilmemiş komisyonlarınız varsa, bu onları şubenizden kaldıracak! Bu çözüm, izlenmeyen dosyaları depoda tutmazry bozulmamış, ancak diğer her şeyin üzerine yazar.
    2012-05-17 08: 18: 25Z
  2. Bu popüler bir soru, bu yüzden burada en üstteki yorumu açıklığa kavuşturmak istiyorum. Komutları bu cevapta açıklandığı şekilde yaptım ve TÜM yerel dosyaları silmedim. Yalnızca uzaktan izlenen dosyaların üzerine yazılmıştır ve burada bulunan tüm yerel dosyalara dokunulmamıştır.
    2012-11-22 10: 38: 05Z
  3. Bu benim için çalıştı ve yerel dosyalar silinmedi.
    2013-05-21 18: 16: 11Z
  4. uzak şube adı "ana" dan farklı bir depodan çekiyorsanız, git reset --hard origin/branch-name kullanın
    2013-12-17 11: 17: 24Z
  5. Bu soruya ve cevaba verilen oyların miktarı göz önüne alındığında, git'in git pull -f gibi bir komut içermesi gerektiğini düşünüyorum.
    2014-08-26 01: 33: 48Z

Bunu dene:

 
git reset --hard HEAD
git pull

İstediğini yapmalı.

    
842
2017-01-14 15: 10: 38Z
  1. Bunu yaptım ve artık depoda olmayan bazı yerel dosyalar diskte kaldı.
    2011-04-08 16: 00: 57Z
  2. Bunun doğru olduğunu sanmıyorum. Yukarıdakiler, soru sorulanın üzerine yazmak yerine, üzerine yazmak yerine bir birleştirme gerçekleştirecektir: "Git'in üzerine yazmaya nasıl zorlanır?" Cevabım yok, şu an için arıyorum. Şu anda "git checkout BranchWithCodeToKeep" ile devam etmek istediğim kodla birlikte şubeye geçiyorum, sonra "git branch -D BranchToOverwrite" ve sonra nihayet "git ödeme -b BranchToOverwrite". şimdi bir birleştirme yapmak zorunda kalmadan BranchToOverwrite dalı üzerindeki BranchWithCodeToKeep öğesinden tam kodu alacaksınız.
    2011-07-13 10: 11: 31Z
  3. 'git pull' kullanarak birleştirmek yerine, git gitmeyi deneyin - hepsini takip et 'git reset --hard origin /master'
    2012-02-21 14: 56: 54Z
  4. evet, @lloydmoore çözümü benim için çalıştı. Sadece bir yorum yerine bir cevap olmakla yapabilirdi.
    2012-11-19 09: 54: 51Z
  5. Bu, geçerli değişiklikleri çekilen son şube işlemesine geri döndürür. Daha sonra git pull değişiklikleri en son şubeden birleştirir. Bu tam olarak ne yapmak istediğimi yaptı .. Teşekkürler!
    2014-12-05 17: 42: 09Z

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


Bazen sadece clean -f yardımcı olmuyor. İzlenmemiş yönetmelikleriniz varsa, -d seçeneği de gerekliydi:

 
# 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, hiçbir şeyi silmeden nelerin silineceğini gösterecektir:

 
git clean -n -f -d

Örnek çıktı:

 
Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
    
430
2018-08-17 19: 32: 32Z
  1. Korku veren ... Bunu dotfiles depomla karşılaştırdım ... Ana dizinde. İyi ki orada gerçekten önemli bir şeyim yoktu ...
    2011-12-11 10: 35: 13Z
  2. Senaryo açıklamasının, içeriği gerçekten atmak istemediğini açıkça belirttiğini düşünüyorum. Onun yerine istediği şey, gitmeden önce dosyaların üzerine yazılmasını engellemektir. @Lauri, bu sana olmamalıydı. Maalesef insanlar senaryo açıklamasının özünü yanlış anladılar - önerime bakın.
    2012-02-11 23: 05: 41Z
  3. KESİNLİKLE . git clean -f -d, temizleme işlemi her şeyi temizlemede başarısız olduğunda kullanışlıdır.
    2012-06-23 04: 32: 08Z
  4. @ crizCraig, .gitignore'da eklenmediyse
    2013-06-13 06: 58: 23Z
  5. @ earthmeLon, bunun için git clean -dfx isteyebilirsiniz. -x görkemlidir. Genellikle, yapı ürünleriniz .gitignore’da olacaktır.
    2015-08-12 18: 28: 00Z

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" kullanmaktır. Yerel değişikliklerin, üzerine yazmaya zorlamaya çalıştığınız dosyalardan biri olmadığı sürece korunmasını sağlayacak şekilde olması gerekir.

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

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

Ardından değişiklikleri alın ve bir çakışma olursa ü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.

    
357
2017-02-23 13: 45: 53Z
  1. Bu, şu ana kadar gördüğüm en iyi cevap. Denemedim, ancak diğer yanıtlardan farklı olarak, bu izlenen tüm dosyalarınızı çalmayı denemez, bu bariz sebeplerden dolayı çok tehlikelidir.
    2012-05-07 09: 36: 16Z
  2. Aynen - bu sadece benim sahip olduklarımın hepsini kabul etmek istediğim çok büyük bir birleştirme (GitHub çekme isteği) yaparken ç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
    2012-07-27 01: 44: 56Z
  3. Bu, yerel dosyalarınızla değil depo dosyalarıyla olan tüm çakışmaların üzerine yazacak, doğru mu?
    2014-12-05 11: 40: 52Z
  4. En iyi cevap. Kabul edilen en yüksek cevap benden kopuk kafamda kaldı. Yerel ana şubeye geri döndüm ve git merge -X theirs origin/master koştum
    2016-03-11 12: 46: 21Z
  5. Bekle ... git add * ve git commit -a <more-options-here> aynı etkiye sahip değil mi? Neden ikisine de ihtiyacınız var?
    2017-04-25 20: 41: 26Z

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

Menşe /ana şubeye sıfırlama yapacaksanız tüm uzaktan kumandaları ve şubeleri getirmenize gerek yok mu?

    
259
2016-09-14 09: 46: 30Z
  1. Yanıtınız, temsilciniz için tam olarak ihtiyaç duyduğunuz şeydir. Sormalıyım, bu da izlenmeyen tüm dosyaları siler mi?
    2014-01-07 06: 38: 09Z
  2. Evet, şöhretimin çoğu buradan geliyor :) Bu, izlenmeyen tüm dosyaları da kaldıracak. Sİnşallah unutmuştum ve sadece 2 gün önce acı verici bir şekilde hatırlatıldım ...
    2014-01-09 12: 01: 15Z
  3. Bu diğer cevapla ilgili yorumları görün: stackoverflow.com/a/8888015 /2151700
    2014-01-09 12: 02: 55Z
  4. Bu, izlenmeyen dosyalarımı kaldırmadı; Bu aslında beklediğim gibi. Bazıları için olabilir, başkaları için değil bir nedeni var mı?
    2016-04-19 15: 27: 08Z
  5. İzlenmeyen dosyalar git reset tarafından etkilenmez. Bunların da kaldırılmasını istiyorsanız, önce git add .'u, git reset --hard'dan önce yapın
    2017-08-15 09: 12: 21Z

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

 
git clean

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

    
128
2017-01-14 15: 10: 01Z
  1. Aynı sorunu çözmek için "git clean" kullanmayı denedim, ancak sorunu çözmedi. git status "Şubeniz ve 'kaynak /ana' adresiniz birbirinden ayrıldı, # ve her biri sırasıyla 2 ve 9 farklı taahhütte bulundu." ve git pull yukarıda söylediklerinize benzer bir şey söylüyor.
    2009-09-24 04: 25: 42Z
  2. git clean oldukça künt bir araçtır ve saklamak isteyebileceğiniz pek çok şeyi çöpe atabilir. Git'in şikayet edeceği dosyaları, çekme işlemi başarılı olana kadar kaldırmak veya yeniden adlandırmak daha iyidir.
    2010-07-02 13: 21: 35Z
  3. Bunun genel olarak işe yaradığını sanmıyorum. Temel olarak bir zorla git çekme ile uzaktan bir git klonu yapmanın bir yolu yok mu?
    2010-11-29 18: 30: 01Z
  4. @ mathick: git fetch origin && git reset --hard origin/master
    2011-02-23 04: 24: 56Z
  5. git clean buradaki en iyi cevap mı? OP'nin istediği dosyaları silmek gibi görünmüyor. Silme değil 'yerel dosyaların üzerine yazılmasını' istediler.
    2014-03-04 08: 28: 11Z

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.

El ile, bire bir:

 
$ 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 arada:

 
$ git stash clear

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

 
$ git stash list
...
$ git stash apply stash@{5}
    
106
2018-03-07 07: 00: 46Z
  1. Hayır Sanmıyorum. Saklamak, yalnızca kaydedilmemiş dosyaları yoldan çıkarır. Yukarıdakiler, git'in takip etmediği dosyaları taşır (saklar). Bu, uzaktan kumandaya eklenen, henüz makinenize indirilmemiş, ancak oluşturduğunuz (!) - indirilmiş dosyaların indirilmesini önler. Tamamlanmamış işleri yok etmeden. Bu mantıklı umarım?
    2012-03-20 23: 54: 34Z
  2. 1.7.6'ya sahip değilseniz, geçici olarak --include-untracked ile git add taklit edebilirsiniz.ntire repo, sonra hemen saklamak.
    2012-05-01 22: 48: 15Z
  3. Kirpi ile aynı fikirdeyim. Buradaki popüler cevapları yaparsanız, istemeden kaybetmek istemediğiniz birçok şeyi yanlışlıkla öldürdüğünüzü muhtemelen göreceksiniz.
    2013-01-31 21: 28: 03Z
  4. Başka izlemeyen dosyalarım da vardı - birleştirme /çekme işleminin üzerine yazmak istediği dışında, bu çözüm en iyi sonucu verdi. git stash apply, birleştirilen dosyaların istisnası (haklı olarak) istisnasız tüm izlemeden dosyalarımı geri getirdi: "zaten var, çıkış yok." Mükemmel çalıştı.
    2013-04-25 04: 55: 09Z
  5. Bu en temiz cevaptır ve kabul edilen cevap olmalıdır. Yazı yazmak için kısa formu kullanabilirsiniz: git stash -u.
    2017-03-23 ​​08: 30: 32Z

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

 
git checkout <your-branch> -f

Sonra bir temizleme yapın (izlenen dosyaları çalışma ağacından kaldırır):

 
git clean -f

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

 
git clean -fd
    
91
2017-01-14 15: 12: 22Z
  1. Senaryo açıklamasının, içeriği gerçekten atmak istemediğini açıkça belirttiğini düşünüyorum. Onun yerine istediği şey, gitmeden önce dosyaların üzerine yazılmasını engellemektir. Önerimi görün.
    2012-02-11 23: 03: 53Z
  2. Bu cevap tam açıklamaya uymasa da, beni hala satırbaşları ile dolanıp gitme sıkıntısından kurtardı (yanlış autocrlf olayı). Git reset - hard HEAD sizi "değiştirilmemiş" dosya olmadan bırakmazsa, bu "-f" bayrakları oldukça yararlıdır. Bir demet teşekkürler.
    2013-01-16 10: 28: 58Z

git pull ile birleştirmek yerine şunu deneyin:

git fetch --all

ardından:

git reset --hard origin/master.

    
84
2018-03-21 07: 21: 12Z

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

 
git reset --hard HEAD~5

Bu işlem sizi beş komisyon geri ve daha sonra

ile geri götürür  
git pull

Git birleştirme işleminin nasıl geri alınacağını arayarak öğrendim.

    
57
2017-05-23 10: 31: 37Z
  1. Bu, şubemi başlangıç ​​noktası repo'yu zorladığım ve uzak reponamı çekmeye çalışırken birleştirme çatışmaları almaya devam ettiğim için sonuçta benim için çalıştı. /div>
    2014-05-07 05: 16: 17Z
  2. Merhaba, aslında bu work around için bir numara ama gerçekten etkili. Bazı ihtilafların sadece birkaç komisyonda gerçekleşebileceği için, 5 komisyonun geri alınması, uzaktan kodla herhangi bir çakışma olmadığından emin olacaktır.
    2014-11-21 10: 03: 43Z

Tüm bu çözümlerle ilgili sorun, hepsinin çok karmaşık olması veya daha da büyük bir sorun olması nedeniyle, izlenmeyen tüm dosyaları web sunucusundan kaldırmalarıdır;Git deposunda olmayan, sunucuda bulunan eed yapılandırma dosyaları.

İş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 eklenecek herhangi bir dosya olup olmadığını kontrol eder ve izlenmeyen dosyaları yerel depodan çakışmalara 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 sefer herhangi bir çelişki olmadan, repodaki izlenen dosyalar artık mevcut değil ve yerel olarak değiştirilen tüm dosyalar zaten aynı depo.

52
2014-05-23 21: 14: 30Z
  1. "git birleştirme kökeni /master" ı son satır olarak (notunuzda söylediğiniz gibi) "git pull" yerine kullanmak, daha önce çektiğiniz kadar hızlı olacaktır Git deposundaki tüm değişiklikleri aşağı.
    2013-05-06 06: 21: 24Z
  2. Tabii ki, git merge origin/master daha hızlı ve muhtemelen daha güvenli olacak. Birisi bu betiğin dosyalarının kaldırılması sırasında yeni değişiklikler yaptıysa (olması muhtemel değildir, ancak mümkün ise), tüm çekme başarısız olabilir. pull'u oraya koyduğum tek sebep, birinin ana dalda çalışmamasının, başka bir dalın çalışmasının ve komut dosyasının evrensel olmasını istememdir.
    2013-09-01 22: 25: 37Z
  3. Seçenek dosyaları gibi yerel olarak dosyalar oluşturduysanız, bunları .gitignore'a yerleştirin.
    2017-11-21 11: 41: 39Z

Aynı problemi yaşadım. Kimse bana bu çözümü vermedi, ancak benim için çalıştı.

Bunu çözdüm:

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

Şimdi çalışıyor.

    
42
2019-01-18 23: 00: 30Z
  1. Burada aynı. Bazen sadece çok zor bir çözüm işe yarıyor, çoğu zaman sadece sıfırlama ve temizlemenin bir şekilde yeterli olmadığı durumlarda oluyor ...
    2011-12-15 11: 28: 09Z

Öncelikle standart yöntemi deneyin:

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

Uyarı : 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.

Ardından tekrar çekin.

Yukarıdakiler yardımcı olmazsa ve takip edilmeyen dosyalarınızı /dizinlerinizi umursamıyorsanız (yedekleri ilk önce yaparsanız), 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ı kaldırır (.git/ dizini hariç tutar, tüm kararların alındığı yer) ve yeniden çeker.


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

  1. .gitattributes file’da özel kurallar

    .gitattributes dosyasında eol=lf kuralının bulunması, bazı metin dosyalarında CRLF satır sonlarını LF'ye dönüştürerek Git'in bazı dosya değişikliklerini değiştirmesine neden olabilir.

    Durum buysa, bu CRLF /LF değişikliklerini (git status'da inceleyerek) yapmanız veya geçici olarak yoksaymak için git config core.autcrlf false'u denemeniz gerekir.

  2. Dosya sistemi uyumsuzluğu

    İzin niteliklerini desteklemeyen bir dosya sistemi 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ı tür dosya sistemi vardır, bu nedenle Unix izinlerini desteklemeyen bir sistem temelde bu tür izinleri desteklemeyen sistemdeki dosya izinlerini sıfırlayamaz. deneyin, git her zaman bazı "değişiklikleri" algılar.

41
2019-01-31 15: 48: 34Z

Bonus:

Önceki cevaplardaki "çekme /alma /birleştirme" ifadesiyle ilginç ve üretken bir numarayı paylaşmak istiyorum.

--hard

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

Yeni taahhüdünüzü sunucuya göndermeden önce, bu komutu deneyin; en son sunucu değişikliklerini otomatik olarak senkronize edecek (bir getirme + birleştirme ile) ve taahhüdünüzü 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? .

    
35
2018-04-27 13: 02: 41Z

Benim de benzer bir problemim vardı. Bunu yapmak zorundaydım:

 git pull --rebase     
27
2011-11-06 16: 35: 34Z
  1. dikkatli
    git reset --hard HEAD
    git clean -f
    git pull
    
    kullanın
    2012-03-30 16: 39: 22Z

Benim kendi benzer deneyimlerime dayanarak, yukarıda Strahinja Kustudic'in sunduğu çözüm bugüne dek en iyisi. Diğerlerinin de belirttiği gibi, yalnızca donanımdan sıfırlama işlemi yapılması, config dosyaları gibi kaldırılmasını istemediğiniz birçok şeyi içerebilecek, izlenmeyen dosyaları kaldıracaktı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.

Aklımda, bunu yapmak için Kustudic'in senaryosunu güncelledim. Ayrıca bir yazım hatası düzelttim (orijinalinde eksik).

 git clean     
27
2015-08-13 23: 12: 27Z
  1. "git birleştirme kökeni /master" ı son satır olarak (notunuzda söylediğiniz gibi) "git pull" yerine kullanmak, daha önce çektiğiniz kadar hızlı olacaktır Git deposundaki tüm değişiklikleri aşağı.
    2013-05-06 06: 20: 47Z
  2. Değiştirilen dosyaların teslim alınması gerekiyor, bu yüzden zamanın% 100'ü çalışıyor. Senaryomu bununla uzun zaman önce güncelledim, ancak burada da güncellemeyi unuttum. Ayrıca senden biraz farklı kullanıyorum. Yalnızca M değil, herhangi bir değişiklik türüne sahip dosyaları da seçiyorum, bu yüzden her zaman çalışıyor.
    2013-09-01 22: 48: 40Z

Diğer cevapları özetledim.

#/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
’u hatasız çalıştırabilirsiniz:  git pull

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

    
27
2017-01-14 15: 42: 28Z
  1. Bu, değiştirilmiş dosyaların (daha önce teslim edilmiş dosyaların) üzerine yazacak ve izlenmemiş dosyaların (hiç kontrol edilmemiş olan dosyaların) üzerine yazacaktır. Tam olarak aradığım şey, teşekkürler!
    2016-03-03 16: 01: 46Z
  2. Üçüncü satırın
    git fetch --all
    git reset --hard origin/master
    git reset --hard HEAD
    git clean -f -d
    git pull
    
    gereksiz olabileceğinden şüpheleniyorum; yerel adam sayfam (2.6.3), ikinci satırdaki git reset --hard HEAD’un reset "varsayılan olarak HEAD’in tüm biçimlerinde bulunduğunu" söylüyor.
    2016-04-19 15: 40: 52Z
  3. @ arichards Şüphelinin haklı olduğunu düşünüyorum, ancak ikinci satır işe yaramazsa (herhangi bir nedenle) üçüncü satır çalışmasısıfırlamak için iyi. Bu çözümün optimize edilmesi gerekmez. Sadece diğer cevapları özetledim. Bu kadar. Yorumun için teşekkür ederim. :)
    2016-04-20 02: 12: 45Z

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

  • İzlenmeyen yerel dosyaların el ile (daha güvenli) veya diğer cevaplarda önerildiği gibi git reset --hard origin/master tarafından silinmesi gerekir

  • Uzak dalda olmayan yerel taahhütlerin de silinmesi gerekir. IMO, bunu başarmanın en kolay yolu şudur: git clean -f -d (üzerinde çalıştığınız şube ile 'ustayı' değiştirin ve önce git reset --hard origin/master'u çalıştırın)

23
2011-12-12 20: 05: 07Z

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

RNA'nın cevabı ve torek'in benzer bir soruya cevabı , bu muhteşem bir şekilde işe yaradı:

 master

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

Bu, aynı zamanda bir git diğer adına (

git fetch
git reset --hard @{u}
) da eklenebilir:

git forcepull

Veya git config alias.forcepull "!git fetch ; git reset --hard @{u}" dosyanızda:

 .gitconfig

Enjoy!

    
20
2017-05-23 12: 18: 32Z
  1. Bu cevap aynı zamanda çok güzel çünkü hangi şubede olduğunuzdan bağımsız olarak çalışıyor!
    2018-09-11 20: 14: 56Z

Daha kolay bir yol şudur:

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

Bu, yerel dosyanızı git üzerindeki dosyayla geçersiz kılar

    
20
2015-05-05 08: 03: 29Z

Aynı problemi yaşadım ve bir nedenden ötürü

git checkout --theirs /path/to/file.extension
git pull origin master
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 çekip , ancak temiz , git clean -f -d eklemezseniz kaldırmaz.     
19
2015-03-18 19: 46: 19Z

Bunu sadece kendim çözdüm:

 -x

son komutun, yerel değişikliklerin neler olduğuna dair bir liste verdiği. Kabul edilebilir olana kadar "tmp" dalını değiştirmeye devam edin ve ardından şurada ana ile tekrar birleştirme:

 
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

Bir dahaki sefere, muhtemelen "git stash şubesini" arayarak muhtemelen daha temiz bir şekilde halledebilirsiniz, ancak stash ilk birkaç denemede sorun çıkarmanıza neden olabilir; .

    
18
2017-01-14 15: 13: 29Z

git checkout master && git merge tmp
veya git clean’un çalışmadığı garip bir durumum var. Takip edilmeyen her dosyada aşağıdaki betiği kullanarak çakışan dosyayı git reset'dan kaldırmam gerekiyor:  git index

O zaman gayet iyi çekebiliyorum.

    
17
2017-12-05 04: 35: 20Z

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

 
git rm [file]

İşte bu!

    
17
2018-09-05 16: 52: 42Z

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

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

Bu komutları yürüttükten sonra kontrol etmek /çekmek için

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

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

    
13
2014-03-20 04: 24: 02Z
  1. "git şube -D master" dalı sil. bu yüzden dikkatli olun. "Git checkout origin /master -b < new branch name >" kullanmayı tercih ediyorum bu da yeni bir isimle yeni bir şube yaratıyor ve 3,4 satıra ihtiyacınız var. Ayrıca "git clean -f" komutunu da kullanmanız önerilir.
    2014-04-05 11: 49: 57Z

Asıl 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 (

git pull origin master
) atar, orijinal şubeyi (varsayılan tmp olduğunu varsayar) kontrol eder ve güncellemeleri birleştirir. Bunu master ile yapabilirsiniz, ancak şube /birleştirme yaklaşımını kullanmanın genellikle daha kolay olduğunu gördüm.  stash

diğer deponun varsayıldığı yerde

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
.     
13
2015-03-18 19: 43: 07Z

Sadece yapın

 origin master

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

    
12
2017-01-14 15: 48: 47Z

Dizini ve kafayı

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname
olarak sıfırlayın, ancak çalışma ağacını sıfırlama:  origin/master     
11
2013-02-15 13: 41: 43Z
  1. Bunu kişisel olarak en faydalı buldum. Daha sonra çalışma ağacınızı tutar, böylece tekrar kontrol edebilirsiniz. Sorunum için, sıkışmış olduğu için aynı dosyaları eklenmiş olarak sildim. Garip, biliyorum.
    2014-01-04 21: 03: 59Z

Tüm cevapları okudum ama bunu yapmak için tek bir komut arıyordum. İşte yaptığım şey. .Gitconfig

'a git takma adı eklendi  
git reset origin/master

Komutunuzu farklı çalıştırın

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

şuna eşittir

 
git fp origin master
    
9
2016-07-08 13: 11: 14Z

Gereksinimleri:

  1. Yerel değişiklikleri izleyin, böylece buradaki hiç kimse onları kaybetmez.
  2. Yerel veri havuzunu uzak kaynaklı veri havuzu ile eşleştirin.

Çözüm:

  1. Yerel değişiklikleri sakla .
  2. .gitignore 'u görmezden gelen temiz bir dosyalar ve dizinler ile alın ve sert sıfırlama , orijinli 'ye

     
    git fetch origin master
    git reset --hard origin/master
    
9
2017-01-14 15: 44: 53Z
git stash --include-untracked
git fetch --all
git clean -fdx
git reset --hard origin/master
kaynak yerleştirildi İşte