Git hızlı ileri değil reddedildi


88

Bu sorunun birçok kez sorulduğunu hissediyorum, ancak çözüm genellikle "dizini sildim ve işimi yeni bir ödeme ile yeniden yaptım." Bir taahhüt ve zorlama yaptım ancak taahhüt mesajında ​​yanlış bilet numarasına atıfta bulunduğumu fark ettim. Bu yüzden hızlı bir çözüm için SO'ya baktım ve aşağıdakileri terminale yazdım :

$ git reset --soft HEAD^
$ git commit -m "... correct message ..."

Tek sorun şu hata mesajını alıyorum:

To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

Git-flow modelini kullanıyorum ve geliştirme dalı üzerinde çalışıyorum. Git'i tekrar mutlu etmek için işleri nasıl yeniden birleştirebilirim?


Yanıtlar:


52

Kuvvet git push:

git push origin +develop

24
Bu bir çözüm, ancak Brian Campbell'ın yorumunu okuyun, böylece bunu kullanmadan önce ne yaptığınızı anlayın.
thelem

5
git push origin + master
Aniket Thakur

İlgili nota bakın receive.denyNonFastForwardsyılında Brian Campbell cevap : +ya --forceonlar-kim onlar-var olan yapılandırma şekline göre, yeterince güçlü olmayabilir onların Git depo.
torek

174

Eğer itmek Bir sunucuya taahhüt ve sonra (yerel olarak işlemek olduğunu yeniden git reset, git rebase, git filter-branchveya başka bir tarih manipülasyon) ve sonra yeniden yazılmış sunucuya geri taahhüt olduğunu itilmiş, sen çekmişti başkasının berbat edecektir. İşte bir örnek; A işlemini yaptığınızı ve sunucuya ittiğinizi söyleyin.

- * - * - A <- ana

- * - * - A <- başlangıç ​​/ ana

Şimdi, bahsettiğiniz şekilde, sıfırlayarak ve yeniden taahhüt ederek A'yı yeniden yazmaya karar veriyorsunuz. Bunun, ulaşılamadığından sonunda çöp olarak toplanacak olan sarkan bir tamamlama A bıraktığını unutmayın.

- * - * - A
    \
     A '<- usta

- * - * - A <- başlangıç ​​/ ana

Başkası varsa Fred diyelim aşağı çeker master siz bunu yaparken sunucudan , çalışmaya başlayabilecekleri A'ya bir referansı olacaktır:

- * - * - A '<- usta

- * - * - A <- başlangıç ​​/ ana

- * - * - AB <- fred / ana

Şimdi, A 'nızı başlangıç ​​/ ana konuma itebilseydiniz, bu hızlı ileri sarma yaratmaz, tarihinde A'ya sahip olmazdı. Yani Fred tekrar çekmeye çalışırsa, aniden birleşmek zorunda kalacak ve A kaydını yeniden tanıtacaktı:

- * - * - A '<- usta

- * - * - A <- başlangıç ​​/ ana

- * - * - AB- \ 
    \ * <- fred / usta
     A '- /

Fred bunu fark ederse, bir yeniden ödeme yapabilir, bu da A işleminin yeniden görünmesini engeller. Ama bunu fark etmesi ve bunu yapmayı unutmaması gerekir; ve eğer A'yı düşüren birden fazla kişi varsa, ağaçta fazladan A taahhüdü almaktan kaçınmak için hepsinin yeniden ödeme yapması gerekir.

Bu nedenle, başkalarının çektiği bir deponun tarihini değiştirmek genellikle iyi bir fikir değildir. Bununla birlikte, bu depodan başka kimsenin çekmediğini biliyorsanız (örneğin, bu sizin kendi özel deponuz veya proje üzerinde çalışan, kolayca koordine edebileceğiniz başka bir geliştiriciniz varsa), o zaman zorla çalıştırarak güncelle:

git push -f

veya

git push origin +master

Bunlar hem hızlı ileri olmayan itme kontrolünü yok sayacak, hem de sunucudakileri yeni A 'revizyonunuza güncelleyecek, A revizyonunu terk ederek sonunda çöp toplanacaktır.

receive.denyNonFastForwardsYapılandırma seçeneğiyle zorla itmelerin tamamen devre dışı bırakılması mümkündür . Bu seçenek, paylaşılan havuzlarda varsayılan olarak etkindir. Bu durumda, gerçekten, gerçekten bir itmeyi zorlamak istiyorsanız, en iyi seçenek dalı silmek ve ile yeniden oluşturmaktır git push origin :master; git push origin master:master. AncakdenyNonFastForwards seçenek, yukarıda açıklanan bir nedenle etkinleştirilmiştir; Paylaşılan bir havuzda, artık onu kullanan herkesin yeni geçmişe geri döndüğünden emin olması gerektiği anlamına geliyor.

Paylaşılan bir depoda, genel olarak, yaşadığınız sorunu çözen yeni taahhütleri en üste itmek daha iyidir; git revertönceki taahhütlerdeki değişiklikleri geri alacak taahhütler oluşturmak için kullanabilirsiniz .


harika bir eğitim ve sonunda emri aldın, ama branşıma geliştirme (git-akışına göre) adı verildi ve diğer adam +developemrini verdi - yani çek ona gidiyor. Yine de astronomik bir puanınız var: P
rynmrtn

8
Ya da daha az şifreli git push --force
olanı

3
@Panique Birkaç kişinin aynı anda büyük, karmaşık bir kod tabanı üzerinde, birbirini engellemeden (bir seferde yalnızca bir kişinin üzerinde çalışmasına izin vererek) ve birbirinin üzerine yazmadan değişiklikler yapmasına izin vermeye çalışıyorsunuz. Her kişinin bağımsız olarak değişiklik yapabilmesi ve bu değişiklikleri birleştirebilmesi için ihtiyacınız var. Birleştirme (ister manuel ister otomatik olsun) beklenmedik sorunlara yol açabilir; Bu nedenle, yanlış giderse ne olduğunu anlayabilmek için olabildiğince fazla bilgiyi saklamak istersiniz. Bu, doğası gereği karmaşıktır; kirli değil, sadece zor bir problem.
Brian Campbell

Uzak repo geçmişini yeniden yazmak için hem -f hem de + seçeneğini denedim. Her iki seçenekte de hızlı ileri olmayan bir sorunla karşılaştım. [5:05 PM] $ git push -f kaynak local_A: remote_A Sayma nesneleri: 35, tamamlandı. En fazla 2 iş parçacığı kullanarak delta sıkıştırması. Nesnelerin sıkıştırılması:% 100 (18/18), yapıldı. Nesne yazma:% 100 (21/21), 7.41 KiB, bitti. Toplam 21 (delta 9), yeniden kullanılan 0 (delta 0) uzak: Geçmişi kaybetmenizi önlemek için, hızlı ileri olmayan güncellemeler reddedildi. Tekrar basmadan önce uzaktan değişiklikleri (örn. 'Git pull') birleştirin. Ayrıntılar için 'git push --help'in' Hızlı ileri alma hakkında not 'bölümüne bakın.
Srikanth

4
@Srikanth receive.denyNonFastForwardsYapılandırma seçeneği ile zorunlu itmeleri tamamen devre dışı bırakmak mümkündür . Bu seçenek, paylaşılan havuzlarda varsayılan olarak etkindir. Bu durumda, gerçekten, gerçekten bir itmeyi zorlamak istiyorsanız, en iyi seçenek dalı silmek ve ile yeniden oluşturmaktır git push origin :remote_A; git push origin local_A:remote_A. Ancak yukarıda yazdıklarımı, bu tür bir iş akışını paylaşılan bir depoda yapmanın neden kötü bir fikir olduğunu okuyun. Bunu yalnızca kurtulmaya veya yeniden yazmaya çalıştığınız işlemde ciddi sorunlara neden olan bir şeyiniz varsa yapmaya çalışmalısınız.
Brian Campbell

14

Bir git pullşeyleri sizin için otomatik olarak birleştirebilecek bir şey yapmanız gerekebilir . Sonra tekrar taahhüt edebilirsiniz. Çakışmalarınız varsa, sizden bunları çözmenizi isteyecektir.

Gitconfig'inizi belirtmek için güncellemediyseniz hangi şubeden çekileceğini belirtmeniz gerektiğini unutmayın ...

Örneğin:

git pull origin develop:develop

Hâlâ ileri sarılmamaya kızgın. Onu nasıl birleşmeye zorlayacağınıza dair herhangi bir fikriniz var mı? ! [rejected] develop -> develop (non-fast-forward)
rynmrtn

Sanırım geçiş -f ama yanılıyor olabilirim. kernel.org/pub/software/scm/git/docs/git-pull.html
Tony

Bu kısmen çalışıyor. Yine de git push origin develop
github'daki

7

EGit kullanıyordum ve bu sorunla da karşılaştım. Sadece rebasemevcut şubeyi denedim ve işe yaradı.

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.