Neden “uzaktan izleme şubesini 'başlangıç ​​/ geliştirme' bölümünü geliştirmek için birleştiriyorum”?


126

Kuruluşumda aşağıdaki mesajla taahhütte bulunan tek kişi benim:

Uzaktan izleme şubesini 'kaynak / geliştir'i geliştirmeye birleştirin

Onlara neden olmak için ne yaptığımdan emin değilim, ama durdurmak istiyorum.

Bu commit'i yaratmak için hangi komutu veriyorum ve onu üretmemek için kullanmam gereken uygun komut nedir?


1
Richard Hansen tarafından verilen cevap gayet iyi. Ama yeni başlayanlar için kafa karıştırıcı olabileceğini düşünüyorum. Benim çözümüm çekmeye devam etmektir, ancak tehlikeyi önlemek için değişiklikleri çekmeden önce saklarım. Sonra çektikten sonra uygularım. Anlaşmazlıkları çözerim. Sonunda taahhüt edebilir ve zorlayabilirim.
Johnjohn

Does git pull --autostash --rebaseEğer @Johnjohn için çalışma?
sourcedelica

Yanıtlar:


206

git pullmuhtemelen commit yaratıyor. Yerel bir kesinleştirme yapar ve daha git pullsonra 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 --rebaseGelecekte 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 -puzak depolardaki tüm kayıtları indirir ve uzaktan izleme dallarını günceller (örn., origin/master). Çalışma dizininize, dizininize veya yerel şubelerinize dokunmaz.

    -pArgüman erik memba dalları silindi. Böylelikle, eğer depodaki fooşube silinirse , referansınız otomatik olarak silinecektir .origingit remote update -porigin/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.

    -pOpsiyon 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 masteriş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 rebaseYapması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 --rebaseAş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 rebasemaster

Steno: git upyerinegit 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 fetchardı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 --rebasesize 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, resetveya push -fbir ovada daha uygun olabilir rebase.
  • --preserve-mergesRebase 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/mastertakdirde HEADise 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 upve git pulltamamen kaçınmak iyidir . Muhtemelen resettarafından oluşturulan birleştirmeyi geri almak için kullanmanız pullve sonra yapmanız gerekecek git rebase -p @{u}. -pArgüman git rebasekullanmak zorunda sonunda olabilir bu yüzden benim için güvenilir bir işe yaramadı resetkası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).


--Preserve-merges tartışmak için +1, ancak bunu ona çalıştırmasını söylediğiniz komutlarda belgelememiş olmanız dışında, bunun için -1.
Seth Robertson

@Seth: Yorumunuz için teşekkürler; Yanıtı tavsiye etmek için güncelledim -p. Daha önce tavsiye etmekten kaçındım çünkü çok sık ihtiyaç duyulmuyor ve davranışları iyi belgelenmemiş.
Richard Hansen

3
Ne kimliği arasındaki farkı git remote update -pve git fetch?
2013

3
@eckes: git remote update -pile aynıdır git fetch --all -p. Seçeneğim olmadığında git remote update -pgeri kullanma alışkanlığı edindim . fetch-p
Richard Hansen

1
@ user1914692: Birleştirme tamamlandıktan sonra Git, yerel şubeyi, uzak dal ile aynı işleme değil, yeni oluşturulan birleştirme işlemine işaret edecek şekilde güncelleyecektir. Bu yeni birleştirme taahhüdü, özellikle zorlandığında sorun yaratır.
Richard Hansen

18
git fetch
git rebase origin/master

Bunu yapmalı. Veya çekmeyi kullanmaya devam etmek istiyorsanız

git pull --rebase

Ayrıca bu şubeyi yapılandırmanızda otomatik olarak yeniden temel alacak şekilde kurabilir veya ileride yapacağınız diğer izleme dalları için otomatik olarak bu şekilde ayarlayabilirsiniz. Sonra sadece kullanmaya geri dönebilirsiniz

git pull

Bu sayfanın "birleştirmek yerine yeniden tabanla çek" bölümünde daha fazla bilgi:

http://mislav.uniqpath.com/2010/07/git-tips/

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.