Ana şubeye geçerken hata: ödeme tarafından yerel değişikliklerimin üzerine yazılacak


129

Bu soru benzer bu bir , ama daha özel.

İki şubeli bir projem var ( stagingve beta).

Geliştiriyorum stagingve masterhataları düzeltmek için dalı kullanıyorum . Öyleyse, evreleme üzerinde çalışıyorsam ve bir hata görürsem, masterdallara geçiyorum:

git checkout master

ve şu şeyleri yapın:

git add fileToAdd
git commit -m "bug fixed"

ve sonra iki dalla birleşiyorum:

git checkout staging
git merge master
git checkout beta
git merge beta

Çalışma ağacında başka dosyalar olup olmadığı da önemli değil.

Ama şimdi şubeye geçmeye çalıştığımda masterbir hata alıyorum :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Dosyayı hazırlık alanından kaldırmam gerektiğini düşündüm:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

ama aynı hatayı alıyorum. Eğer yaparsam git statusalırımNo changes to commit


4
Denedin reset --hardmi Değişikliklerinizi atmak istediğinizden gerçekten eminseniz. Veya kullanmıyorsanız zula kullanın.
keltar

@keltar - Hayır. Değişikliklerimi atmak istemiyorum. Onları daha sonraki bir taahhüt için çalışma ağacında tutmanız yeterli
Manolo

1
Beklenmedik değişiklikleri korurken şubeleri değiştirebileceğinizi sanmıyorum, ancak kolayca yanılıyor olabilirim - gerçekten benim alanım değil. Deneyin git add your-fileve taahhüt edin.
keltar

@keltar - Daha önce bu şekilde çalıştım. stagingŞu anda herhangi bir değişiklik yapmak istemiyorum .
Manolo

Belki daha önce denediğinizde çakışan dosyanız değişmemiştir. Değişiklikleriniz var, git onları daha sonra geri yüklemek için bir yere kaydetmeli. Taahhüt olmadan mümkün olması pek olası değildir. Ama gerçekten zulayı kullanmak istemiyorsanız, tam olarak neden var olduğudur.
keltar

Yanıtlar:


128

Hatanız, bir dosyayı değiştirdiğinizde ve geçiş yaptığınız dalda da bu dosya için değişiklikler olduğunda görünür (en son birleştirme noktasından itibaren).

Seçenekleriniz, gördüğüm kadarıyla - commit ve sonra bu commit'i ekstra değişikliklerle düzeltin (gitmedikleri sürece, commit'leri değiştirebilirsiniz push); veya - zula kullanın:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash savedeğişikliklerinizi içeren bir zula oluşturacaktır, ancak herhangi bir kaydetme veya hatta dallanma ile ilişkili değildir. git stash popen son zula girişini mevcut şubenize uygulayacak, kaydedilen değişiklikleri geri yükleyecek ve zuladan kaldıracaktır.


3
Teşekkür ederim. Bunun çalışma ağacımda herhangi bir değişiklik yapmayacağından emin misiniz (dosyalar eklenmez)? Değişikliklerimi kaybetmek istemiyorum: - /
Manolo

Maalesef, addgerçekte savegüncellenirken yanlış yazılmış . Yani diğer dosyalar için mi? git stash savedosya adı parametresi olmadan, isterseniz değiştirilen tüm dosyaları kaydeder (ve bunları en son kaydedilen duruma geri döndürür). Ve dizin ağacının fazladan kopyasına sahip olmak asla zarar vermez, ama bu konuda her zaman paranoyaklaşırım.
keltar

Şey, masterdala eklemek istediğim dışındaki tüm değiştirilmiş dosyaları kaydetmek olacaktır . Ayrıca, popdiğer daldaki değişiklikler bir seçenek olabilir mi?
Manolo

Ne anlatmak istediğinden emin değilim. Evet, başka bir dalda zula uygulayabilirsiniz, ancak dosya içeriklerini birleştirmek yerine basitçe değiştirecektir.
keltar

1
@Honey bunun şubelerle ilgisi yok, sorun taahhüt edilmeyen değişikliklerdir. Satın alma işlemi, tanım gereği dosyalarınızı durumuna sıfırlamak zorundadır master, ancak bunu yapmak, mevcut içeriğini kaybeder ve bu içerik taahhüt edilmediğinden, bu duruma daha sonra geri dönmek imkansız olacaktır, dolayısıyla bir hata daha sonra kaybedilen değişikliklerden rahatsız olmaz.
keltar

152

Aynı problemle karşılaştım ve çözdüm

git checkout -f branch

ve özellikleri oldukça açık.

-f, --force

Dalları değiştirirken, dizin veya çalışma ağacı HEAD'den farklı olsa bile devam edin. Bu, yerel değişiklikleri atmak için kullanılır .

Dizinden yolları teslim alırken, birleştirilmemiş girişlerde başarısız olmayın; bunun yerine, birleştirilmemiş girişler göz ardı edilir.


7
Git'im sıkıştığında (yerel değişiklik yok ama yine de o hata), bu çözüm bana yardımcı oldu!
lukyer

6
Teşekkürler, ekranımı yumruk atmaktan kurtardın.
Baykuş

3
Değişikliklerimi bu şekilde kaybettim
Jacek Dziurdzikowski

1
Evet, bunu yaparak değişiklikleri kaybedeceksiniz, bu büyük bir uyarı ile gelmelidir.
Alexander Mills

Ben de tam tersi olmasını istiyorum. usta şubemin arkasında ve usta ile güncel durumdayım ama hala şubeleri değiştiremiyor. Git hatası olmalı.
jgmjgm

12

Yerel değişikliklerinizi uygulamak istemiyorsanız şubenizi satın almaya zorlayabilirsiniz.

git checkout -f branch_name

1
sudoSadece dosya izinlerini kırarım, gerekli değildir. Bir yıl önce @kiki_yu tarafından gönderilen aynı git komutu , ama daha da kötüsü.
kenorb

2
Değişikliklerimi bu şekilde kaybettim
Jacek Dziurdzikowski

2
@JacekDziurdzikowski Yani, her ikisi de amacın yerel değişiklikleri atmanın çok açık bir şekilde ifade ettiği çözümleri uygulayarak değişikliklerinizi iki kez kaybettiniz (kiki_yu'nun cevabı hakkındaki yoruma bakın) . Alay detektörüm kırıldı mı yoksa ... ciddisin?
RomainValeri

@RomainValeri Hmm, sanırım git ile yeni başlayanları (bu yazıyı okuyorlarsa yeni başlayanlar olmalı) yaptıkları değişikliklere veda etmeye hazır olmaları için uyarma yolum buydu. Bir şubede yapılan değişikliklerin, tekrar kontrol edene kadar o şubede kalması gerektiğini düşündüm. Bu şekilde düşünen yeni gelenlere ipucu: git stash kullan :)
Jacek Dziurdzikowski

Sebepsiz olarak yinelenen cevap. İlk cevapta daha fazla bilgi var.
MAChitgarha

9

Aynı problemle karşılaştım ve çözdüm

git checkout -f şubesi

-fAnahtar konusunda dikkatli olun . -fAnahtarı kullanırsanız, yapılmamış tüm değişiklikleri kaybedersiniz . Kullanmanın yararlı olduğu bazı kullanım durumları olsa da -f, çoğu durumda, stashdeğişikliklerinizi ve ardından switchşubelerinizi isteyebilirsiniz . stashingİşlem yukarıda açıklanmıştır.


0

Mevcut şubede taahhüt edebilir, başka bir şubeye ödeme yapabilir ve son olarak bu taahhüdü (birleştirme yerine) seçebilirsin.


Bununla ilgili daha fazla açıklama yaparsanız daha faydalı olabilir.
MAChitgarha

-1

Farklı bir şubeye bakmaya çalışırken bunu alırsanız:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

Bu, kontrol ettiğiniz şubede gerçekleştirmeniz gereken bazı değişiklikler olduğu anlamına gelir - veya yukarıdakilerin çoğunun işaret ettiği gibi bunları silmeniz veya saklamanız gerekir. 20 defadan 19'u değişikliklerimi yapma olasılığım daha yüksek.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Artık bunu yaptığınıza göre, diğer şubeye göz atabilir ve kolayca ileri geri geçiş yapabilirsiniz.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Git push origin $ {branch} komutunuzu çalıştırdığınızda hem doğru dalda olduğunuzdan hem de doğru dala ittiğinizden emin olun. Not: Projenizi doğrudan Intellij'e bağladıysanız, ana pencerenin sağ alt köşesinde şubenizi değiştirdiğinizi görebilirsiniz.

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.