git resettaşıma hakkında hepsi HEAD, ve genellikle şube ref .
Soru: çalışma ağacı ve indeks ne olacak?
İle kullanıldığında --soft, hareket eder HEAD, en sık olarak dal ref ve yalnızcaHEAD .
Bu, aşağıdakilerden farklıdır commit --amend:
- yeni bir kayıt oluşturmaz.
- (o aslında herhangi kesinleştirme için HEAD taşıyabilirsiniz
commit --amendsadece hakkındadır değil HEAD hareketli işlemek akımını yeniden yapmak izin verirken,)
Şu birleştirme örneğini buldum:
- klasik bir birleştirme
- alt ağaç birleştirme
hepsi bir arada (ahtapot, ikiden fazla dal birleştiği için) birleştirmeyi taahhüt eder.
Tomas "wasHamster" Carnecky "Subtree Octopus birleştirme" makalesinde şöyle açıklıyor :
- Alt ağaç birleştirme stratejisi, bir projeyi başka bir projenin bir alt diziniyle birleştirmek ve ardından alt projeyi güncel tutmak istiyorsanız kullanılabilir. Git alt modüllerine bir alternatiftir.
- Ahtapot birleştirme stratejisi, üç veya daha fazla dalı birleştirmek için kullanılabilir. Normal strateji yalnızca iki dalı birleştirebilir ve bundan fazlasını birleştirmeye çalışırsanız git otomatik olarak ahtapot stratejisine geri döner.
Sorun, yalnızca bir strateji seçebilmenizdir. Ancak, tüm deponun atomik olarak yeni bir sürüme güncellendiği temiz bir geçmiş elde etmek için ikisini birleştirmek istedim.
Bir süper projem var, hadi onu adlandıralım projectAve bir alt projectBdizini ile birleştirdiğim bir alt projem var projectA.
(bu alt ağaç birleştirme kısmı)
Ayrıca birkaç yerel taahhüdü sürdürüyorum.
ProjectAdüzenli olarak güncellenir, projectBher iki günde veya haftada bir yeni bir sürümü vardır ve genellikle ürününün belirli bir sürümüne bağlıdır projectA.
Her iki projeyi de güncellemeye karar verdiğimde, sadece çekmiyorum projectAve projectB bu, tüm projenin atomik bir güncellemesi olması gereken şey için iki taahhüt yaratır. .
Bunun yerine, tek bir birleştirme hangi biçerdöverler işlemek oluşturmak projectA, projectBve benim yerel kaydedilmesini .
Buradaki zor kısım, bunun bir ahtapot birleştirme (üç kafa) olması, ancak projectBalt ağaç stratejisiyle birleştirilmesi gerektiğidir . Yani yaptığım şey bu:
# Merge projectA with the default strategy:
git merge projectA/master
# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master
Burada yazar a kullandı reset --hardve ardından read-treeilk iki birleştirmenin çalışma ağacına ve dizine yaptıklarını geri yüklemek için, ancak bu reset --softyardımcı olabilir:
İşe yarayan bu iki birleştirmeyi nasıl yeniden yaparım , yani çalışma ağacım ve dizinim iyi, ama bu iki kaydı kaydetmek zorunda kalmadan?
# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}
Şimdi, Tomas'ın çözümüne devam edebiliriz:
# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD
# And finally do the commit:
git commit
Yani her seferinde:
- Sonuçta elde ettiğiniz şeyden memnunsunuz (çalışma ağacı ve dizin açısından)
- sizi oraya götüren tüm işlemlerden memnun değilsiniz :
git reset --soft cevap.
git reset --soft: stackoverflow.com/questions/6869705/…