Mevcut, taahhüt edilmemiş işi Git'te yeni bir şubeye taşıma


3125

Yeni bir özellik üzerinde çalışmaya başladım ve biraz kodladıktan sonra bu özelliğin kendi dalında olması gerektiğine karar verdim.

Varolan taahhüt edilmemiş değişiklikleri yeni bir şubeye nasıl taşıyabilir ve mevcut şubemi nasıl sıfırlayabilirim?

Yeni özellikteki mevcut çalışmaları korurken mevcut şubemi sıfırlamak istiyorum.


Yanıtlar:


3642

Aşağıdakileri kullanın:

git checkout -b <new-branch>

Bu, mevcut dalınızı olduğu gibi bırakacak, yeni bir dal oluşturacak ve teslim alacak ve tüm değişikliklerinizi koruyacaktır. Daha sonra aşağıdakileri gerçekleştirmek için dosyalarda değişiklik yapabilirsiniz:

git add <files>

ve yeni şubenize aşağıdakileri taahhüt edin :

git commit -m "<Brief description of this commit>"

Çalışma dizinindeki değişiklikler ve dizinde aşamalı değişiklikler henüz hiçbir şubeye ait değil . Bu, bu değişikliklerin biteceği dalı değiştirir.

Sen yok reset onu olduğu gibi kalır, orijinal dalı. Son taahhüt <old-branch>hala aynı olacak. Bu nedenle siz checkout -bve sonra taahhüt edin.


2020 Güncellemesi / Git 2.23

Git 2.23 switch, aşırı yüklenmiş kullanımından checkout(dalları değiştirmek, dosyaları geri yüklemek, HEAD'ı ayırmak, vb.)

Git'in bu sürümünden başlayarak, yukarıdaki komutun yerine:

git switch -c <new-branch>

Davranış aynıdır ve değişmeden kalır.


15
Sadece emin olmak için, orijinal şubemi sıfırlamadan ÖNCE bitmemiş özelliği tamamlamam gerekiyor mu? Yoksa taahhüt edilmeyen dosyalar taahhütte bulunmaksızın korunacak mı?
Dane O'Connor

192
FYI: çalışma dizinindeki değişiklikler ve dizinde aşamalanan değişiklikler bir şubeye ait değil. git checkout -b <new branch>bu değişikliklerin sona ereceği yer.
Jakub Narębski

152
Zaten bir şubeniz varsa ve değişikliklerinizi mevcut şubeye taşımak istiyorsanız stackoverflow.com/questions/556923/…
Chirantan

14
Yeni şubenizi uzak depoya göndermek istiyorsanız: stackoverflow.com/questions/2765421/…
Dewayne

10
@JDSmith: talihsiz değişiklikler herhangi bir şubeye ait DEĞİLDİR . Sadece çalışma dizininde yaşıyorlar git checkout ./ git reset --hardkurtarılamaz bir şekilde onları kaldıracaklar
knittl

329

Alternatif:

  1. Geçerli değişiklikleri geçici bir saklama alanına kaydedin:

    $ git stash

  2. Bu zulayı temel alan yeni bir şube oluşturun ve yeni şubeye geçin:

    $ git stash branch <new-branch> stash@{0}

İpucu: saklamak adını yazmak için sekme tuşunu kullanın.


51
Diğer şube zaten varsa, o zaman ödeme ile geçiş yapabilirsiniz, o zaman git stash apply.
Archonic

6
"İpucu: saklamak adını yazmak için sekme tuşunu kullanın." İpucunu anlamıyorum. "Stash @ {0}" adı değil mi? Başarıyla çalıştıramıyorum.
Herbert

7
Neden bu kabul cevap daha iyidir stackoverflow.com/a/1394804/754997 ?
Chris Sayfa

10
Bunun neden kabul edilen cevabından daha iyi olduğunu anlamıyorumgit checkout -b <new branch name>
Noitidart

6
git add -ASaklamadan önce gerek yok .
vichle

48

Kodlarken ana dalınızda taahhütte bulunuyorsanız, ancak şimdi bu taahhütleri farklı bir şubeye taşımak istiyorsanız, bu hızlı bir yoldur:

  1. Mevcut geçmişinizi taahhüt edilmeyen değişiklikleri de getirerek yeni bir şubeye kopyalayın:

    git checkout -b <new-feature-branch>
    
  2. Şimdi orijinal "dağınık" dalı geri dönmeye zorlayın: (geçiş yapmadan)

    git branch -f <previous-branch> <earlier-commit-id>
    

    Örneğin:

    git branch -f master origin/master
    

    veya 4 taahhütte bulunduysanız:

    git branch -f master HEAD~4
    

Uyarı: git branch -f master origin/master olacak izleme bilgilerini sıfırlamak o şube için. Dolayısıylamaster, dalınızı başka bir yereorigin/mastergönderecek şekilde yapılandırdıysanız, bu yapılandırma kaybolacaktır.

Uyarı: Ayrıca, burada açıklanan dallamadan sonra yeniden ıslah ederseniz de bir tehlike vardır. Bundan kaçınmanın tek yolu kiraz toplama kullanarak yeni bir tarih yaratmaktır. Bu bağlantıda en güvenli aptal yöntem açıklanmaktadır . Taahhüt edilmemiş değişiklikleriniz varsagit stash, başlangıçta vegit stash popsonundayapmak isteyebilirsiniz.


6
Bu, op'un sorduğundan biraz farklı bir soruyu cevaplar. Bu cevabı buraya koymaya karar verdim çünkü Google, bir cevap ararken beni buraya getirdi. Bu durumla ilgili asıl soru burada .
joeytwiddle

26

Ortak senaryo aşağıdaki gibidir: Yeni özellik için yeni şube oluşturmayı unuttum ve eski özellik dalındaki tüm işleri yapıyordum. Tüm "eski" işleri ana dalda yaptım ve yeni dalımın "ana" dan büyümesini istiyorum. Yeni işimi tek bir taahhütte bulunmadım. İşte şube yapısı: "master" -> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

18

Taahhüt ederseniz, tek taahhüt kimliğini de seçebilirsiniz. Bunu genellikle master'da çalışmaya başladığımda yapıyorum ve daha sonra kökenime kadar itmeden önce yerel bir şube oluşturmak istiyorum.

git cherry-pick <commitID>

Burada açıklandığı gibi kiraz toplama ile yapabileceğiniz çok şey var , ancak bu sizin için bir kullanım örneği olabilir.


2
Kısmi değişiklikleri yeni bir şubeye taşımak için daha iyi bir çözüm ... şimdilik istediğinizi işleyebildiğiniz, diğer tüm değişiklikleri saklayabildiğiniz, dallamak istediğiniz dalı kontrol edin, yeni dalda kiraz seçimini yapın, geri dönün orijinal şubeye, bir kesin geri sıfırlama, sonra bir saklamak pop yapmak, eklemek, taahhüt ve şükretmek şarkı.
Meredith

1
@Meredith, haha, böyle bir şey ya. Değişikliklerinizi önceden planlamadığınız sürece bu harika ... ve bunu kim yapıyor;)
şifre

1

Bu, GIT için tüm kullanım araçlarına yardımcı olabilir

komuta

Şube değiştir - değişikliklerinizi yeni şubeye taşıyacaktır. Sonra değişiklikleri yapabilirsiniz.

 $ git checkout -b <new-branch>

TortoiseGIT

Deponuza sağ tıklayın ve ardından TortoiseGit-> Anahtarla / Satın Al'ı kullanın

resim açıklamasını buraya girin resim açıklamasını buraya girin

SourceTree

Şubeyi değiştirmek için "Checkout" düğmesini kullanın. Bir şubeye tıkladıktan sonra en üstte "ödeme" düğmesini göreceksiniz. Geçerli daldaki değişiklikler otomatik olarak uygulanır. O zaman onları taahhüt edebilirsiniz.

resim açıklamasını buraya girin


0

@Robin yanıtını kullandım ve yaptığım her şeyi listeledim,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! Reponun birden fazla saklaması varsa, yeni şubeye hangisinin uygulanacağına bakın:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

ve bireysel zulayı inceleyerek,

git stash show stash@{1}

Veya tüm depoları aynı anda inceleyin:

git stash list -p

0

Aslında GitHub Desktop ile bunu yapmanın gerçekten kolay bir yolu var, şimdi daha önce bir özellik olduğuna inanmıyorum.

Yapmanız gereken tek şey GitHub Desktop'taki yeni şubeye geçmek ve sizden değişikliklerinizi mevcut şubede (saklanacak) bırakmanızı veya değişikliklerinizi yeni şubeye getirmenizi isteyecektir. Değişiklikleri yeni şubeye getirmek için sadece ikinci seçeneği seçin. Daha sonra her zamanki gibi işlem yapabilirsiniz.

GitHub Masaüstü

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.