git: uzaktan kumanda yerel olarak sahip olmadığınız işleri içerdiğinden güncellemeler reddedildi


115

BitBucket'ta git kullanan birkaç geliştiriciden oluşan bir ekip üzerinde çalışıyorum. Hepimiz bir devdal üzerinde çalışıyoruz, masterserbest bırakılıncaya kadar zorlamıyoruz.

Geliştiricilerden biri, yanlışlıkla kendi kodumun üzerine yazan yanlış bir kod işledi ve şimdi doğru kodu depoya geri göndermeye çalışıyorum. Birkaç gündür bu hatayı okuyorum, artık depoya itemiyorum çünkü aşağıdaki hatayı alıyorum:

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://myusername@bitbucket.org/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Talimatları takip ediyorum ve pullsonra bir birleştirme çatışması alıyorum. Birleştirme çakışması için bir mesaj girdikten sonra, yerel kodum artık diğer geliştiricinin kazayla yüklediği yanlış kod (ondan beklendiği gibi pull). Bu yüzden hatalı kodu, işlem yapmadan önce kopyaladığım yedekle değiştiriyorum ve tekrar basmaya çalıştığımda aynı hatayı alıyorum.

Gerçekten sinir bozucu, takımıma gerçekten yardım etmek ve katkıda bulunmak istiyorum, ancak bu hata yüzünden yapamıyorum. Bu sorunu nasıl çözeceğini bilen var mı? Herhangi bir yardım için çok minnettar olurum.

Herhangi birine yardımcı olursa, uygulamak için çalıştırdığım komutlar:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

Bu düzeni muhafaza edersem, birleştirme anlaşmazlıkları almayacağımı düşünürdüm. Sanırım yanılmışım. Tekrar teşekkürler

Güncelleme: Ben farklı talimatlar Google ve stackoverflow birkaç saat baktı ve takip olduğunu eklemek gerekir, ama yine de yapamam pushiçin devşube.

Yanıtlar:


42

git pull <remote> master:devremote/masterşubeyi alacak ve şubenize birleştirecektir local/dev.

git pull <remote> devremote/devdalı alacak ve mevcut şubenizle birleştirecektir.

Sanırım çakışan kesinleştirme işleminin açık olduğunu söyledin remote/dev, bu yüzden muhtemelen getirip birleştirmeyi düşündüğün dal budur.

Bu durumda, aslında çatışmayı yerel şubenizle birleştirmiyordunuz, bu da çalışma kopyanızda yanlış kodu gördüğünüzü söylemenizden beri biraz tuhaf. İçinde neler olup bittiğini kontrol etmek isteyebilirsiniz remote/master.


1
Vay be ... Bunu hiç bilmiyordum. Ama şimdi çok mantıklı. Ana dal da yanlıştı, bu yüzden cevabınız tüm sorumu temizliyor. Hala biraz yeniyim. Bu ikisi arasındaki farkı bana söylediğin için çok teşekkürler!
delos

6
Benim için en iyi seçenek git pull --rebase.
derekmx271

153

Git'in yaptığı tüm kontrolleri "zorla itme" kullanarak geçersiz kılabilirsiniz. Bu komutu terminalde kullanın

git push -f kaynak ana

Ancak, uzaktaki mevcut çalışmayı potansiyel olarak göz ardı edeceksiniz - uzaktan kumandanın geçmişini tam olarak yerel kopyanız gibi olacak şekilde yeniden yazıyorsunuz.


50
Kuvvet itme (-f) bayrağını kullanmak çok tehlikelidir ve asla normal iş akışınızın bir parçası olmamalıdır
Spaideri

6
Bu cevapta bazı uyarıları kaçırdığım için olumsuz oy verildi.
Melebius

3
Ooh! Bu, depoyu kendini yeniden yazmaya zorlar.
Azarsa

3
Github ile aynı hatayı aldım ve bu komutla düzelttim, @theeastcoastwest neden bunun tehlikeli olduğunu söylüyorsunuz? nedeniniz nedir "
simon

3
@simon bu tehlikelidir çünkü uzaktaki işi görmezden gelir ve değişikliklerinizi repoya zorlar. Dolayısıyla, ekibinizin işini mahvetmek istemiyorsanız, zorlamayın.
Gásten

43

Uzak depoya göndermeye çalıştığımızda, ancak uzaktan kumanda üzerinde henüz çekilmemiş yeni bir dosya oluşturduğumuzda olur Readme. Bu durumda hatanın dediği gibi

git güncellemeyi reddediyor

yerel ortamımızda uzaktan güncelleme almadığımız için. Öyleyse önce uzaktan kumandadan çekin

git pull

Yerel deponuzu güncelleyecek ve yeni bir Readmedosya ekleyecektir . Sonra güncellenmiş değişiklikleri uzaktan kumandaya aktar

git push origin master

git pull origin developYerel geliştirme şubemde yapıyordum , ama şimdi, sadece bunu git pullyapmak benim için iyi çalışıyor, nedenini bilmiyorum.
Alex

Varsayılan olarak, yerel şube uzak şube ile senkronize edilecek ve eğer çünkü sadece bir şube belirtmek gerekmez dalda teslim edilir git pullyeterlidir
Himanshu

11

Bu genellikle depo yerel olarak bulunmayan bazı öğeler içerdiğinde gerçekleşir. Dolayısıyla, değişikliklerimizi zorlamak için, bu durumda uzaktan değişiklikleri entegre etmemiz ve ardından itmemiz gerekir.

Öyleyse uzaktan bir çekim yarat

git pull origin master

Sonra değişiklikleri o uzaktan kumandaya itin

git push origin master


7

Düzelttim, ne yaptığımdan tam olarak emin değilim. Şunu kullanarak basitçe itmeyi ve çekmeyi denedim:

git pull <remote> dev onun yerine git pull <remote> master:dev

Umarım bu, aynı sorunu yaşıyorsa birine yardımcı olur.


6

Girmeniz gerekiyor:

$ git pull
$ git fetch 
$ git merge

A kullanırsanız git push origin master --force, büyük bir problem yaşarsınız.


5
Neden kullanmam gerekiyor git fetchve git mergeyine elle çalışan sonra git pullhangi bulundukları ?
Melebius

6

Bunu deneyebilirsiniz: git pull origin master --rebase


2
Merhaba Eduardo! Bu benim için çalıştı. Ama neden işe yaradığını açıklayabilir misin? Bu komut tam olarak ne yapıyor?
Akshaya Natarajan

4

Aslında github düşündüğümüzden çok daha basittir ve git depomuza açıkça bazı dosyalar ekledikten sonra bile zorlamaya çalıştığımızda kesinlikle olur , bu yüzden sorunu çözmek için sadece deneyin ..

: git çekme

ve sonra..

: git itme

Not: Deponuzu çektikten sonra yanlışlıkla vim düzenleyicide kalırsanız endişelenmeyin, sadece vim düzenleyiciyi kapatın ve itmeyi deneyin :)


4

Aşağıdaki adımları yaptım. nihayet iyi çalışıyor.

Adımlar

1) git init

2) git durumu (durumu kontrol etmek için)

3) git ekle. (tüm değişiklik dosyasını ekleyin (.))

4) git commit -m "<pass your comment>"

5) git uzaktan kaynak ekle "<pass your project clone url>"

6) git çekme --allow-ilgisiz-geçmişleri "<pass your project clone url>"ustası

7) git itme "<pass your project clone url>"ustası


2

Bu hatayı aldım ve bunun nedeni sunucuda bir güncelleme olması, ancak SourceTree'nin herhangi bir güncelleme göstermemesiydi (muhtemelen son kontrol ettiğimde çevrimdışıydım). Bu yüzden kaynak ağacında bir yenileme yaptım ve şimdi 1 öğe yerine itilecek 2 öğe gösteriyor.

Bu nedenle, bu hatayı alırsanız yenile veya çek tuşuna bastığınızdan emin olun ve ardından tekrar deneyin.


1

git pull --rebase kökenli usta

git itme kaynağı yöneticisi


git push -f kaynak ana

Uyarı git push -f kaynak ana

  • Mevcut depoyu zorla zorlar ve ayrıca önceki depoları siler, böylece önceki sürümlere ihtiyacınız yoksa bundan daha yararlı olabilir


1

Benim için en iyi seçenek ve işe yarıyor ve basit

git pull --rebase

sonra

git push

iyi şanslar


1

Bu sorunu şu şekilde çözdüm:

  1. git pull origin master
  2. git push origin master

Bu genellikle uzak şubeniz güncellenmediğinde gerçekleşir. Ve bundan sonra sen başvurun "mesajını işlemek giriniz" gibi bir hata alırsanız bu (:) Xiaohu Wang cevap çalıştı beni için)


0

Önce SSDT VS projem vardı. Sahip olduğum gibi projeyi Github'a aktarmak istedim. Bu itişin, ana şubeyi başlatan repomun ilk versiyonu olmasını istedim. Donal'ın git push -f origin master önerisi, bunu başarmanın (gördüğüm) en kolay yoluydu. Herhangi bir şeyi yeniden yazma konusunda endişelenmeme gerek olmadığından, mantıklı görünüyordu.


0

Ben de aynı sorunu yaşadım. İlk önce çekmeden depoda .Readme dosyası oluşturdum.

.Readme dosyasını silmek veya itmeden önce çekmek isteyebilirsiniz.


5 yıllık bir soruya verilen bu cevabın herhangi bir ek değer sağladığından emin değilim, artı OP'nin spesifik sorununa bir çözüm sağlamıyor. Yeni bir katılımcı olduğunuz için lütfen soruları nasıl cevaplayacağınıza dair bir kılavuza bakın: stackoverflow.com/help/how-to-answer
Sotiris Koukios-Panopoulos

0

kullanabilirsiniz

git pull --rebase <your_reponame> <your_branch>

bu, yerel deponuza henüz kaydedilmemiş bazı değişikliklerinizin olması durumunda yardımcı olacaktır. özellikleREADME.md

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.