git: Şubeyi değiştirin ve herhangi bir değişiklik yapmadan yoksayın


318

Bir git dalı üzerinde çalışıyordum ve değişiklikleri yapmaya hazırdım, bu yüzden yararlı bir taahhüt mesajı ile bir taahhütte bulundum. Daha sonra kayıtsız şartsız tutmaya değer olmayan kodda küçük değişiklikler yaptım. Şimdi şubeleri değiştirmek istiyorum, ama git bana

hata: "X" üzerinde yerel değişiklikleriniz var; dallar değiştirilemez.

Taahhüt etmeden şubeleri değiştirebilir miyim? Öyleyse, bunu nasıl ayarlayabilirim? Değilse, bu sorundan nasıl çıkabilirim? Taahhüt etmeden küçük değişiklikleri göz ardı etmek ve sadece şubeleri değiştirmek istiyorum.


1
Bunun sadece değişiklikler taahhüt için hazırlandıkları ancak taahhüt edilmedikleri zaman gerçekleştiğine inanıyorum? git checkout, dosyaları git add veya benzerlerini kullanarak hazırlamadıysanız, dalları değiştirmek için iyi çalışır.
Jeremy Wall

1
Merhaba Jeremy, 'Kademeli' ile ne demek istiyorsun? Kullanıcıyı değişiklik dallarından önce dosya yapmaya zorlamak harika bir iş akışı gibi görünmüyor. Örneğin, ana depodayım ve bir daldaki bir şeyi hızlı bir şekilde kontrol etmek istiyorsam. Ben kodun yarısı yazılı olsa bile, önce master için kod taahhüt etmek zorunda! Gerçekten, bu durumda bir şubeyi kontrol etmenin mümkün olması gerektiğini mi söylüyorsunuz?
Daniel Farrell

@boyfarrell Değişiklikleri taahhütte bulunmaksızın geçici olarak kaydetmek için 'Git stash'ı kullanabilirsiniz.
Howiecamp


1
eski dalda değişiklik yapmadan bir şubeye geçtiğinizde git, yeni daldaki dosyalarda yapılan değişiklikleri birleştirmeye çalışır. Birleştirme herhangi bir çakışma olmadan yapılırsa, dallanan dallar başarılı olur ve yeni daldaki değişiklikleri görebilirsiniz. Ancak bir çatışma oluşursa, alacaksınız error: You have local changes to '<filename>'; cannot switch branches.ve şube değişmeyecek. Yapabileceğiniz git checkout -m <branch-name>şube ve çözmek çatışmalar kendinizi çatışmaları ve ödeme birleştirmek veya git checkout -f <branch-name>değişiklikleri göz ardı etmek.
samad montazeri

Yanıtlar:


400

Dalları değiştirmek için temiz bir duruma ihtiyacınız var. Şube kontrolüne yalnızca 'kirli dosyaları' etkilememesi durumunda izin verilecektir ( Charles Bailey'nin yorumlarda belirttiği gibi).

Aksi takdirde, şunlardan birini yapmalısınız:

  • saklamak için geçerli değişikliği veya
  • reset --hard HEAD (bu küçük değişiklikleri kaybetmenin sakıncası yoksa) veya
  • checkout -f (Dalları değiştirirken, dizin veya çalışma ağacı KAFA'dan farklı olsa bile devam edin. Bu, yerel değişiklikleri atmak için kullanılır.)

Veya daha yakın zamanda:

Dizin veya çalışma ağacı KAFA'dan farklı olsa bile devam edin.
Hem dizin hem de çalışma ağacı anahtarlama hedefiyle eşleşecek şekilde geri yüklenir.

Bu git switch -m <branch-name>, mevcut dal, çalışma ağacı içeriğiniz ve yeni dal arasında üç yönlü birleştirme tetikleyen farklıdır : devam eden çalışmanızı bu şekilde kaybetmezsiniz.


34
"Şubeleri değiştirmek için temiz bir duruma ihtiyacınız var." yalnızca şube değişikliği 'kirli dosyaları' etkiliyorsa geçerlidir.
CB Bailey

10
Stash yöntemi için, "git stash save", "git checkout otherbranch" ve son olarak "git stash pop" yazdım.
Venkat D.

1
Şu anda bu hata iletisini görmüyorum ve "git status" yaptığımda bir dalda yaptığım değişiklikler diğer tarafta görünüyor. bir şey değişti mi?
Senthil A Kumar

2
Teşekkürler. ödeme -f ne gerekli oldu. i git sıfırlama git'e --hard yaptılar temiz -f git ödeme mybranch -f
nologo

1
İşte Git'in bir dalın temel tanımını ihlal ederek tamamen yanlış yaptığı harika şey. Git şubesinin aksine, bir depodan çatallanmış iki farklı çalışma alanı anlamına gelir.
nehem

125

Değişiklikleri atmak istiyorsanız,

git checkout -- <file>
git checkout branch

Değişiklikleri korumak istiyorsanız,

git stash save
git checkout branch
git stash pop

10
Romerun diyor Nitekim Ne (tam olduğu): git stash save(zaman branchy çalışma) daha sonra git checkout branchXbir şey yapmak git add/commit -mvb git checkout branchYve git stash popzulası geri almak için
Highmastdon

2
Belki bu yüzden. Cevabın söylediklerini yapmak istediğim bir durumum var, eğer doğru anlıyorsam: stash değişiklikleri, Y'den X'e geç, sonra pop değişiklikleri ve X'te taahhüt et.
Ben Klein

1
Not git stash saveşimdi lehine kullanımdan kaldırıldıgit stash push
Argento

Bu takma ad , dalları değiştirirken değişikliklerin tutulması durumunu basitleştirir.
Tom Hale

62

iyi olmalı

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
Evet, stash küreseldir, branşa özgü değildir, dalı değiştirdikten sonra pop saklarsam diğer dallarda aynı stash alırım
Aditya Mittal

6
Dikkat edilmesi gereken git stashvarsayılangit stash save
Charlie-Greenman

Teşekkür ederim, benim için çok yararlı
Govind Kumar


16

Uzak şubeleri birleştirdiyseniz veya yerel taahhütleriniz varsa ve uzak HEAD'e geri dönmek istiyorsanız şunları yapmanız gerektiğini unutmayın:

git reset --hard origin/HEAD

HEAD tek başına sadece yerel taahhüdü / birleştirmeyi ifade eder - birkaç kez sıfırlama ve "deponuz X önde gidiyor" ile bitirdiğimi unuttum. TÜM değişiklikleri / taahhütleri tamamen tıkamayı ve uzak şubeye geri dönmeyi amaçladığımda .


9

Git'te dallar arasında geçiş yaparken de değiştirilmesi gereken dosyalarda değişiklik yaptıysanız, izin vermez. Çalışan değişiklikleri atmak için şunu kullanın:

git reset --hard HEAD

Sonra şubeleri değiştirebileceksiniz.


9

Bu cevapların hiçbiri bana yardımcı olmadı çünkü sıfırlama ve saklamanın ardından hala izlenmemiş dosyalara sahiptim. Yapmak zorundaydım:

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

4

değişiklikleri kaybeden yeni bir şubeye geçme:

git checkout -b YOUR_NEW_BRANCH_NAME --force

değişiklikleri kaybeden mevcut bir şubeye geçme:

git checkout YOUR_BRANCH --force

4

Kolay Yanıt:

bir şubeyi ödemeye zorlamak

git checkout -f <branch_name>

Bir şubeyi kontrol etmeye zorlamak, git'e geçerli dalda yaptığınız tüm değişiklikleri bırakmasını ve istenen dalda ödeme yapmasını söylüyor.

veya bir taahhütte bulunmanız durumunda

git checkout -f <commit-hash>


"Taahhüt etmeden şubeleri değiştirebileceğimi düşündüm. Öyleyse, bunu nasıl ayarlayabilirim? Değilse, bu sorundan nasıl çıkabilirim?"

Bunun cevabı Hayır , kelimenin tam anlamıyla Git'in tüm değişikliklerini takip ettiğiniz felsefesidir ve her düğümün (yani taahhüt) yaptığınız son değişiklikler ile güncel olması gerekir. tabii ki yeni bir taahhütte bulundu.


Değişiklikleri korumaya mı karar verdiniz?

Sonra kullanarak saklayın

git stash

ve sonra istediğiniz daldaki değişikliklerinizin taslağını kaldırmak için şunu kullanın:

git stash apply

bu da değişiklikleri uygular, ancak bunları zu kuyruğunda tutar. Bunları yığın yığınında tutmak istemiyorsanız,

git stash pop

Bu eşdeğer applyve sonradrop


2

Terminali kapatın, projenizin bulunduğu klasörü silin, ardından projenizi ve klonunuzu tekrar klonlayın.


2
git sizi projeyi silmeye ve tekrar klonlamaya itmek için tasarlanmamıştır! en son sürümü orijinden almak istiyorsanız, sadece reset --hard!
Ahmed Nour Jamal El-Din

2

Değişiklikleri korumak ve dalı tek bir satır komutunda değiştirmek istiyorsanız

git stash && git checkout <branch_name> && git stash pop

1

Taranmamış değişiklikleri yeni bir şubeye taşıma

Bunun .gitconfigiçin bir takma ad oluşturdum :

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

Değiştirmek için şunu new-branch-namekullanın:

git spcosp new-branch-name

Ve işlenmemiş dosya ve dizin değişiklikleri korunur.


1

git checkout -f_burach_name

git checkout -f your_branch_name

değişiklikleri geri almada sorun yaşıyorsanız:

git checkout .

izlenmeyen dizinleri ve dosyaları kaldırmak istiyorsanız:

git clean -fd

0

Git stash çalışmadığında değişiklikleri gerçekleştirmeden diğer şubeye geçmek için. Aşağıdaki komutu kullanabilirsiniz:

git checkout -f şube-adı

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.