Git: Kalıpta yüklenmemiş / taahhüt edilmemiş değişikliklerden bir dal oluşturun


991

Bağlam: Basit bir özellik ekleyerek master üzerinde çalışıyorum. Birkaç dakika sonra bunun o kadar basit olmadığını ve yeni bir dalda çalışmanın daha iyi olması gerektiğini fark ettim.

Bu her zaman başıma geliyor ve başka bir şubeye nasıl geçileceğimi ve ana dalı temiz bırakarak tüm bu değişmemiş değişiklikleri nasıl alacağımı bilmiyorum. Ben git stash && git stash branch new_branchsadece bunu başarmak gerekiyordu ama ben bu olsun:

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ echo "hello!" > testing 

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)

~/test $ git s
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git checkout master
M   testing
Switched to branch 'master'

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

Bunu başarmanın bir yolu olup olmadığını biliyor musunuz?


1
Sorununuz için daha basit bir çözüm olmasına rağmen, elde ettiğiniz sonuçta ne istediğinizden farklı olduğunu belirtebilir misiniz?
Gauthier

2
yukarıdakileri veya alttaki cevapları yaparak, değişmemiş değişiklikler hem master hem de yeni dalda olur. Onları sadece yeni dalda istiyorum, bu yüzden bu değişiklikleri yüzer kalmadan master kontrol edebilir ve başka bir şey üzerinde çalışabilirim
knoopx

1
düzenlenmiş cevabımı gör. Temiz bir yöneticiye göz atmak istiyorsanız, yerel şubelerinizi yeni şubede yapmanız gerekir. Yerel değişiklikler yalnızca geçerli KAFA ile diskteki dosyalarınız arasındaki farklardır. Yerel dosyalarda bu değişiklikler sürümlendirilmemiş, git'i daha sonra almak istiyorsanız bir yere kaydetmelerini söylemeniz gerekir.
Gauthier

Yanıtlar:


1207

Saklanmaya gerek yok.

git checkout -b new_branch_name

yerel değişikliklerinize dokunmuyor. Sadece mevcut HEAD'den dal oluşturur ve HEAD'ı oraya ayarlar. Sanırım istediğin bu.

--- Ödeme ana sonucunu açıklamak için düzenleyin ---

Kafanız karıştı çünkü checkout masterdeğişikliklerinizi atmıyor mu?

Değişiklikler yalnızca yerel olduğundan, git onları çok kolay kaybetmenizi istemez. Şube değiştirildikten sonra git, yerel değişikliklerinizin üzerine yazmaz. Sonuçlarınız checkout master:

M   testing

, yani çalışma dosyalarınız temiz değil. git HEAD'i değiştirdi, ancak yerel dosyalarınızın üzerine yazmadı. Bu nedenle, açık olmanıza rağmen son durumunuz hala yerel değişikliklerinizi gösterir master.

Yerel değişiklikleri gerçekten atmak istiyorsanız, kasayı zorlamanız gerekir -f.

git checkout master -f

Yaptığınız değişiklikler hiçbir zaman yapılmadığı için onları kaybedersiniz.

Şubenize geri dönmeye, değişikliklerinizi yapmaya çalışın, ardından ustayı tekrar kontrol edin.

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

Mİlk ödeme işleminden sonra bir ileti almanız gerekir , ancak daha sonra artık değiştirilmemelidir checkout masterve git statusdeğiştirilmiş dosya gösterilmemelidir.

--- Çalışma dizini hakkındaki karışıklığı gidermek için Düzenle (yerel dosyalar) ---

İlk yorumunuza yanıt olarak, yerel değişiklikler sadece ... yereldir. Git onları otomatik olarak kaydetmez, daha sonra kullanmak üzere kaydetmesini söylemelisiniz. Değişiklik yapar ve bunları açıkça taahhüt etmez veya saklamazsanız, git bunları sürümlemez. HEAD ( checkout master) öğesini değiştirirseniz , kaydedilmemiş olduğundan yerel değişikliklerin üzerine yazılmaz.


32
Burada kafa karıştırıcı olan şey, git'in man sayfasında git checkout“Çalışma ağacındaki dosyaları dizindeki veya belirtilen ağaçtaki sürümle eşleşecek şekilde günceller” ifadesini belirtir. Bu, dosya sisteminizdeki değişikliklerinizin GONE olacağını varsayar . Onları geri alma şansı olmadan. Olmayacaklarını söyleseniz bile, bu hala çok kötü bir his bırakır. Bunu güvenmiyorum hiç . Ya belgeler gerçekten kötü ya da git'in varsayılan davranışı gerçekten tehlikeli. Bu durumda değişikliklerinizi kaybetmek istemediğinizi tespit etmek için bazı “otomajik” buluşsal yöntemlere güvenmek gerekmemelidir.
Evi1M4chine

16
Yerel değişikliklerinizin üzerine yazılacak bir taahhüdü kontrol ediyorsanız (geçerli işlem ile hedef işlem arasındaki geçmiş yerel olarak değiştirilmiş dosyalarınıza dokunuyorsa) git reddeder. Yalnızca checkoutyerel değişikliklerinizle çelişmezse, ödeme çalışır ve yerel değişiklikleri tek başına bırakır. Ben kötü hissi anlıyorum, adam sayfası belki de "Çalışma ağacındaki değiştirilmemiş dosyaları günceller" demelidir. Git ise yerel değişiklikleri kaybetmeyi çok kolaylaştırmaz. git checkoutyerel değişikliklerinizin tek başına yapılmasına izin verir veya bir çakışma olursa reddeder.
Gauthier

1
Peki, yerel değişiklikleri oraya getirmeden başka bir şubeye nasıl ödeme yapabilirim?
ス レ ッ ク ス

5
@Alex git checkout <other_branch> -f. Uyarı yapmadan yerel değişikliklerinizi kaybedeceksiniz.
Gauthier

2
@ Evi1M4chine İlki. Dokümantasyon olduğunu gerçekten kötü.
Qwertie

62

Deneyin:

git stash
git checkout -b new-branch
git stash apply

6
Bu sadece kendi başına 'git checkout -b new-branch' yapmaktan farklı mıdır?
Adrian Mouat

Cevabın ilk yazıldığı zaman olduğunu sanmıyorum, ama yanılmış olabilirim. Ne yazık ki çalışma durumumdan dolayı, son birkaç yıldır performans kullanıyorum, bu yüzden şimdi doğruluğunu kanıtlayamıyorum.
Grant Limberg

6
Veya son iki adım yerine: git stash branch new-branch
rethab

1
git stash artık gerekli değil
kory

Tüm eşyalarınızı koymak istediğiniz mevcut bir şubeniz olduğunda, stash benim için anlamlıdır: (Sonunda git fetch --all; uzak dalı başlangıç ​​noktasına getirmek için) git stash; git checkout <var-branch>; git stash uygulayın;
Paolof76

24

Yapabileceğiniz iki şey:

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

veya

git stash -u
git branch sillyname stash@{0}

( git checkout -<- tire, bulunduğunuz önceki dal için bir kısayoldur)

( git stash -u<- -uetiketsiz değişiklikler de aldığı anlamına gelir)


7

GitHub Windows istemcisini (benim gibi) kullanıyorsanız ve yeni bir şubeye taşımak istediğiniz taahhüt edilmemiş değişiklikler yapmışsanız, GitHub istemcisi aracılığıyla "Yeni bir şube sandık" yapabilirsiniz. Yeni oluşturulan şubeye geçecek ve değişikliklerinizi koruyacaktır.

resim açıklamasını buraya girin


yeni dalı oluşturmadan önce değişiklikleri saklar, böylece onları tutmaz (Mac OS'de sürüm 223)
Fernando Gallego

2

Geçerli daldaki şu anda kullanılmamış değişikliklerinizin yeni bir dala taşınmasını istiyorsanız, yeni bir dal oluşturmak ve taranmamış değişiklikleri otomatik olarak kopyalamak için aşağıdaki komutu kullanın.

git checkout -b branch_name

Bu işlem, geçerli dalınızdan yeni bir dal oluşturur (master olduğu varsayılarak), taahhüt edilmemiş değişiklikleri kopyalar ve yeni şubeye geçer.

Yeni şubeye değişikliklerinizi yapın.

git commit -m "First commit"

Yeni bir dal oluşturulduğundan, uzaktan kumandayı itmeden önce, yukarı akış ayarlamanız gerekir. Yukarı akışı ayarlamak ve uzaktan kumandaya itmek için aşağıdaki komutu kullanın.

git push --set-upstream origin feature/feature/NEWBRANCH

Bu komuta bastığınızda, uzaktan kumandada yeni bir dal oluşturulur ve yeni yerel dalınız uzaktan kumandaya itilir.

Şimdi, taahhüt edilmemiş değişikliklerinizi ana daldan atmak istiyorsanız, şunu kullanın:

git checkout master -f

Bu işlem, ödeme sırasında taahhüt edilmeyen yerel değişiklikleri atar.


Bu cevap kabul edilen cevaptan nasıl farklı?
kometen

Kabul edilen cevapla bazı çakışmalar olsa da, bu adım adım basit bir kılavuz sağlar ve ayrıca yeni bir dalı uzaktan itmek için gerekli işlemleri içerir. Basit, açık ve kullanışlı.
Kjartan

Bu cevap açık ve bana çok yardımcı oldu.
Vadim

0

Windows için en son GitHub istemcisinde , taahhüt edilmemiş değişiklikleriniz varsa ve yeni bir şube oluşturmayı seçin. Bu tam senaryonun nasıl ele alınacağını sorar:

resim açıklamasını buraya girin

Şube de değiştirirseniz aynı şey geçerlidir.

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.