Yerel değişikliklerimin üzerine yazılmasıyla ilgili 'git pull' hatası nasıl yok sayılır?


568

Git çekme işleminde aşağıdaki hata iletisini nasıl yok sayabilirim?

Aşağıdaki dosyalarda yaptığınız yerel değişikliklerin birleştirilmesi üzerine yazılır

Bunların üzerine yazmak istersem ne olur ?

Gibi şeyler denedim git pull -f, ama hiçbir şey işe yaramıyor.

Açık olmak gerekirse, sadece belirli değişikliklerin üzerine yazmak istiyorum, her şeyin değil.



7
@BrianKnoblauch tamamen katılıyorum! Ayrıca, 'üzerine yazma' ise bir 'birleştirme' değil mi?
SVN'yi

2
git config core.fileMode falsezamanlarımı kurtarmak
Nolwennig


Bunların üzerine yazmak istemezsem ne olur?
Philip Rego

Yanıtlar:


439

Git tarafından izlenmeyen dosyalar da dahil olmak üzere tüm yerel değişiklikleri çalışma kopyanızdan kaldırmak istiyorsanız, bunları saklayın:

git stash push --include-untracked

Artık onlara ihtiyacınız yoksa, şu zulayı bırakabilirsiniz:

git stash drop

Önceden sahnelediğiniz değişiklikleri (örneğin ile) saklamak istemiyorsanız git add, seçeneği ekleyin --keep-index. Ancak, bu aşamalı değişikliklerin yukarı akıştaki değişikliklerle çarpışması durumunda birleşmenin yine de önleyeceğini unutmayın.


Yerel değişikliklerinizin yalnızca belirli bölümlerinin üzerine yazmak istiyorsanız, iki olasılık vardır:

  1. Üzerine yazmak istemediğiniz her şeyi uygulayın ve geri kalanı için yukarıdaki yöntemi kullanın.

  2. git checkout path/to/file/to/revertÜzerine yazmak istediğiniz değişiklikler için kullanın . Dosyanın üzerinden sahnelendiğinden emin olun git reset HEAD path/to/file/to/revert.


2 numaralı olasılık çalışmıyor. Komutu uyguladıktan sonra hiçbir şey olmuyor. Çekerken hala aynı hatayı alıyorum.
mae

1
@ user1132363: Benim için çalışıyor. Lütfen önce tek bir dosya ile test edin. Ayrıca, üzerine yazmak istediğiniz dosyanın hazırlanmadığından emin olun.
Daniel Hilgarth

3
Hüner kullanmaktı git checkout HEAD^ path/to/file/to/revert. HEAD ^ kullanmak fark yarattı .
mae

2
@ user1132363: Bu, şu anda teslim edilen sürümü değil, önceki sürümü denetler. Bunun doğru yaklaşım olduğuna inanmıyorum.
Daniel Hilgarth

1
" save --keep-index" Dışında bırakmak zorunda kaldım .
Peter Mortensen

318

Diğer iki cevabın yardımıyla doğrudan bir çözüm buldum:

git checkout HEAD^ file/to/overwrite
git pull

7
Bu benim için çalıştı. Bu cevabı genişletebilir misiniz, yani. bu aslında ne yapıyor?
AC Patrice

3
Yerel değişiklikleri düşürüyor, muhtemelen ana daldaki son taahhüt olan HEAD referansına geri
dönüyor

32
HEAD yerine neden HEAD ^?
Yura

19
HEAD ^, HEAD ^ 1 için kısadır, yani HEAD'den önce bir taahhüt anlamına gelir. Bundan önceki taahhüt için HEAD ^ 2 de yapabilirsiniz. Daha fazla bilgi için git-scm.com/book/en/v2/… ve stackoverflow.com/questions/1955985/… adresine bakın .
davidneedham

4
lütfen bunun cevabında ne yaptığını açıklayın
endolith

242

Bu, tüm yerel değişiklikleri geçersiz kılmam için çalışıyor ve bir kimlik gerektirmiyor:

git reset --hard
git pull

4
SO sıralaması algo üzerinde çalışmak gerekiyor, iş parçacığı kadar şimdiye kadar çalışan, yüksek puanlı bir cevap bulmak için hantal.
Benedict K.

3
@BenedictK. Sıralama sisteminin "çoğu insanın en faydalı bulduklarını" uygun şekilde yansıttığına inanıyorum. Oylamaya göre sıralanıyorlar. Daha fazla insan diğer çözümleri tercih ediyor. Bu iyi bir çözüm, ancak daha fazla insan diğer cevapları daha yararlı buluyor .
Kittsil

Benim için iyi çalışıyor
Ender

super easy =) thx ^^
lestat_kim

tanklar, benim için iyi çalışıyor
Igor

76

İşte aşamalı değişiklikleri atmak için bir çözüm:

git reset file/to/overwrite
git checkout file/to/overwrite

11
Rahatsız edici bir şekilde, algılanan fark, dosyanın teslim alındığında yeni satırlarının değişmiş olması gerçeğinden kaynaklanıyorsa, bu sorunu çözmez.
DanielSank

1
Sorunumu çözdüm.
Loïc N.

bu en iyi yanıttır, imo, çünkü herhangi bir aşamalı öğeyi bozmaz, ancak çekmeyi önleyen dosya sorununu giderir
Riley

65

Birleştirme işleminden önce değişikliklerinizi yapabilir veya saklayabilirsiniz:

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
Önemli olan, bunu yapmak zorunda olmamalısınız. Sadece mevcut KAFA malzemesini alın ve ..... birleştirin! Gerçekten basit, Git, diğer tüm VCS'ler bunu yapıyor ... ama hayır. Linus kullanımı sinir bozucu yapmak zorunda kaldı.
Jon

@Jon Bu çözüm Ubuntu için, bundan daha iyi bir şey bulamadım.
Suneel Kumar

Ne yazık ki --autostashseçenek sadece --rebaseseçenekle kullanılabilir (
Eugen Konkov

o kadar çok sorun tanıtacak onun değmez. Yüklenmesi de en az 5 dakika sürer. Ayrıca "Dosyanın bağlantısı kaldır" hataları da verir. downvote
Philip Rego

51

Bir dosyadaki yerel değişikliklerinizi silmek istiyorsanız aşağıdakileri yapabilirsiniz:

git checkout -- <file>

Ardından, en son sürümün yapılmasıyla [s] dosyasının üzerine yazabilirsiniz:

git pull

@pabloasc Bu dosyadaki yerel değişikliklerinizi yok eder.
Suneel Kumar

6
Evet öyle: "Ya bunların üzerine yazmak istersem?"
David

1
Orijinal soru bunu yapamaz, bu cevap körü körüne kopyalayıp komutu yapıştırabilen birine kabus verebilir.
Suneel Kumar

Zaten bir taahhütte bulunmuş olmanız durumunda, önce taahhüdü geri almanız git reset HEAD~ve daha sonragit checkout
dopexxx

git checkout -- <file>başarısızerror: pathspec '<file>' did not match any file(s) known to git.
A__

18

Deponuzda kaldırılan birkaç dosya varsa master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

Bazen bunların hiçbiri işe yaramaz. Can sıkıcı, bence LF şey nedeniyle, işe yarayacak şey dosyaları silmek , sonra çekmektir. Bu çözümü önermediğim için değil, ancak dosya yoksa, git, değişikliklerinizin (değişiklik bile olmayabilir) geçersiz kılınacağını ve devam etmenizi sağlayacak gereksiz bir şekilde sizi bilgilendirmez.

Kendi sorumluluğunuzdadır kullanın.


Hat sonları nedeniyle takıldığınızda, bu yöntem bir hayat kurtarıcıdır
Dan Pisarski

Bu benim için çalışmıyor. Dosyalar yerel olarak mevcut değil ve hala hatayı alıyorum.
PRMan

11

git stash save --keep-index benim için çalışmadı.

Aşağıdaki komut beklendiği gibi çalıştı.

git reset --hard
git pull

İhtiyacınız yoksa tüm yerel değişiklikleri geçersiz kılar.


10

Burada başka cevaplar eklemekten nefret ediyorum, ama yukarıdakilerin hepsi olması gerekenden daha zor. Git her zaman yapmalıyım ve Git değişmemiş dosyaları değiştirdiğimi söylediğim gibi yapmam gerekiyor (değişmedikleri için geri dönememem, ancak sözde değiştikleri için çekemiyorum) En basit ve şimdiye kadar bulduğum en hızlı:

git stash
git stash drop
git pull

bir cazibe gibi çalıştı
Blaze

İnanılmaz! basit ve çalışan bir çözüm.
naïveRSA

parlak, çok teşekkürler
Hamza

8

Son Git'te, getirdikten sonra geçerli dalınızı yukarı akış dalının üstüne yeniden tabanlaştırmak için -r/ --rebaseon pullkomutu ekleyebilirsiniz . Uyarı kaybolmalıdır, ancak çözmeniz gereken bazı çakışmalar alma riski vardır.


Alternatif olarak, farklı şubeleri zorla kontrol edebilir, ardından mastertekrar geri dönebilirsiniz , örneğin:

git checkout origin/master -f
git checkout master -f

Sonra her zamanki gibi tekrar çekin:

git pull origin master

Bu yöntemi kullanarak, saklamaktan ( git stash) ve olası izin sorunlarından, dosyaları sıfırlamaktan ( ), dosyaları git reset HEAD --hardkaldırmaktan ( git clean -fd) vb. Zamandan tasarruf edebilirsiniz . Ayrıca yukarıda hatırlanması daha kolaydır.


8

Bu sorun, dosyalarda yerel olarak değişiklikler yapmış olmanız ve Git deposundaki değişikliklerle aynı dosya (lar) var olmasıdır, bu nedenle çekme / itmeden önce saklı yerel değişikliklere ihtiyacınız olacaktır:

Tek bir dosyanın yerel değişikliklerinin üzerine yazmak için:

git reset file/to/overwrite
git checkout file/to/overwrite

Tüm yerel değişikliklerin üzerine yazmak için (tüm dosyalardaki değişiklikler):

git stash
git pull
git stash pop

Ayrıca bu sorun, ana dalla birleştirilmemiş bir dalda olmanız olabilir.


5

git reset --hard && git clean -df

Dikkat : Bu izlenmemiş dosyaları sıfırlar ve siler.


27
Arkadaşın alnından sinek kaldırmak için balta kullanılmaz.
HonoredMule

3
Bazı dosyaların silineceğinin farkında olmadan bunu KULLANMAYIN.
andromeda

4

Bu dosyanın üzerine yazmak için kullanabilirsiniz

git checkout file_to_overwrite

4

Bu sorunu çözmenin en iyi yolu:

git checkout -- <path/file_name>

Bundan sonra dosyanın üzerine yazabilirsiniz:

git pull origin master

Belirtilen sorun vardı, çünkü dosyaların değişmediğini varsaymak için dizini güncelledim. Çekmeyi yapmama izin vermedi. git checkout -- path/*Sadece bir kez kullandım ve sonra çekme işlemini yapmama izin verdi.
Stephen O'Flynn

4

Bu, canlı uzak sunucudaki değişiklikleri atmam ve GitHub kaynak denetiminden çekmem için çalıştı:

git reset --hard
git pull origin master

4

İşte sorunu çözme stratejim.

Sorun bildirimi

10'dan fazla dosyada değişiklik yapmamız gerekiyor. Denedik PULL (git pull origin master), ama diye bağırdı:

hata: Aşağıdaki dosyalarda yaptığınız yerel değişikliklerin üzerine birleştirme ile yazılır: Lütfen birleştirmeden önce değişikliklerinizi yapın veya saklayın.

İdam etmeye çalıştık commitve sonra pullda işe yaramadı.

Çözüm

Biz içinde bulunduğumuz kirli dosyaları aka "Dizin Alanı" "Sahneleme Alanı" nda ve bazı "Baş Alanı" aka "Yerel Git dizini" oldukları için, aslında sahnede. Ve değişiklikleri sunucudan almak istedik.

Git'in farklı aşamaları hakkında açık bir şekilde bilgi için bu bağlantıyı kontrol edin: GIT Aşamaları

Aşağıdaki adımları takip ettik

  • git stash (bu bizim çalışma dizinimizi temizledi. Yaptığınız değişiklikler Git tarafından yığına kaydedilir).
  • git pull origin master (Değişiklikleri sunucudan alın)
  • git stash apply (Yığındaki tüm değişiklikleri uyguladı)
  • git commit -m 'message' (Değişiklikleri taahhüt etti)
  • git push origin master (Değişiklikleri sunucuya aktardı)
  • git stash drop (Yığını bırakın)

Ne zaman ve neden saklamaya ihtiyacınız olduğunu anlayalım

Eğer varsa kirli üzere, kendi dosyalarında değişiklikler yapıyoruz ve sonra herhangi bir nedenle, mecbur edilir araçları devlete çekme veya şalter bu nedenle bu noktada çekme veya olamaz, bazı çok acil işler için başka şubesine siz değişiklik yapana kadar geçiş yapın. stashKomutu bir yardım eli olarak burada.

ProGIT , 2. Baskı kitabından :

Genellikle, projenizin bir parçası üzerinde çalışırken, işler dağınık bir durumda ve başka bir şey üzerinde çalışmak için biraz dal değiştirmek istiyorsunuz. Sorun şu ki, daha sonra bu noktaya geri dönebilmek için yarı bitmiş bir iş yapmak istemiyorsunuz. Bu sorunun cevabı git stash komutudur. Stashing, çalışma dizininizin kirli durumunu (yani, değiştirilmiş izlenen dosyalarınızı ve aşamalı değişikliklerinizi) alır ve istediğiniz zaman yeniden uygulayabileceğiniz tamamlanmamış değişiklikler yığınına kaydeder.


3

Belirli değişikliklerin üzerine yazmak istiyorsanız, hangisini unutmak istediğinizi söylemenin bir yoluna ihtiyacınız vardır.

Kullanmaktan vazgeçmek istediğiniz değişiklikleri seçerek saklamayı deneyebilirsiniz git stash --patch ve ardından bugit stash drop . Daha sonra uzaktan değişiklikleri içeri çekebilir ve normal şekilde birleştirebilirsiniz.


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

Bunun neden henüz cevaplanmadığını bilmiyorum, ancak gördüğünüz gibi çözüm basit. Buradaki tüm yanıtlar aynıdır: yerel değişikliklerinizi silmek / kaydetmek ve yukarı akışa uygulamak için (save uygulamak için ) yerel değişikliklerinizi en üste uygulayın.

git pull --rebase --autostashAdım adım ne yapar:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Benim durumum (muhtemelen senin de):

Yerel değişiklikler (çalışma dizinindeki değişiklikler) var:

resim açıklamasını buraya girin

Uzaktan değişiklikleri çekmeye çalıştığımda hata alıyorum:

resim açıklamasını buraya girin

Bu değişiklikler yerel değişikliklerle kesişmiyor:

resim açıklamasını buraya girin

Böylece, pull --rebase --autostashyerel değişiklikler otomatik olarak sorunsuz bir şekilde kaydedilip uygulandığında

resim açıklamasını buraya girin

Şimdi yerel değişikliklerim biraz daha düşük: resim açıklamasını buraya girin


2

Bunun özel bir durumu vardı: üzerinde --seviş-değişmemiş bir dosya vardı. git statusKomut herhangi bir değişiklik göstermediği için bulmak zor


Aynı problemim var. Bunu aşmanın bir yolunu buldunuz mu? Ben varsayalım-değişmeden varsayalım ve yeniden eklemek olabilir sanırım ... Yaptığım sadece değişmeden sürümleri almak için bu dosyaları elle kontrol etmek oldu ... sadece sadece ödeme / rebase / birleştirme sadece üzerine yazmak için bir yol olup olmadığını merak onlar.
David

1
Hayır, tüm "değişmediğini varsay" olayını terk etmek zorunda kaldım.

2

Üretim değişikliklerini sunucuda tutmak istiyorsanız, yeni bir yapılandırma öğesiyle birleştirmeniz yeterlidir. İşleme yöntemi aşağıdaki gibidir:

git stash
git pull
git stash pop

Belki tüm işlemleri yapmıyorsunuzdur. Bundan sonra ne yapabileceğinizi biliyorsunuz.


Daha sonra kod birleştirmeyi otomatik olarak onaylamak için dosyanın Git diff - w + adını kullanabilirsiniz
YanQing

1

Repo'mdaki bir dosyayı görmezden geldim ve yaptığımda git pull upstream masteraşağıdaki hatayı aldım:

hata: Aşağıdaki dosyalarda yaptığınız yerel değişikliklerin üzerine birleştirme ile yazılır: Lütfen birleştirmeden önce değişikliklerinizi yapın veya saklayın. durduruluyor

Çözmek için aşağıdakileri yaptım

git update-index --no-assume-unchanged myfile.js

Sonra git statusbu mesajı aldım ve aldım

Şube yöneticisi hakkında Şubeniz 4 taahhütte 'orijin / master' ın arkasındadır ve hızlı bir şekilde iletilebilir. (yerel şubenizi güncellemek için "git pull" kullanın)

Taahhüt için değiştirilmeyen değişiklikler: (taahhüt edilenleri güncellemek için "git add ..." kullanın) (çalışma dizinindeki değişiklikleri atmak için "git checkout - ..." kullanın)

değiştirildi: myfile.js

taahhütte değişiklik yapılmadı ("git add" ve / veya "git commit -a" kullanın)

Sonra vermedi git checkout myfile.jsizledi git pull upstream master. Bu kez git çekme işlemi başarılı oldu.


1

Master'dan çekerken bununla karşılaştım.

Visual Studio'yu kullanma biçimim;

  1. İlk olarak, çözümümde Undo taahhüdünü gerçekleştirdim.
  2. Sonra Git çekme işlemini yaptım.

Bu yardımcı olur umarım!



1

Git'te yeniyim ve çözümümün iyi bir fikir olup olmadığından emin değilim.

TÜM cevapları test ettim ve hiçbiri benim için çalışmadı!

Ama başka bir çözüm buldum:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Bu yardımcı olur umarım.


1

"Aşağıdaki dosyalarda yaptığınız yerel değişikliklerin birleştirme işleminin üzerine yazılır" hatası, yerel repo'da henüz tamamlanmamış bazı değişikliklere sahip olduğunuz için gelir;

Uzak deponuzda bazı dal xyz olduğunu ve o zaman uzak repo xyz dalının yerel repo xyz dalına birleştirilmesini (kopyalanması) istediğinizi varsayalım,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

Bu hata satır sonlarından kaynaklanıyorsa,

git add
git checkout mybranch

çalışacak. Neden işe yaradığından emin değilim.



0

Bu ileti git-lfs, kullanılırsa ve gerçek bir dosya tarafından bir dosya işaretçisinin üzerine yazıldığında da olabilir .

sonra kullanın:

git stash
git lfs migrate import
git pull

davamdan tam çıktı

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

bkz. https://github.com/git-lfs/git-lfs/issues/2839


0

Denedim ve başarılı bir şekilde, çekmeden önce, taahhüt etmediğiniz tüm dosyaları taahhüt edelim, o zaman AS'den bu mesajları almayacaksınız.

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.