git pull
muhtemelen commit yaratıyor. Yerel bir kesinleştirme yapar ve daha git pull
sonra başka biri depoya bir işlem gönderdikten sonra çalıştırırsanız , Git diğer geliştiricinin kaydetmesini indirir ve ardından bunu yerel şubenizde birleştirir.
Gelecekte bu birleştirme taahhütlerinden nasıl kaçınılır?
git pull --rebase
Gelecekte bunun olmasını önlemek için kullanabilirsiniz , ancak yeniden yapmanın tehlikeleri vardır ve tamamen kaçınmanızı öneririmpull
.
Bunun yerine, bu kullanım modelini izlemenizi tavsiye ederim:
# download the latest commits
git remote update -p
# update the local branch
git merge --ff-only @{u}
# if the above fails with a complaint that the local branch has
# diverged:
git rebase -p @{u}
açıklama
git remote update -p
uzak depolardaki tüm kayıtları indirir ve uzaktan izleme dallarını günceller (örn., origin/master
). Çalışma dizininize, dizininize veya yerel şubelerinize dokunmaz.
-p
Argüman erik memba dalları silindi. Böylelikle, eğer depodaki foo
şube silinirse , referansınız otomatik olarak silinecektir .origin
git remote update -p
origin/foo
git merge --ff-only @{u}
Git'e yukarı akış dalını ( @{u}
argüman) yerel dalınıza birleştirmesini söyler, ancak yalnızca yerel dalınız yukarı akış dalına "hızlı iletilebilir "se (başka bir deyişle, ayrılmamışsa).
git rebase -p @{u}
Yaptığınız, ancak henüz yukarı akış dalının üstüne basmadığınız taahhütleri etkili bir şekilde hareket ettirir, bu da kaçınmaya çalıştığınız aptalca birleştirme taahhütlerini oluşturma ihtiyacını ortadan kaldırır. Bu, geliştirme geçmişinin doğrusallığını geliştirerek gözden geçirmeyi kolaylaştırır.
-p
Opsiyon Birleştirme korumak için Git söyler. Bu, Git'in yeniden yapılan taahhütleri doğrusallaştırmasını engeller. Örneğin, bir özellik dalını ile birleştirdiyseniz bu önemlidir master
. Olmazsa -p
, özellik dalındaki her master
işlem, tarafından yapılan doğrusallaştırmanın bir parçası olarak kopyalanır git rebase
. Bu, geliştirme geçmişinin gözden geçirilmesini kolaylaştırır, zorlaştırır.
Dikkat : git rebase
Yapmasını beklediğiniz şeyi yapmayabilir, bu yüzden zorlamadan önce sonuçları gözden geçirin. Örneğin:
git log --graph --oneline --decorate --date-order --color --boundary @{u}..
git pull --rebase
Aşağıdaki nedenlerden dolayı bu yaklaşımı tercih ediyorum :
- Onları dahil etmek için geçmişinizi değiştirmeden önce gelen yukarı akış taahhütlerini görmenizi sağlar .
- Kasıtlı bir birleştirmeyi yeniden düzenlemeniz gerektiğinde (örneğin, önceden itilmiş bir özellik dalının birleştirilmesi ) durumunda
-p
( --preserve-merges
) seçeneğini geçmenize izin verir .git rebase
master
Steno: git up
yerinegit pull
Yukarıdakileri yapmayı kolaylaştırmak için, şu adla bir takma ad oluşturmanızı öneririm up
:
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
Şimdi şubenizi güncellemek için yapmanız gereken tek şey çalıştırmak:
git up
yerine git pull
. Yerel şubeniz yukarı akış şubesinden ayrıldığı için bir hata alırsanız, bu yeniden ödeme için işaretinizdir.
Neden olmasın git pull --rebase
?
Koşu git pull --rebase
, git fetch
ardından gelen koşmaya eşdeğerdir git rebase
. Bu, yeni yukarı akış taahhütlerine hızlı ilerlemeye çalışır, ancak bu mümkün değilse, yerel taahhütlerinizi yeni yukarı akış taahhütlerine yeniden bağlar. Bu genellikle uygundur, ancak dikkatli olun:
- Yeniden taban, gelişmiş bir konudur ve yeniden düzenlemeden önce sonuçlarını anlamanız gerekir.
git pull --rebase
size taahhütleri dahil etmeden önce inceleme fırsatı vermez. Kaynak tarafı ne değiştirdi bağlı olarak, Rebase yanlış operasyon-bir olduğunu oldukça mümkündür rebase --onto
, merge
, reset
veya push -f
bir ovada daha uygun olabilir rebase
.
--preserve-merges
Rebase işlemine geçmek (şu anda) mümkün değildir , bu nedenle bir özellik dalının kasıtlı olarak birleştirilmesi doğrusallaştırılır, tüm özellik dalı taahhütlerini yeniden oynatır (ve böylece çoğaltır).
Tarafından oluşturulan mevcut bir birleştirme işleminin "düzeltilmesi" git pull
Tarafından oluşturulan bir birleştirme taahhüdünü henüz göndermediyseniz, birleştirme taahhüdünü yeniden git pull
ödeyebilirsiniz. Herhangi bir kasıtlı birleştirme yapmadığınızı varsayarsak (örneğin, zaten itilmiş bir özellik dalını mevcut dalınızla birleştirmek), aşağıdakiler yapmalıdır:
git rebase @{u}
Yukarıdaki komut olmayan birleştirme tüm erişilebilir taahhüt seçmek için Git söyler HEAD
(işlemek akımı), eksi tüm kaydedilmesini gelen Ulaşılamıyor @{u}
(yani "akıntıya karşı dalı" demenin kısa olduğu origin/master
takdirde HEAD
ise master
), yeniden oynatma (kiraz seçileni ) onları yukarı akış dalının üstüne getirin ve ardından geçerli dal referansını, taahhütlerin yeniden oynatılmasının sonucuna işaret edecek şekilde hareket ettirin. Bu, birleştirme olmayan taahhütleri etkili bir şekilde en yeni yukarı akış kaydetme işlemine taşır ve bu da tarafından oluşturulan birleştirmeyi ortadan kaldırır git pull
.
Kasıtlı bir birleştirme taahhüdünüz varsa git rebase @{u}
, diğer şubeden her şeyi yeniden oynatacağı için çalıştırmak istemezsiniz . Bu vakayla uğraşmak önemli ölçüde daha karmaşıktır, bu yüzden kullanmak git up
ve git pull
tamamen kaçınmak iyidir . Muhtemelen reset
tarafından oluşturulan birleştirmeyi geri almak için kullanmanız pull
ve sonra yapmanız gerekecek git rebase -p @{u}
. -p
Argüman git rebase
kullanmak zorunda sonunda olabilir bu yüzden benim için güvenilir bir işe yaramadı reset
kasıtlı birleştirme işlemini etmek, için yerel şube güncellemek @{u}
ve sonra tüylü birleştirme bir sürü olsaydı bir ağrı olduğu (kasıtlı birleştirme yinelemek anlaşmazlıklar).