Remote master ile yerel şubeye nasıl rebase


934

Uzak depodan bir ana daldan klonlanmış bir projem var remote_repo. Yeni bir şube yaratıyorum ve o dalı taahhüt ediyorum. Diğer programcılar remote_repoana şubeye ittiler .

Şimdi şubemdeki RB'yi remote_repoustaya yeniden yatırmam gerekiyor .

Bu nasıl yapılır? Bir terminale hangi komutlar yazılır?


14
Benim için bu soru belirsizdir, çünkü "ile" her iki yönde yeniden basmak anlamına gelebilir. Ben niyet şubenize rebase olduğunu görüyoruz cevapları baktığımızda üzerine uzaktan ustası değil başka bir yol. Birisinin aşağıda bir cevabı takip etmesi ve istediklerinin tersini alması durumunda bahsediyorum.
Glenn Lawrence

8
@GlennLawrence Orijinal soruyu düzenlemenin yorum eklemekten daha iyi olduğunu düşünüyorum. Bu, yığın akışı tarafından da teşvik edilir. Ayrıca, master'ı RB'ye yeniden basmak muhtemelen başarısız olacaktır, çünkü RB master'ın tarihine bağlıdır.
daniel kullmann

Yanıtlar:


1245

Önce yeni master'ı yukarı akış deposundan getirin, ardından çalışma dalınızı bu konuda yeniden temellendirin:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Güncelleme : Aynı şeyi yapmanın daha kısa bir yolu için lütfen Paul Draper'ın cevabına bakın - son Git sürümleri yukarıdaki iki komutun eşdeğerini yapmak için daha basit bir yol sağlar.


16
bu aslında ne istediğini yapan tek cevap
kayaker243

5
@ kayaker243 Hayır, Paul Drapers'ın cevabı ile aynı ama uzun formda, sanırım.
erik

7
@erik Paul Draper'ın cevabını kayaker243'ün yorumundan yaklaşık yarım yıl sonra (ve bu cevaptan neredeyse iki yıl sonra) yazdığını unutmayın.
Frerich Raabe

3
Aşağıdakileri alıyorum: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.Başka bir şeye git pullihtiyaç var gibi görünüyor . Bu doğru mu yoksa burada bir şey mi kaçırıyorum?
Dror

2
@RGC Hayır, git rebase masterikinci komuta (aynı işi yapmayacağım git rebase origin/masterçünkü) masterve origin/masterde farklı kaydedilmesini işaret edebilir (özellikle ilk komut olarak verilen bu git fetch origindeğiştirebilir ki, origin/master).
Frerich Raabe

815
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]

19
(Frerich'in cevabına eşdeğer)
Paul Draper

12
Bu Frerich'in cevabından biraz farklı değil, çünkü bu asıl üstattan yerel üstata değişiklik yapacak, Frerich'in cevabı ise yerel üsta dokunulmamış mı? (çek ve getir)
Jimmy Huch

7
Hayır, Frerich'in cevabında, rebase yerel ustayı değiştirir. Çekme
adhominem

9
FYI ile etkileşimli git pull --rebase=interactive origin master
referanslar

14
@adhominem - Git-pull belgelerini kontrol ettim ve yerel yöneticinin değiştirildiği iddiasını destekleyen hiçbir şey göremiyorum. Eğer adı verilen devve çalıştırılan bir daldaysam git pull --rebase origin master, sadece dal devdeğiştirilir, değiştirilmez master. --rebaseBayrak belgeleri bu girişiminde belirten rebase the current branch on top of the upstream branch after fetchingyerel izleme dalları değiştirmeyle ilgili hiçbir şey.
Monica 2331977

227

Şubenizde değişiklik yaptıktan sonra depodan masteren son değişiklikleri almak için ödeme yapın ve çekin:

git checkout master
git pull origin master

Ardından şubenizi kontrol edin ve değişikliklerinizi şunun üzerine yeniden yatırın master:

git checkout RB
git rebase master

... veya bir satırdaki son iki komutu:

git rebase master RB

Geri itmeye çalışırken origin/RB, muhtemelen bir hata alırsınız; Eğer tek çalışansanız RB, zorla itebilirsiniz:

git push --force origin RB

... veya git uygun şekilde yapılandırıldıysa aşağıdaki gibi:

git push -f

4
başlangıç ​​noktasına / RB'ye geri dönmeye çalışırken, muhtemelen bir hata alırsınız. RB üzerinde çalışan tek kişi sizseniz, itme kuvveti RB'ye gidebilirsiniz. Kaynak: stackoverflow.com/questions/8939977/…
Joey Baruch

1
Ah .... Tam olarak buna sahibim. benim "RB" doğru olarak yeniden, ama rebase sonra itmeye çalışırken sonsuz hatalar alıyorum. İtme kuvveti kökenli RB - bunu yapmanın "daha hoş" (zorla değil) bir yolu var mı? Burada gits algısını anlamaya çalışıyorum - ve başarısız oluyorum.
Motti Shneor

2
@MottiShneor Hayır, güzel bir yol yok. Bu sırada başka biri şubeye doğru iterse, değişiklikleri kaybolur! Git taahhüdü geçmişine iyi davranmak istiyorsanız, ustası şubenize birleştirmeyi tercih etmelisiniz, ki bu da güvenlidir ( git pushonsuz yapabilirsiniz -f).
daniel kullmann

110

Not: Rebase hakkında zaten geniş bilgiye sahipseniz, hızlı rebase için bir astarın altında kullanın. Çözüm: Çalışma kolunuzda olduğunuzu ve üzerinde çalışan tek kişi olduğunuzu varsayarsak.

git fetch && git rebase origin/master

Çakışmaları giderin, kodunuzu test edin, uzak şubeye yeni değişiklikler uygulayın ve yeni şubelere aktarın.

                            ~:   For noobs   :~

Aşağıdaki adımlar, yeni olan git rebaseve sorunsuz bir şekilde yapmak isteyen herkese yardımcı olabilir

Adım 1: Bu noktada YourBranch'ta herhangi bir taahhüt ve değişiklik yapılmadığı varsayılarak. YourBranch'ı ziyaret ediyoruz.

git checkout YourBranch
git pull --rebase

Ne oldu? Şubenizde çalışan diğer geliştiriciler tarafından yapılan tüm değişiklikleri çeker ve değişikliklerinizi bunun üzerine dayandırır.

2. Adım: Sunulan çakışmaları giderin.

Aşama 3:

git checkout master
git pull --rebase

Ne oldu? Remote master'daki en son değişiklikleri alır ve yerel master'ı remote master'a yeniden yükler. Remote master'ı her zaman temiz tutar ve serbest bırakırım! Ve sadece yerel olarak master veya branşlarda çalışmayı tercih edin. Git değişikliklerini veya taahhütlerini öğrenene kadar bunu yapmanızı öneririm. Not: Yerel master sürdürmüyorsanız, bu adım gerekli değildir, bunun yerine uzak master'ı doğrudan yerel şubeye getirebilir ve yeniden başlatabilirsiniz. Başlangıçta tek adımda belirttiğim gibi.

4. Adım: Sunulan çakışmaları giderin.

Adım 5:

git checkout YourBranch
git rebase master

Ne oldu? Master'da Rebase olur

Adım 6: Çatışmalar varsa, çatışmaları giderin. git rebase --continueÇözülmüş çakışmaları ekledikten sonra yeniden tabanlamaya devam etmek için kullanın . İstediğiniz zaman git rebase --abortrebase'i iptal etmek için kullanabilirsiniz .

7. Adım:

git push --force-with-lease 

Ne oldu?Değişiklikleri uzaktan YourBranch'ınıza gönderme. --force-with-leaseyeniden oluştururken YourBranch için diğer geliştiricilerden gelen başka değişiklikler olup olmadığından emin olursunuz. Bu, zorlamaktan çok süper yararlıdır. Herhangi bir değişiklik olması durumunda, değişiklikleri itmeden önce yerel YourBranch'ınızı güncellemek için bunları getirin.

Neden değişiklikleri zorlamam gerekiyor?Uygun Your Rebran sonra uzak YourBranch taahhüt mesajı yeniden yazmak veya Herhangi bir anlaşmazlık çözüldü Varsa? Ardından, yerel repoda çözdüğünüz değişiklikleri YourBranch'ın uzak repo'suna aktarmanız gerekir

Yahoooo ...! Yeniden basma ile başarılı bir şekilde işiniz bitti.

Ayrıca şunları da yapıyor olabilirsiniz:

git checkout master
git merge YourBranch

Ne zaman ve neden? Siz ve diğer ortak geliştiriciler tarafından yapılan değişikliklerle şubenizi ustalıkla birleştirin. Bu, daha sonra aynı dalda çalışmak istediğinizde YourBranch'ınızı usta ile güncel hale getirir.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~

Bunun için: "Master'daki en son değişiklikleri alır ve master'ı en son master'a yeniden basar." Master'da master yeniden oluşturulsun mu? Sadece son ustayı çekmen gerekmiyor mu?
John Little

@JohnLittle İşaret ettiğiniz için teşekkürler. Yani Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Açıklamamı güncelleyeceğim.
bh4r4th

21

Aşama 1:

git fetch origin

Adım 2:

git rebase origin/master

Adım 3: (Çatışma varsa düzeltin)

git add .

4. Adım:

git rebase --continue

Adım 5:

git push --force

5
Hangi şubenin başlayacağına dair açıklama yok. İyi bir cevap değil.
Karl Morrison

12

1. önce Master güncelleyin ...

git checkout [master branch]
git pull [master branch]

2. şimdi ana şube ile rebase kaynak-şube

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

Kaynak dalı henüz uzaktan kumandada yoksa EĞER:

git push -u origin [source branch]

"et voila ..."


Bu cevabın adım adım doğasını seviyorum. Tam olarak olup bitenleri parçalamaya yardımcı olur.
Dave Liu

6

git fetch origin master:master kontrol etmeye gerek kalmadan master'ın son sürümünü çeker.

Tek ihtiyacınız olan şey:

git fetch origin master:master && git rebase master 👌


git fetchMaster'ı da kontrol etmenize gerek kalmadan güncellemiyor mu ? Bunun dışında git fetchdeğil git mergegüncellemeler doğru mu? Yani, ödeme yaparsak masteren son güncellemelere sahip olmaz. Bu yüzden, özellik dal üzerinde iken yapmak daha kısa değil git fetcho zaman git rebase origin/master? Biz yapamayız git rebase masterbundan rebase çalışacağız çünkü masterçalışma alanında, ihtiyacımız origin/masterbirleştirilmemiş almak ancak yerel oturan.
Noitidart
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.