Git pull --rebase'i ne zaman kullanmalıyım?


806

git pull --rebaseVarsayılan olarak kullanan bazı insanlar ve asla kullanmamak için ısrar eden bazı insanlar biliyorum . Birleştirme ve yeniden basma arasındaki farkı anladığımı düşünüyorum, ama bunu bağlamına koymaya çalışıyorum git pull. Sadece birleştirme taahhüdü mesajlarını görmek istememekle mi ilgili, yoksa başka sorunlar var mı?


1
Git pull --rebase'e karşı tavsiyede bulunanlar için kaynak? Rebase veya git rebase git pull --rebase'den ayrı bir etkinliktir !
przemo_li

Yanıtlar:


584

Ne git pull --rebasezaman kullanmalısınız?

  • değişiklikleriniz ayrı bir dalı hak etmiyor

Gerçekten - neden o zaman olmasın? Daha açıktır ve taahhütlerinize mantıklı bir gruplama getirmez .


Tamam, sanırım biraz açıklığa ihtiyacı var. Git'te, muhtemelen bildiğiniz gibi, dallanıp birleştirilmeniz teşvik edilir. İçinde değişiklikler yaptığınız yerel dalınız ve uzak dal aslında farklı dallardır ve git pullbunları birleştirmekle ilgilidir. Çok sık itmediğiniz ve genellikle tamamlanmış bir özellik oluşturmadan önce bir dizi değişiklik biriktirdiğiniz için makul.

Ancak, bazen - ne sebeple olursa olsun - bu ikisinin - uzak ve yerel - bir dal olmasının daha iyi olacağını düşünüyorsunuz . SVN'de olduğu gibi. İşte burada git pull --rebasedevreye giriyor. Artık birleştirme yapmıyorsunuz - aslında uzak dalın üstündesiniz . Aslında bununla ilgili.

Tehlikeli olup olmadığı, yerel ve uzak şubeye ayrılmaz bir şey olarak davranıp davranmadığınız sorusudur. Bazen mantıklıdır (değişiklikleriniz küçük olduğunda veya güçlü bir gelişimin başlangıcındaysanız, önemli değişiklikler küçük taahhütler tarafından getirildiğinde). Bazen değildir (normalde başka bir şube oluşturduğunuzda, ancak bunu yapmak için çok tembelsiniz). Ama bu farklı bir soru.


17
Aynı dalda çalışmanın faydalı olduğunu düşünüyorum, ancak iş istasyonunuzu değiştirebilirsiniz. Değişikliklerimi bir iş istasyonundan taahhüt etme ve zorlama, sonra diğerinde yeniden taban oluşturma ve aynı dal üzerinde çalışmaya devam etme eğilimindeyim.
Pablo Pazos

11
Git'i çekildikten sonra otomatik olarak yeniden başlayacak şekilde ayarlamak yararlıdır git config --global pull.rebase preserve (koru, yeniden basmayı etkinleştirmeye ek olarak, yerel olarak birleştirme yaptıysanız birleştirme işlemlerini korumaya çalışır).
Colin D Bennett

2
Ben sadece bir şube üzerinde çalışırken pull - rebase kullanmanız gerektiğini kabul etmiyorum. Başka bir durum nedeniyle imkansız olmadığı sürece her zaman kullanmalısınız.
Tomáš Fejfar

@P Shved ... 'Ancak, bazen - ne sebeple olursa olsun - bu iki - uzak ve yerel - bir şube olmanın aslında daha iyi olacağını düşünüyorsunuz' ... bu yapılabilir mi? yerel ortamda, şubemi ve uzak dal aynasını başlangıç ​​/ master olarak alabilirim. Yuo lütfen buraya girdi sağlayabilir mi?
Mandroid

736

Bazen "git pull --rebase" nin ne anlama geldiğine farklı bir bakış açısı sunmak istiyorum, çünkü bazen kayboluyor gibi görünüyor.

Subversion (veya CVS) kullandıysanız, "svn update" davranışına alışık olabilirsiniz. Değişikliklerin üst akışta yapıldığı için taahhütte değişiklikleriniz varsa ve taahhüt başarısız olursa, "svn update" (svn update). Subversion, yukarı akış değişikliklerini sizinkiyle birleştirerek, muhtemelen çatışmalara neden olarak ilerler.

Subversion'ın az önce yaptığı şey aslında "çekin - rebase" idi. Yerel değişikliklerinizi daha yeni sürüme göre yeniden formüle etme işlemi, bunun "yeniden temellendirme" bölümüdür. Başarısız tamamlama girişiminden önce "svn diff" işlemini gerçekleştirdiyseniz ve elde edilen farkı daha sonra "svn diff" çıktısıyla karşılaştırdıysanız, iki fark arasındaki fark yeniden bastırma işleminin yaptığıdır.

Bu durumda Git ve Subversion arasındaki en büyük fark, Subversion'da "sizin" değişikliklerinizin yalnızca çalışma kopyanızdaki taahhütlü olmayan değişiklikler olarak mevcut olması, Git'te ise yerel olarak gerçek taahhütlerinizin olmasıdır. Başka bir deyişle, Git'te geçmişi çatalladınız; geçmişiniz ve yukarı akış tarihiniz birbirinden ayrıldı, ancak ortak bir atalarınız var.

Benim düşünceme göre, yerel şubenizin sadece yukarı akış dalını yansıtması ve üzerinde sürekli gelişim yapması normal durumda, yapılacak doğru şey her zaman "- rebase" dir, çünkü anlamsal olarak gerçekte yaptığınız şey budur . Siz ve diğerleri, bir dalın amaçlanan doğrusal geçmişine saldırıyorsunuz. Denemenizden önce birisinin biraz itmeye başlamış olması önemsizdir ve bu tür zamanlama kazalarının her birinin tarihte birleşmelerle sonuçlanması için karşı üretken görünmektedir.

Herhangi bir nedenden ötürü bir şeyin şube olması gerektiğini düşünüyorsanız, bence bu farklı bir kaygıdır. Ancak değişikliklerinizi birleştirme biçiminde temsil etmek için özel ve aktif bir arzunuz yoksa, varsayılan davranış, bence, "git pull --rebase" olmalıdır.

Lütfen projenizin geçmişini gözlemlemesi ve anlaması gereken diğer insanları düşünün. Tarihin her yerde yüzlerce birleşmeyle dolmasını mı istiyorsunuz, yoksa sadece kasıtlı ıraksak gelişme çabalarının gerçek birleşimlerini temsil eden seçkin birkaç birleşmeyi mi istiyorsunuz?


18
@MarceloCantos Açık olmak gerekirse, git (araç) varsayılan olarak rebase için gerektiğini söylemiyorum. Bir rebase aslında tarihi yok ettiği için bu tehlikeli olurdu. Ben iş akışı açısından, şube niyetinde değilken ve sadece diğer insanların da üzerinde çalıştığı bazı şube hack zaman, "git pull --rebase" kullanıcının varsayılan davranış olması gerektiğini söylüyorum.
scode

1
Bunu yapmaman gerektiğini mi söylüyorsun git config --global branch.autosetupmerge always?
Marcelo Cantos

9
@MarceloCantos Hayır değilim;) Şahsen ben autosetupmerge ast varsayılan olarak varsayılan bırakacaktı (yerel <-> uzak dışındaki dallar arasında geri ve dördüncü birleştirirseniz, açık olmasını istiyorum). Ben sadece bir insan olarak, her zaman "git pull --rebase" i normal "ana daldaki son tut" iş akışımın bir parçası olarak kullandığımı söylüyorum, çünkü açıkça dallanmadığım sürece hiçbir zaman birleştirme taahhüdü oluşturmak istemiyorum.
scode

9
+1 @scode. Rebase / merge sorusuyla uğraşan birçok acı dolu saatten sonra, nihayet onu çivilenen bir cevap.
AgileYogi

10
Bu cevap, dağıtılmamış sürüm kontrol sistemleri kullanıcılarını uygun şubelere sahip olmanın faydalarını düzgün bir şekilde anlama şansı vermek yerine Git'e uyarlama çabasıdır.
Alexey Zimarev

211

Belki de bunu açıklamanın en iyi yolu bir örnektir:

  1. Alice konu dalını A oluşturur ve üzerinde çalışır
  2. Bob ilgisiz konu dalı B yaratır ve üzerinde çalışır
  3. Alice yapar git checkout master && git pull. Master zaten güncel.
  4. Bob biliyor git checkout master && git pull. Master zaten güncel.
  5. Alice yapar git merge topic-branch-A
  6. Bob yapar git merge topic-branch-B
  7. Bob git push origin masterAlice'den önce yapar
  8. Alice bunu git push origin masterreddediyor, çünkü bu hızlı ileri bir birleştirme değil.
  9. Alice kökeni / ustanın kütüğüne bakar ve taahhüdün onunla alakasız olduğunu görür.
  10. Alice yapar git pull --rebase origin master
  11. Alice'in birleştirme taahhüdü çözülür, Bob'un taahhüdü çekilir ve Alice'in taahhüdü Bob'un taahhüdünden sonra uygulanır.
  12. Alice yapar git push origin masterve herkes gelecekte günlüklere baktıklarında işe yaramaz birleştirme taahhüdü okumak zorunda olmadıkları için mutludur.

Birleştirilen belirli dalın örnekle alakasız olduğunu unutmayın. Bu örnekteki Master, aynı zamanda bir serbest bırakma dalı veya geliştirme dalı olabilir. Kilit nokta Alice & Bob'un yerel şubelerini aynı anda paylaşılan bir uzak şubeye birleştirmesidir.


2
Güzel. git co master && git pull; git checkout topic-branch-A; git rebase master; git checkout master; git merge topic-branch-A; git push origin masterBaşkalarının ustalığa itme baskısı benden önce olursa, açık olma eğilimindeyim ve tekrar ediyorum. Gerçi tarifindeki özlü avantajları görebiliyorum.
HankCa

@Cody Poll
Rajanikanta Pradhan

148

git pull --rebaseAynı dalda başkalarıyla işbirliği yaparken kullanmanız gerektiğini düşünüyorum . İşinizde → taahhüt → iş → taahhüt döngüsünde bulunuyorsunuz ve çalışmanızı zorlamaya karar verdiğinizde, itişiniz reddediliyor, çünkü aynı dalda paralel çalışma var. Bu noktada hep bir pull --rebase. Squash kullanmıyorum (taahhütleri düzleştirmek için), ancak ekstra birleştirme taahhütlerinden kaçınmak için yeniden temellendiriyorum.

Git bilginiz arttıkça, geçmişte kullandığım diğer sürüm kontrol sistemlerinden çok daha fazla şey bulduğunuzu görüyorsunuz. Bir ton küçük birleştirme taahhüdünüz varsa, geçmişinizde gerçekleşen daha büyük resmin odağını kaybetmek kolaydır.

Bu aslında yeniden basma (*) yaptığım tek zaman ve iş akışımın geri kalanı birleştirme tabanlı. Ancak, en sık kullandığınız komisyonlar bunu yaptığı sürece, tarih sonunda çok daha iyi görünür.

(*) Bir Git kursunu öğretirken bir öğrenci beni bu konuda tutukladı. Ve bu cevabı okumuştu;) Böyle bir yeniden temellendirme de mümkündür, ancak her zaman önceden düzenlenmiş / üzerinde anlaşılmış bir sisteme göre olmalıdır ve bu nedenle "her zaman" uygulanmamalıdır. Ve o zaman genellikle ben de pull --rebaseyapmıyorum, bu da sorunun ne olduğudur;)


2
şüphesiz biri günlükten birleştirme taahhütlerini gizlemek için bir senaryo yazabilir
hasen

3
Birleşmeler de farklı olabilir, yani tamamen önemsiz değil
krosenvold

9
@hasen j Evet, ancak bu birleştirmelerin İÇERİĞİ önemli olabilir
krosenvold

Bu cevap seçilen cevapla karşılaştırıldığında belirsiz ve düşüncelidir: “aynı dal” ile tam olarak ne demek istiyorsun? Ancak seçilen cevapta olmayan bazı iyi noktalar vardır.
iwein

1
"Dal" etrafındaki belirsizlikler oldukça kasıtlıdır, çünkü ref'leri kullanmanın pek çok yolu vardır; "iş kolu" sadece bir seçenektir.
krosenvold

49

Bir sebebi orada hiç sanmıyorum değil kullanımına pull --rebase- Özellikle benim izin Git kod ekledik git pulldaima yukarı hareketin kaydedilmesini karşı rebase komutu.

Tarihe bakarken, özellik üzerinde çalışan adamın / gal'in senkronize etmek için ne zaman durduğunu bilmek asla ilginç değildir. Bunu yaparken adam / gal için yararlı olabilir, ama bunun reflogiçin var. Sadece herkes için gürültü katıyor.


2
"Tarihe bakarken, özellik üzerinde çalışan adamın senkronizasyon için ne zaman durduğunu bilmek asla ilginç değildir." / ama bu, bu ara taahhütlerin büyük olasılıkla bozuk yapılar olduğu anlamına gelmiyor mu?
eglasius

10
Evet, aynı zamanda bir "bütün devlet" de değiller. Bu yüzden onları istemiyoruz. Ne istediğini bilmek istiyorum, oraya nasıl geldiğini değil.
Dustin

4
Her pull --rebasezaman kullanılması gerekiyorsa, neden pullvarsayılan olarak yapmıyor?
straya

2
Korkarım kendi fikrinizi oluşturmak zorunda kalacaksınız. Yaşıyorum benim, birkaç şeyler var .gitconfigseçeneklerden bazıları doğru olanı yetinmek. Git rebase varsayılan olarak, git etiketi gibi yanlış bir şey yapıyor sanırım ... Eğer katılmıyorsanız, fikrinizi haklı çıkarmanıza gerek yok.
Dustin

8
Eğer "yukarı akış" dan çekin, diyelim masterve içine çektiğiniz şube (henüz) halka açılmadıysa bu iyi bir tavsiye gibi görünüyor . Öte yandan bir özellik dalından masterdaha çok diğer tarafa doğru çekerseniz : asla kullanmak için bir neden yoktur --rebase, değil mi? Bu, varsayılan olmamasının nedeni olabilir. Rebaes, değişikliklerin hiyerarşinin üstünden aşağıya nasıl geçmesi gerektiğini ve birleşmelerin geriye doğru nasıl aktıklarını buldum. derekgourlay.com/blog/git-when-to-merge-vs-when-to-rebase
jolvi

38

Sadece hatırlıyorum:

  • pull = getir + birleştir
  • çekme - rebase = getir + rebase

Bu nedenle, şubenizi ne şekilde ele almak istediğinizi seçin.

Birleştirme ve rebase arasındaki farkı daha iyi bilirseniz :)


9

Bence kişisel bir tercihe bağlı.

Değişikliklerinizi zorlamadan önce saçma hatalarınızı gizlemek ister misiniz? Eğer öyleyse, git pull --rebasemükemmel. Daha sonra taahhütlerinizi birkaç (veya bir) taahhütte ezmenize izin verir. (Bilinmeyen) geçmişinizde birleşmeleriniz varsa, git rebasedaha sonra yapmak kolay değildir .

Şahsen tüm aptalca hatalarımı yayınlamam umrumda değil, bu yüzden rebase yerine birleşme eğilimindeyim.


8
Bu soruyu görüntüleyen herkese not: Bu cevap "git pull --rebase ne zaman kullanılmalı?" Sorusuyla tamamen alakasız.
therealklanni

3
@therealklanni Cevabı düzenledim, bu yüzden sorunun ne kadar alakalı olduğu netleşiyor (umarım amacı yok etmeden).
Paŭlo Ebermann

Kirli ve yapılandırılmamış bir çalışma günlüğünü paylaşmak dürüst bir çaba değildir, sadece tembelliktir. İnsanları, tavşan geliştirme ve hata ayıklama deliğinizden takip etmelerini sağlayarak zaman harcıyorsunuz; saçma sapanlara değil, sonuç verin.
krystah

8

git pull --rebasebir ortak çalışandan geçmiş yeniden yazmayı gizleyebilir git push --force. git pull --rebase Sadece bir başkasının aynısını yapmadan önce taahhütlerinizi zorlamayı unuttuğunuzu biliyorsanız kullanmanızı tavsiye ederim .

Hiçbir şey yapmadıysanız, ancak çalışma alanınız hemen git stashönce temiz değil git pull. Bu şekilde geçmişinizi sessizce yeniden yazmazsınız (bu da işlerinizin bir kısmını sessizce bırakabilir).

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.