Mevcut şubenizin bahşişi geride olduğu için güncellemeler reddedildi


158

Git'te yeniyim, bu yüzden bana bir acemi gibi davranmakta özgürsünüz.

Bizim iş akışımız böyle. Biz denilen bir şube var devben de ulaşabilir origin/dev. Değişiklikler yaptığımızda, dev kapalı bir dal oluştururuz:

git checkout -b FixForBug kaynağı / dev

Şimdi FixForBugizleme adında bir şubem var (bence bu doğru kelime) origin/dev. Bu nedenle, eğer yaparsam git pullyeni değişiklikler getireceğimorigin/dev , harika olan . Şimdi, düzeltmemi bitirdiğimde, aynı adı verilen uzak bir şubeye gidiyorum.

İlk önce herhangi bir değişikliği aşağı origin/devçekiyorum ve bir geri ödeme yapıyorum:

git çekme --rebase

Sonra değişiklikleri aynı adı taşıyan uzak bir dala gönderiyorum:

git itme kaynağı FixForBug

Şimdi, uzak sunucuda bir dal var ve bu değişikliğin onaylanması ve geliştirici dalına yeniden birleştirilmesi için bir çekme isteği oluşturabilirim. Ben yok hiç bir şey itmek origin/devkendim. Sanırım bu oldukça yaygın bir iş akışı.

A'yı ilk yaptığımda git pushiyi çalışıyor ve uzak dalı yaratıyor. Bununla birlikte, ikinci kez basarsam (diyelim ki kod incelemesi sırasında birisi bir soruna işaret eder), aşağıdaki hatayı alıyorum:

hata: ' https://github.limeade.info/Limeade/product.git ' ' e bazı referanslar gönderilemedi ipucu: Güncel dalınızın ucu ipucu: uzaktaki karşılığı olduğu için güncellemeler reddedildi. Tekrar basmadan önce uzaktan değişiklikleri (örn. İpucu: 'git pull ...') entegre edin. ipucu: Ayrıntılar için 'git push --help'deki' Hızlı ilerlemelerle ilgili not'a bakın.

Bununla birlikte, eğer bir yaparsam , 1 işlemden git statusönde olduğumu söylüyor origin/dev(bu mantıklı) ve ipucunu takip edip koşarsam git pull, her şeyin güncel olduğunu söylüyor. Sanırım bunun sebebi yukarı havza şubemden farklı bir şubeye gitmem. Bu sorunu şunu çalıştırarak çözebilirim:

git push -f origin FixForBug

Bu durumda, (zorunlu güncelleme) diyerek değişiklikleri uzak şubeye gönderir ve uzak dalda her şey iyi görünür .

Sorularım:

-fBu senaryoda neden gereklidir? Genellikle bir şeyi zorladığınızda , bunun nedeni yanlış bir şey yaptığınız veya en azından standart uygulamaya aykırı olduğunuz içindir. Bunu yapmakta sorun olmayacak mı, yoksa uzak dalda bir şeyi mahvedecek mi yoksa sonunda öğelerimi dev ile birleştirmek zorunda kalan kişi için bir güçlük yaratacak mı?


2
Görünüşe göre aldığınız mesaj uzaktaki FixForBug şubesinin FixForBug yerel şubenizin önünde olduğunu söylüyor. İtmeden önce bu uzak daldaki değişiklikleri aşağı çekmeli ve bunları yerel şubenizde birleştirmelisiniz.
mhatch

4
@mhatch - git pull origin FixForBugBen buna zorlamadan önce temelde koşmak mı? Tamam bu mantıklı. Cevap olarak eklemekten çekinmeyin!
Mike Christensen

Yanıtlar:


205

-f Olduğu aslında çünkü rebase gerekli. Ne zaman bir geri ödeme yaparsanız, bir force push yapmanız gerekir çünkü uzak şube, taahhüdünüze hızlı bir şekilde iletilemez. Sen ediyorum hep emin itmeden önce bir çekme yapmak yapmak istiyorum, ancak bu konuda master veya dev kuvvet itme için sevmiyorum, sen bas için yeni bir şube oluşturmak ve daha sonra birleştirme veya PR yapabilirsiniz .


2
Bu çok faydalı cevap için teşekkürler! :)
AIM_BLB

1
"İtmeden önce her zaman bir çekme yaptığınızdan emin olmak istersiniz" konusunu netleştirebilir misiniz? Yerel şubenin yeniden başlatılmasından sonra neden "push -f" nin gerekli olduğu açıktır. Bu durumda, itmeden önce uzaktan kumandadan bir çekme yaparak yerelin yeniden temeli geri alınmayacak mı?
haripkannan

51

FixForBug yerel şubenizin uzak dal FixForBug'un önünde olmadığından emin olmak için, itmeden önce değişiklikleri çekin ve birleştirin.

git pull origin FixForBug
git push origin FixForBug

2
OP, çoktan git çekip itmeyi denediklerini belirtti. Cevabınız OP'nin sorusu için geçerli değil.
Patrick

1
Zorla itmekten kaçınmak her zaman daha iyidir. Bunu paylaştığınız için teşekkürler!
Ann Kilzer

20

the tip of your current branch is behind its remote counterpartuzak dalda yerel olarak sahip olmadığınız değişiklikler olduğu anlamına gelir. ve git yeni değişiklikleri içeri aktardığınızı REMOTEve kodunuzla birleştirip ardından pushuzak konuma getirmenizi söyler .

Yerel repo () ile sunucuda değişiklik yapmaya zorlamak için bu komutu kullanabilirsiniz.

git push -f origin master

ile -fetiketiyle Eğer geçersiz kılar Remote Brach code, kodunuzu.


16

Kullanmaktan kaçınmak -fistiyorsanız, yalnızca

git pull

onun yerine

git pull --rebase

Olmayan Rebase gelen değişiklikleri alıp bunu origin/devve birleştirme senin içine FixForBugdal. Sonra koşabileceksin

git push origin FixForBug

kullanmadan -f.


3
Rebase, buradaki iş akışımızın bir parçasıdır. Yapmazsam bana bağırılırım.
Mike Christensen

1
@MikeChristensen: Tamam, o zaman elbette belgelenmiş prosedürü takip edin. Açıkladığınız kadarıyla, kullanmak gerekecektir -fsen çünkü yerine farklı (rebased) geçmişi var farklı olanlarla yukarı depo üzerinde taahhüt (s). Gerrit gibi bir ürün kullanacaksanız , bu tür bir yeniden adlandırma kodu inceleme iş akışını -f, itme sırasında kullanmak zorunda kalmadan destekler . Gerrit'i işte bu şekilde kullanıyoruz ve çok iyi çalışıyor.
Greg Hewgill

6

Azure DevOps ile karşılaştığımda "Güncel dalınızın ipucu geride kaldığı için güncellemeler reddedildi" mesajıyla karşılaştığımda kullandığım komut şu komuttu:

git çekme kaynağı yöneticisi

(veya yeni bir klasörle başlayıp bir Klonlama yapabilir) ..

Bu yanıt, özellikle sorulan soruyu ele almıyor, Keif yukarıda bunu cevapladı, ancak sorunun başlığını / başlık metnini yanıtlıyor ve bu, Azure DevOps kullanıcıları için ortak bir soru olacak.

Keif'in yukarıdaki cevabına şu yorumu not ettim: "İtmeden önce her zaman bir çekme yaptığınızdan emin olmak istersiniz"!

Git komut satırı aracına ek olarak Git Gui aracını da kullandım.

(Git Gui'de "git pull origin master" komut satırı komutunun eşdeğerini nasıl yapacağımdan emin değildim, bu yüzden bunu yapmak için komut satırına döndüm).

Gerçekleştirmek isteyebileceğiniz çeşitli eylemler için çeşitli git komutlarını gösteren bir diyagram şudur:

görüntü açıklamasını buraya girin


4

Bu benim başıma geldi.

  • Dün ustamıza bir talepte bulundum.
  • Meslektaşım bugün gözden geçiriyordu ve ana şubemizle uyumsuz olduğunu gördü, bu yüzden bana yardım etmek amacıyla ustayı şubemle birleştirdi.
  • Bunu yaptığını bilmiyordum.
  • Daha sonra ustayı yerel olarak birleştirdim, itmeye çalıştım ama başarısız oldu. Neden? Benim Çünkü ustayla meslektaşı birleştirme bir ekstra yarattı Ben yerel yoktu işlemek !

Çözüm: Kendi şubemi aşağı çekin, böylece ekstra taahhüt elde edebilirim. Sonra onu uzaktaki şubeme geri itin .

anlamıyla Yaptığımın benim dala oldu:

git pull
git push

3

Sorunumu böyle çözdüm

Diyelim ki yukarı akış şubesinden çatal aldığınız ve kaynağınız sizin deponuz ve yukarı akış şubesine bir MR / PR göndermek istiyorsunuz.

Zaten 4 kaydetme hakkınız var ve alıyorsunuz Updates were rejected because the tip of your current branch is behind.

İşte yaptığım şey

İlk olarak, 4 kaydetmenizin tümünü ezin

git rebase -i HEAD~4

Üzerinde pickyazılı olan bir taahhüt listesi alacaksınız . (bir düzenleyicide açılır)

misal

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4

için

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4

Bundan sonra, birleşik işlemenizi kaydedebilirsiniz

Sonraki

Taahhüdünü saklaman gerekecek

İşte nasıl

git reset --soft HEAD~1
git stash

şimdi yukarı akış şubenizle yeniden temel alın

git fetch upstream beta && git rebase upstream/beta

Şimdi zulalanmış kayıtlarınızı patlatın

git stash pop

bu değişiklikleri uygulayın ve uygulayın

git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f

2

Taahhüt, mevcut hamlenizin önünde olduğu için olmalı.

1) git çekme kaynağı "itmek istediğiniz dalın adı"

2) git rebase

git rebase başarılıysa, o zaman iyidir. Aksi takdirde, tüm birleştirme çakışmalarını yerel olarak çözmüş olursunuz ve uzaktan kumanda ile yeniden başlatma başarılı olana kadar devam ettirirsiniz.

3) git rebase - devam


0

Bu sorunu Visual Studio Code üzerinden bir geri ödemeden sonra göndermeye çalışırken yaşadım, sorunum yalnızca komutu git çıktı penceresinden kopyalayıp Visual Studio Code'daki terminal penceresinden çalıştırarak çözüldü.

Benim durumumda komut şöyle bir şeydi:

git push origin NameOfMyBranch:NameOfMyBranch


0

Kayıtlarınıza aktarılmamış yeni dosyalar eklemiş olmalısınız. Dosyayı kontrol edin ve o dosyayı tekrar itin ve çekmeyi / itmeyi deneyin. Bu benim için çalıştı ..

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.