Aynı anda birkaç böcek üzerinde çalışmak kesinlikle gerekli mi? "Aynı anda" demek istediğim "dosyaların aynı anda birden çok hata için düzenlenmesi." Çünkü buna kesinlikle ihtiyacınız olmadığı sürece, ortamınızdaki her seferinde sadece bir hata üzerinde çalışacağım. Bu şekilde karmaşık şubeleri / aşamaları yönetmekten çok daha kolay bulduğum yerel şubeleri ve rebase'i kullanabilirsiniz.
Diyelim ki usta B işinde. Şimdi hata # 1 üzerinde çalışın.
git checkout -b bug1
Şimdi şube hata 1'de. Bazı değişiklikler yapın, taahhüt edin, kod incelemesini bekleyin. Bu yereldir, bu yüzden kimseyi etkilemezsiniz ve git diffs'den bir yama yapmak yeterince kolay olmalıdır.
A-B < master
\
C < bug1
Şimdi bug2 üzerinde çalışıyorsunuz. İle master yapmaya geri dön git checkout master
. Yeni bir dal yap git checkout -b bug2
. Değişiklik yapın, taahhüt edin, kod incelemesini bekleyin.
D < bug2
/
A-B < master
\
C < bug1
İncelemeyi beklerken başkasının E & F'yi ustalıkla taahhüt ettiğini varsayalım.
D < bug2
/
A-B-E-F < master
\
C < bug1
Kodunuz onaylandığında, aşağıdaki adımlarla ustalaşmak için kodu yeniden oluşturabilirsiniz:
git checkout bug1
git rebase master
git checkout master
git merge bug1
Bu aşağıdakilerle sonuçlanacaktır:
D < bug2
/
A-B-E-F-C' < master, bug1
Ardından, yerel bug1 dalınızı itebilir, silebilir ve yola çıkabilirsiniz. Çalışma alanınızdaki her seferinde bir hata, ancak yerel dalları kullanarak deponuz birden çok hatayı işleyebilir. Ve bu karmaşık bir sahne / stash dansı önler.
Yorumlarda ctote'nin sorusuna cevap verin:
Her hata için saklamaya geri dönebilir ve bir seferde yalnızca bir hata ile çalışabilirsiniz. En azından sahneleme sorununu kurtarır. Ama bunu denedikten sonra, kişisel olarak zahmetli buluyorum. Zımbalar git günlük grafiğinde biraz dağınıktır. Ve daha da önemlisi, bir şeyi mahvederseniz, geri dönemezsiniz. Kirli bir çalışma dizininiz varsa ve bir zulayı açarsanız, o pop'u "geri alamazsınız". Mevcut taahhütleri bertaraf etmek çok daha zordur.
Yani git rebase -i
.
Bir dalı diğerine yeniden adlandırdığınızda, etkileşimli olarak yapabilirsiniz (-i bayrağı). Bunu yaptığınızda, her taahhütte ne yapmak istediğinizi seçme seçeneğiniz vardır. Pro Git, HTML biçiminde de çevrimiçi olan ve yeniden bastırma ve ezme konusunda güzel bir bölüme sahip harika bir kitap:
http://git-scm.com/book/ch6-4.html
Kolaylık sağlamak için örneklerini aynen çalacağım. Aşağıdaki işlem geçmişine sahip olduğunuzu varsayın ve bug1'i master'a yeniden oluşturmak ve ezmek istediğinizi varsayalım:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
İşte yazarken görecekleriniz git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Bir dalın tüm taahhütlerini tek bir taahhütte ezmek için, ilk taahhüdü "pick" olarak saklayın ve sonraki tüm "pick" girişlerini "squash" veya basitçe "s" ile değiştirin. İşlem mesajını da değiştirme fırsatı elde edersiniz.
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
Yani evet, ezmek biraz acı verici, ama yine de ağır miktarda saklamak için tavsiye ederim.