Uzak Git deposuna nasıl sabit bir taahhütte bulunabilirim?

Kaynak kod üzerinde bazı çalışmalar yaptığımda, her zamanki işimi yaptım ve ardından uzak depoya tıkladım. Ancak, içe aktarmayı kaynak koduna göre düzenlemeyi unuttuğumu fark ettim. Bu nedenle, önceki taahhüdün yerine bir değişiklik komutu veriyorum:

 > git commit --amend 

Ne yazık ki, taahhüt deposuna geri alınamaz. Aşağıdaki şekilde reddedilir:

 > git push origin To //my.remote.repo.com/stuff.git/ ! [rejected] master -> master (non-fast forward) error: failed to push some refs to '//my.remote.repo.com/stuff.git/' 

Ne yapmalıyım (Uzak depoya erişebilirim.)

475
31 окт. Spoike 31 Ekim ayarla 2008-10-31 13:23 '08, 13:23, 2008-10-31 13:23
@ 13 cevap

Aslında bir kere --force ve .git deposuna tıkladım ve Linus BIG .git bir lanet aldım. Genel olarak, diğer insanlar için çok fazla sorun yaratacaktır. Basit cevap: "Bunu yapma."

Bunun için bir tarif veren diğerlerini görüyorum, bu yüzden onları burada tekrar etmeyeceğim. Ancak, düzeltilmiş sabitlemeyi --force (veya + master) ile ittikten sonra durumdan kurtulmanız gereken bir ipucu.

  • Katkıda bulunduğunuz eski taahhüdü bulun (eski diyoruz ve old değiştirerek oluşturduğunuz yeni komutu seçeceğiz).
  • Yeni bir ağaç yazarak old ve new arasında bir birleşme oluşturun; örneğin, git checkout new git merge -s ours old .
  • Bunu git merge master kullanarak git merge master
  • Sihirbazı git push . HEAD:master sonucu ile güncelle git push . HEAD:master git push . HEAD:master
  • Sonucu yazdırın.

Ardından, çalışmalarını yok ettiğiniz fiksasyona dayandırmak, zorlamayı yapmakta olan ( çok kötü bir çocuk olan ) düzelten ve zorlayan insanlar, birleşmenin sonucunu görecek ve old new kullandığınızı görecektir. Daha sonraki birleşmeleri, değişikliklerin bir sonucu olarak ortaya çıkan old ve new arasındaki çatışmaları görmeyecek, dolayısıyla acı çekmelerine gerek kalmayacak.

371
11 янв. Cevap 11 Ocak gitster tarafından verildi . 2009-01-11 10:36 '09, 10:36, 2009-01-11 10:36

Git güvenlik özelliğini görüyorsunuz. Git, bir dalın uzak bir dalını güncellemeyi reddeder, çünkü başlık dalınız tıklattığınız dal başlığının geçerli sabitlemesinin doğrudan bir soyu değildir.

Durum böyle olmasaydı, aynı anda aynı depoya iten iki kişi aynı anda yeni bir taahhüdün gerçekleştiğini ve sonuncuyu iten kişinin işini kaybettiğini bilmeyecekti. bunlardan herhangi birinin farkında olmadan önceki itici.

Tıklayan tek kişi sizseniz ve sabit düzeltmeye basmak veya dalı gideren düzeltmeye basmak istiyorsanız, uzak dalı -f düğmesiyle güncellemek için Git'i "zorlayabilirsiniz".

 git push -f origin master 

Bu bile işe yaramayabilir, çünkü Git, uzak depoların, uzaktaki receive.denynonfastforwards yapılandırma receive.denynonfastforwards kullanarak hızlı tıklamalar yapmasına izin verir. Bu durumda reddetme nedeni şöyle görünecektir (“uzaktan arıza” bölümüne dikkat edin):

border=0
  ! [remote rejected] master -> master (non-fast forward) 

Bunu aşmak için, uzak havuzun yapılandırmasını değiştirmeniz veya kirli bir kesmek olarak dalı aşağıdaki şekilde silip yeniden oluşturabilirsiniz:

 git push origin :master git push origin master 

Genel olarak, git push <local_ref>:<remote_ref> son parametresi <local_ref>:<remote_ref> biçimini kullanır, burada local_ref yerel depodaki remote_ref adıdır ve remote_ref uzak depodaki şubenin adıdır. Bu komut çiftinde iki kısaltma kullanılır. :master , null local_ref, yani master'in uzak tarafına sıfır dal eklenmesi, yani uzak dalın silinmesi anlamına gelir. Şube adı olmadan : belirtilen ada sahip yerel şubenin, aynı ada sahip uzak şubeye yönlendirildiği anlamına gelir. master bu durumda master:master için kısadır master:master .

218
01 нояб. Cevap 01 Ocak Bailey Charles tarafından verilmiştir . 2008-11-01 00:58 '08, 0:58, 2008-11-01 00:58

Hızlı rant: hiç kimsenin basit bir cevap yazmadığı gerçeği, Git CLI ile tezahür eden kullanıcının umutsuz düşmanlığını gösterir.

Her durumda, bunu zorlamanın “açık” yolu, bir zorlamayı zorlamadığınızı varsayarsak, önce onu çıkarmaktır. Bu, üzerinde yaptığınız değişikliğe yol açacaktır (ve bu nedenle artık orada değildir) böylece tekrar ortaya çıkacaktır.

Herhangi bir anlaşmazlığı çözer çözmez tekrar tıklayabilirsiniz.

Yani:

 git pull 

Çekme hataları alırsanız, yerel depo yapılandırmanızla ilgili bir sorun olabilir (.git / config bölümünde geçersiz bir ref vardı).

Ve sonra

 git push 

"Önemsiz birleştirme" konusunda ek bir tespit alabilirsiniz.

184
22 сент. Cevap Tim Band tarafından yapılmıştır Sep 22 Eyl 2009-09-22 13:46 '09, 13:46 2009-09-22 13:46

Kısa cevap: kamuoyu üzerindeki düzeltilmiş düzeltmelere basmayın.

Uzun cevap: git commit --amend ve git rebase gibi bazı Git komutları aslında tarih grafiğini yeniden yazar. Sorun değil, değişikliklerinizi yayınlayana kadar, ancak bir kez yaptığınız zaman, gerçekten bir kişi değişikliklerinizi aldıysa, o zaman tekrar çıkarmaya çalıştıklarında, değişiklik yapmak yerine, hikayeyi aldatmamalısınız. Bir taahhütte, sadece değişikliklerle yeni bir taahhütte bulunmalısınız.

Ancak, gerçekten düzeltilmiş bir mesaja basmak istiyorsanız, aşağıdaki gibi yapabilirsiniz:

 $ git push origin +master:master 

Baştaki + işareti, “hızlı ileri” fiksasyonuna yol açmasa bile basmaya zorlayacaktır. (Hızlı ileri sarma, tıkladığınız değişiklikler zaten halka açık depodaki değişikliklerin doğrudan soyundan geldiğinde gerçekleşir.)

86
31 окт. Cevap mipadi tarafından 31 Ekim'de verildi 2008-10-31 17:35 '08, 17:35 2008-10-31 17:35

commit --amend ettikten sonra değişikliklerinizi yapmanın kolay ve temiz bir yolu:

 git reset --soft HEAD^ git stash git push -f origin master git stash pop git commit -a git push origin master 

Aşağıdakileri yapar:

  • Şube dallarını kafaları üste sıfırlayın.
  • Son işlemi tıkla.
  • Uzaktan kumandada zorla basılması. Şimdi uzaktaki bilgisayarın son taahhüdü bulunmuyor.
  • Cüzdanına gir.
  • Temiz okumak.
  • Uzaktan kumandaya tıklayın.

Bunu başka bir şubeye veya uzak cihaza uygularsanız, "orijin" ve "ana" değiştirmeyi unutmayın.

20
21 июня '15 в 17:41 2015-06-21 17:41 Cevap Faiza’ya 21 Haziran’da 15’te 17:41’de verilecek 2015-06-21 17:41

Bunu yerel düzeltmeyi iptal ederek ve üstten yeni değişiklikler ekleyerek çözdüm:

 # Rewind to commit before conflicting git reset --soft HEAD~1 # Pull the remote version git pull # Add the new commit on top git add ... git commit git push 
16
24 сент. Cevap 24 Eylül'de verildi 2012-09-24 18:46 '12, 18:46, 2012-09-24 18:46

Ben de aynı problemi yaşadım.

  • Zaten basılmış olan son düzeltme rastgele ayarlandı.
  • Yerel olarak yapılan birçok değişiklik, beş kez yapıldı
  • Tıklama, hata yapma, panikleme, uzaktan erişimi birleştirme, dosyalarımın çoğunu alma, tıklanma, başarısız olma vb.

Git -newbie olarak, FUBAR tarafından tamamlandığını sanıyordum.

Karar. Biraz daha farklı, @ Barbara'nın önerdiği gibi + yerel bir yedekleme şubesi oluştur

 # Rewind to commit just before the pushed-and-amended one. # Replace <hash> with the needed hash. # --soft means: leave all the changes there, so nothing is lost. git reset --soft <hash> # Create new branch, just for a backup, still having all changes in it. # The branch was feature/1234, new one - feature/1234-gone-bad git checkout -b feature/1234-gone-bad # Commit all the changes (all the mess) not to lose it  not to carry around git commit -a -m "feature/1234 backup" # Switch back to the original branch git checkout feature/1234 # Pull the from remote (named 'origin'), thus 'repairing' our main problem git pull origin/feature/1234 # Now you have a clean-and-non-diverged branch and a backup of the local changes. # Check the needed files from the backup branch git checkout feature/1234-gone-bad -- the/path/to/file.php 

Belki bu hızlı ve temiz bir karar değildir ve hikayemi kaybettim (5 yerine 1 iş), ancak günlük işine devam etti.

7
20 февр. Cevap 20 Şubat davisca'da verilir. 2014-02-20 13:24 '14, 1:24, 2014-02-20 13:24

Hiç kimsenin düzeltmenizi değişiklik yapmadan --force-with-lease , --force-with-lease git push seçeneğini kullanın.

TortoiseGit'te "Push ..." "Zorla: Atılabilir" ayarlarında aynı şeyi yapabilir ve "bilinen değişiklikleri" kontrol edebilirsiniz.

Zorla (bilinen değişiklikleri reddedebilir) uzak havuzun daha güvenli ve hızlı olmayan bir geçiş yapmasını sağlar. Bu, uzak havuzun taahhüdünü kaybetmesine neden olabilir; dikkatli kullanın. Bu, uzaktan kumandadaki diğer kişilerden bilinmeyen değişiklikleri kaybetmenizi önleyebilir. Sunucu şubesinin uzak izleme şubesiyle aynı tespiti işaret edip etmediğini kontrol eder (bilinen değişiklikler). Eğer öyleyse, güç basılacaktır. Aksi takdirde, reddedilecektir. Git uzaktan izlemeli etiketlere sahip olmadığından, bu seçenekle etiketlerin üzerine yazılamaz.

3
07 июня '16 в 3:03 2016-06-07 03:03 Cevap ShawnFeatherly tarafından 07 Haziran 16, 03:03, 2016-06-07 03:03 tarihinde verilir.

git add "your files" ve git commit --amend git add "your files" sonra değişiklik yapmanın kolay ve temiz bir yolu:

 git push origin master -f 

veya

 git push origin master --force 
2
18 янв. Cevap Marwen Bkh 18 jan tarafından verilmiştir . 2016-01-18 11:29 '16, 11:29 2016-01-18 11:29

Uzak daldaki koda (GitHub / Bitbucket) basmadıysanız, komut satırındaki onay mesajını aşağıda gösterildiği gibi değiştirebilirsiniz.

  git commit --amend -m "Your new message" 

Belirli bir dalda çalışıyorsanız, aşağıdakileri yapın:

 git commit --amend -m "BRANCH-NAME: new message" 

Kodu zaten yanlış bir mesajla tıkladıysanız, mesajı değiştirirken dikkatli olmanız gerekir. taahhüt mesajını değiştirip tekrar basmayı denedikten sonra, sorunla karşılaşırsınız. Düzgünleştirmek için şu adımları izleyin.

Lütfen bunu yapmadan önce tüm cevabı okuyunuz.

 git commit --amend -m "BRANCH-NAME : your new message" git push -f origin BRANCH-NAME # Not a best practice. Read below why? 

Önemli not: İtme tuşuna bastığınızda, diğer geliştiricilerin aynı dalda çalıştığı kod sorunlarıyla karşılaşabilirsiniz. Bu nedenle, bu çatışmalardan kaçınmak için, zorlamadan önce kodu şubenizden çıkarmanız gerekir:

  git commit --amend -m "BRANCH-NAME : your new message" git pull origin BRANCH-NAME git push -f origin BRANCH-NAME 

Bu, önceden basılmışsa, bir taahhüt mesajını değiştirirken en iyi uygulamadır.

2
13 янв. Cevap Packer 13 Ocak tarafından verildi 2015-01-13 10:20 '15, 10:20 2015-01-13 10:20

Bu hatayı alırsınız çünkü Git remote zaten bu işleme dosyalarına sahiptir. Bunun çalışması için şubeye zorla tıklamanız gerekir:

 git push -f origin branch_name 

Ayrıca, ekibinizden birisinin bir şubeye taşınabilmesi için kodu uzaktan kumandadan çıkardığınızdan emin olun.

 git pull origin branch_name 

Bu, uzaktaki bir bölgeyi düzeltmeye zorlamamız gereken durumlardan biri.

1
21 янв. Cevap Praveen Dhawan 21 Ocak tarafından verildi 2016-01-21 09:35 '16, 09:35 2016-01-21 09:35

Bu sorunu uzak bir depodan çekerek ve ortaya çıkan birleştirme çatışmalarını çözerek düzeltdim, sonra da tıklayın. Ama daha iyi bir yol olduğunu hissediyorum.

1
31 окт. Cevap Spoike'a 31 Ekim'de verilecek . 2008-10-31 14:39 '08, 02:39, 2008-10-31 14:39

Git'in bana söylediklerini yapmaya devam ettim. Yani:

  • Bir düzeltme nedeniyle tıklanamıyor.
  • Beklediğim gibi deniyorum.
  • Birleştirme hatası bu yüzden el ile düzeltirim.
  • Yeni bir taahhüt oluşturun ("birleştirme" olarak işaretlenir) ve tıklayın.
  • İşe yarıyor!

Not. Değiştirilen fiksasyon sonuncusuydu.

1
02 дек. Cevap Rolf 02 Aralık'ta verildi. 2016-12-02 19:29 '16, 19:29 2016-12-02 19:29

ilgili diğer sorular