Git'i “Değişikliklerinizi yapmadan önce birleştirin veya saklayın” diyerek nasıl çözerim?


762

Yerel makinemde bazı güncellemeler yaptım, onları uzak bir depoya ittim ve şimdi değişiklikleri sunucuya çekmeye çalışıyorum ve mesajı alıyorum;

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

WP-içeriği / w3tc-yapılandırma / master.php

Lütfen birleştirmeden önce değişikliklerinizi yapın veya saklayın.

Bu yüzden koştum,

git checkout -- wp-content/w3tc-config/master.php

ve tekrar denedim ve aynı mesajı alıyorum. w3tcSunucudaki yapılandırma dosyasında bir şey değiştiğini varsayıyorum . Yerel kopyanın veya uzak kopyanın sunucuya geçip geçmediği umurumda değil (uzak olanın en iyisi olduğunu düşünüyorum), sadece değişikliklerimin geri kalanını (eklenti güncellemeleri) birleştirmek istiyorum.

Herhangi bir fikir?



11
Bu, daha fazla ayrıntı ve daha iyi bir cevap içeren daha açık bir sorudur. Sanırım bunu bir yerde tutmak değerli. Evet, önce diğerinden teknik olarak istendi, ancak bunu kaldırmak, insanların aradıkları yanıtları bulmasını zorlaştıracaktı.
Jo Sprague

Yanıtlar:


1300

Yerel değişikliklerle birleştirilemez. Git sizi önemli olabilecek değişiklikleri kaybetmekten korur.

Üç seçeneğiniz var:

  • Değişikliği kullanarak

    git commit -m "My message"
    
  • Saklayın.

    Stashing, değişiklikleri zorlayabileceğiniz ve ters sırada patlattığınız bir yığın görevi görür.

    Saklamak için şunu yazın

    git stash
    

    Birleştirme işlemini yapın ve sonra zulayı çekin:

    git stash pop
    
  • Yerel değişiklikleri sil

    git reset --hard
    veya kullanarakgit checkout -t -f remote/branch

    Veya: Belirli bir dosya için yerel değişiklikleri atın

    kullanma git checkout filename


104
Ayrıca, belirli bir dosya için yerel değişiklikleri aşağıdakileri yaparak da atabilirsiniz: git checkout dosyaadı
ckb

6
Teşekkürler. Bunu git reset --hardeklerdim , eğer yaparsanız izlenmemiş dosyaları da silmek isteyebilirsinizgit clean -dfx
Jo Sprague

13
Varsayılan olarak git stash, geçmişi olmayan dosyaları saklamaz. Dolayısıyla, henüz eklemediğiniz ancak birleştirme tarafından üzerine yazılacak veya "oluşturulacak" dosyalarınız varsa, birleştirme yine de engellenir. Bu durumda, git stash -utaahhüt edilmemiş dosyaları da saklamak için kullanabilirsiniz . Veya sadece silebilirsiniz!
joeytwiddle

25
koşmak git clean -dfxkorkunç bir fikirdi. Aslında ihtiyacım olan bazı .gitignored dosyaları kaldırıldı.
ezuk

5
Bir kullanıcının, yaptıktan sonra git reset --hardhala birleştirilmemiş değişiklikler geçirdiği bir durumla karşılaştım !
Amedee Van Gasse

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

İlk komut değişikliklerinizi geçici olarak saklanır ve çalışma dizininden kaldırır.

İkinci komut dalları değiştirir.

Üçüncü komut, stash içinde sakladığınız değişiklikleri geri yükler ( --indexseçenek, hazırlanan dosyaların hala sahnelendiğinden emin olmak için yararlıdır).


1

2
@ vikramvi'nin amacını açıklamak için: git stash popyerine de kullanabiliriz git stash apply. İkincisi hala orada tutarken ikincisini saklıyor
Anupam

27

Aşağıdaki yöntemlerden birini deneyebilirsiniz:

rebase

Basit değişiklikler için değişiklikleri çekerken üstüne basmayı deneyin, örn.

git pull origin master -r

Böylece mevcut dalınızı getirdikten sonra akış yukarı dalın üstüne uygular.

Bu eşdeğerdir: checkout master, fetchve rebase origin/mastergit komutları.

Bu, potansiyel olarak tehlikeli bir çalışma modudur. Geçmişi yeniden yazar, ki bu geçmişi zaten yayınladığınızda iyi bir şekilde işaretlenmez. git-rebase(1)Dikkatlice okumadığınız sürece bu seçeneği kullanmayın .


ödeme

Yerel değişikliklerinizle ilgilenmiyorsanız, diğer şubeye geçici olarak (zorla) geçebilir ve geri değiştirebilirsiniz, örn.

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

Sıfırla

Yerel değişikliklerinizle ilgilenmiyorsanız, HEAD (orijinal durum) olarak sıfırlamayı deneyin, ör.

git reset HEAD --hard

Yukarıda yardımcı olmazsa, git normalleştirme dosyanızdaki ( .gitattributes) kurallar olabilir, bu yüzden söylediklerini yerine getirmek daha iyidir. Veya dosya sisteminiz izinleri desteklemediğinden filemode, git yapılandırmanızda devre dışı bırakmanız gerekir.

İlgili: "git pull" i yerel dosyaların üzerine yazmaya nasıl zorlarım?


1
Çalışmıyor: "Önce değişikliklerinizi saklayın" gibi aynı mesajı alıyorum. Ne zaman "git stash" ve sonra "git pull" -> "hatası yazdığımda: kaydedilmemiş değişiklikleriniz var .. önce bir zulası yapın". Benim bilgisayar yok önce kısa
trinity420 21:18

@ trinity420 Dosya izinleriniz olabilir git statusmi, sakladıktan sonra hangi değişikliklerin yapıldığını kontrol edin . Hiçbir yanıt yardımcı olmazsa, yeni bir soru eklemeyi düşünün.
kenorb

teşekkür ederim ama benim sorunum çözüldü, burada her şeyi denedim, hiçbir şey işe yaramadı, daha sonra PHPStorm "taahhüt değişiklikleri" "birleştirme" tıkladı ve sonra değişiklikleri untashed ve işe yaradı ..
trinity420


13

Bu yüzden karşılaştığım durum şuydu:

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

hariç, bundan hemen önce uzaktı: yani aslında bu:

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

Neler oldu (sanırım,% 100 pozitif değil) git post alma kancası çalışmaya başladı ve teorik olarak dokunulmaması gereken uzak sunucu deposundaki hareket değişiklikleri nedeniyle vidalanıyordu.

Bu yüzden, sonradan alma kancası ile izleme ve bularak, ne yaptı sonunda sunucuda uzak depoya gitmek zorunda kaldı, ve değişiklik oldu (ki benim yerel depo, değildi, aslında, o eşleşen hiçbir değişiklik, hiçbir şey yerel üzerinde hiçbir değişiklik vardı Yani ederken sunucuda, o zaman bir yaptım), güncel, vb işlemeye söyledi git checkout -- some/file.extve sonra yerel ve uzak depoları aslında eşleşti ve I could çalışmaya devam edin ve konuşlandırın. Bu durumun nasıl gerçekleştiğinden tam olarak emin değilim, ancak birkaç düzine geliştirici artı BT değişikliği bununla bir ilgisi olabilir.


2
Bu bir soru mu, cevap mı?
stdcall

2
@stdcall - İkisinden de biraz. Soruda açıklandığı gibi bu duruma rastladığımda, bunu düzeltmek için yapmam gereken şey buydu. Kesinlikle normal bir git çözme değildi ve sorudan, aynı anormal durum olabilir gibi görünüyor (yani, sunucuda yapılandırma değişiklikleri, ancak yerelde herhangi bir değişiklik yok). Herkes bunun neden (veya nasıl) olduğuna dair daha fazla fikri varsa, herhangi bir içgörü memnuniyetle karşılarım.
Mike

7

UYARI: Bu, izlenmeyen dosyaları silecektir, bu nedenle bu soruya mükemmel bir cevap değildir.

Benim durumumda, dosyaları tutmak istemedim, bu yüzden bu benim için çalıştı:

Git 2.11 ve daha yenisi:

git clean  -d  -fx .

Eski Git:

git clean  -d  -fx ""

Referans: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x, yok sayılan dosyaların yanı sıra git tarafından bilinmeyen dosyaların da kaldırıldığı anlamına gelir.

  • -d, izlenmeyen dosyalara ek olarak izlenmeyen dizinleri kaldır anlamına gelir.

  • -f, çalışmaya zorlamak için gereklidir.


4

Bu sorunu giderirken yeni oluşturulan dosyalarınızın kaydını tutmak için:

Eğer varsa yeni dosyaları oluşturulan , yerel değişiklikleri, uzak birleştirme içinde çekme bir yama oluşturmak ve uzak birleştirme işleminin ardından yerel yama aşağıda adım tanımlanan adım olarak tamamlandıktan uygulayabilirsiniz:

  1. Yerel değişikliklerinizi yapın. (taahhüt etmeyin). Yeni oluşturulan dosyaların yamasını oluşturmak için hazırlama işlemi gereklidir (hala izlemedikleri için)

git add .

  1. Kayıt tutmak için bir yama oluşturun

git diff --cached > mypatch.patch

  1. Yerel değişiklikleri atın ve yeni yerel dosyaları silin

git reset --hard

  1. Çekme değişiklikleri

git pull

  1. Yamanızı uygulayın

git apply mypatch.patch

Git değişiklikleri birleştirir ve birleştirilmeyen değişiklikler için .rej dosyaları oluşturur.

Anu tarafından önerildiği gibi, yama uygularken sorun yaşıyorsanız şunları deneyin:

git apply --reject --whitespace=fix mypatch.patch Bu cevap git: yama bu konu hakkında ayrıntılı konuşmalar uygulamıyor

Özelliğinizle ilgili devam eden çalışmalarınızın keyfini çıkarın ve bittiğinde yerel değişikliklerinizi yapın.


Ben kodları bir kısmını yeni değişikliklerle itmek istedim, bu yüzden yaptım: 1. Yerel dev şubemden bir yama yarattı 2. donanım sıfırlaması yaptı 3. Yeni değişiklikleri master'dan dev'e çekin (herhangi bir birleşme çatışmasını önlemek için) 4 Yerel geliştiricimde küçük bir değişiklik yaptı 5. uzak error: patch failed: yourfile.py:33 error: yourfile.py: patch does not applydev'e itti 6. uygulanmış yama geri -> Hata var:, hala mypatch.patch var, ama neden uygulanmadığını bilmiyorum ve değişikliklerimi kaybettim !
Anu

Anladım, doğru komut, git apply --reject --whitespace=fix mypatch.patchdeğişikliklerimi geri aldım !!! [Teşekkürler] ( stackoverflow.com/a/15375869/6484358 )
Anu

1
Anu, git uygula mypatch.patch komutunu düzeltme eki uygulamak doğru, her zaman kullandığım şey bu, oluşturulan düzeltme ekinin kendisiyle ilgili bir sorun olabilir ve düzeltme ekini elinizde varsa asla değişikliklerinizi kaybetmezsiniz, konsolide tüm değişiklikleri içerir.
Manpreet

2

Çekmeden önce taahhüt istemek

  • git stash
  • git pull origin << şube adı >>

Gerekirse :

  • git stash uygula

1
Çalışma dizininin ve dizinin geçerli durumunu kaydetmek, ancak temiz bir çalışma dizinine geri dönmek istediğinizde git stash komutunu kullanın. Komut, yerel değişikliklerinizi kaydeder ve çalışma dizinini HEAD taahhüdüne uyacak şekilde geri döndürür.
Pushpak Sharma

2

Benim için sadece git reset --hardçalıştı.

Taahhüt edecek bir şey olmadığı için taahhüt etmek bir seçenek değildi.

Saklamak bir seçenek değildi, çünkü saklamak için hiçbir şey yoktu.

Görünüşe bakılırsa, klasördeki hariç tutulan dosyalardan .git/info/excludeve git update-index --assume-unchanged <file>bazı dosyaları düzenlemiş olabilirsiniz.


0

Benim durumumda, Git'in şikayet ettiği, taahhüt ettiği dosyayı yedekledim ve sildim, sonra başka bir şubeyi kontrol edebildim.

Daha sonra dosyayı değiştirdim, içeriğe kopyaladım ve hiçbir şey olmamış gibi devam ettim.



0

İlk cevabı denedim: git stashen yüksek puanla ama hata mesajı hala açıldı ve daha sonra bu makaleyi 'İsteksiz Taahhüt' yerine stash yerine buldum

ve sonunda hata mesajı kayboldu:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

sonra işe yaradı. Umarım bu cevap yardımcı olur. :)


0

Git Uzantıları kullanıyorsanız , yerel değişikliklerinizi Working directoryaşağıda gösterildiği gibi bulabilmeniz gerekir :

resim açıklamasını buraya girin

Herhangi bir değişiklik görmüyorsanız, bunun nedeni büyük olasılıkla yanlış bir alt modül üzerindedir. Bu nedenle, aşağıda gösterildiği gibi bir denizaltı simgesine sahip tüm öğeleri kontrol edin:

resim açıklamasını buraya girin

Taahhütsüz bir değişiklik bulduğunuzda:

İle satırı seçin Working directoryetmek, gezinmek Diff bir kalem (veya satırlarda sekmesi, Sağ tıklama +veya -seçin) simgesinin ilk işlemeye Sıfırlama veya onunla yapmak istiyorsan onu zulası da taahhüt.


0

Benim için bu işe yaradı:

git reset --hard

ve sonra

git pull origin <*current branch>

Daha sonra

git checkout <*branch>


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.