git push - kira sözleşmesi ile kuvvet - - kuvvet


183

Arasındaki farkı anlamaya çalışıyorum

git push --force

ve

git push --force-with-lease

Benim tahminim, uzaktan kumandanın sadece yerel şubenin sahip olmadığı taahhütleri yoksa uzaktan kumandaya itmesidir ?


"yerel uzaktan izleme şubesi ". Temel olarak, uzaktan kumandanın müşterinizin nasıl görünmesini beklediğine benzemesi gerekir. git help pushamacını açıklayan kullanım örnekleri vardır (temelde birisinin yeni itmiş olduğu bir değişikliği çöp kutusuna atmanızı önlemek için). Benim için biraz belirsiz olan, uzaktan izleme şubesinin nasıl çalıştığı. Ama muhtemelen tipik olarak, en son ne zaman yeni bir taahhütte bulunduğunuzda fetchveya pullhiç yeni taahhütte bulunmadığınızda tam olarak nasıl göründüğüne bakmanız gerekecektir .
zzxyz

4
@zzxyz: asıl uygulaması --force-with-lease, modern CPU'lardaki karşılaştırma ve takas yönergelerine benzer: takasın gerçekleşmesini isteyen kişi beklenen değeri ve yeni değeri sağlar. Takas yapan sistem, beklenen değeri gerçek akım değeriyle karşılaştırır ve takas işlemi, yalnızca ikisi eşitse yapar. İle git push, beklenen değer uzaktan izleme adında ne varsa, örneğin yeni istenen değerle birlikte git push --force-with-lease origin Xkendi origin/Xdeğerinizi gönderir ; origin's Git size değişimi yapıp yapmadığını söyler.
torek

1
Adresindeki Git işlemi originyaptıysa, işleminiz tamamlanmıştır. Değilse git fetch origin, yeni geçerli değeri almak için koşabilir , gerekirse değişikliklerinizi yeniden çalışabilir ve tekrar denemek için başka bir kiralama ile karşılaştır ve takas uygulayabilirsiniz.
torek

Yanıtlar:


173

force yerel şubenizle uzak bir dalın üzerine yazar.

--force-with-leaseuzak şubeye daha fazla işlem eklendiğinde (başka bir ekip üyesi veya iş arkadaşı veya sizin neyiniz varsa) uzak şubedeki hiçbir çalışmanın üzerine yazmayacak daha güvenli bir seçenektir. Zorla iterek başkalarının işlerinin üzerine yazmamanızı sağlar.

Komuta dair genel fikrinizin doğru olduğunu düşünüyorum. Uzak dal yerel makinenizdeki uzak dal ile aynı değere sahipse - uzaktan kumandanın üzerine yazacaksınız. Aynı değere sahip değilse, kodunuz üzerinde çalışırken uzak şubede bir başkasının yaptığı değişikliği gösterir ve bu nedenle kodun üzerine yazılmaz. Açıkçası, uzaktan kumandada ek taahhütler varsa, değerler aynı olmayacaktır.

Sadece --force-with-leaseherhangi bir takım arkadaşının kodunun üzerine yazmadığından emin olmak istediğimde kullanma seçeneği olarak düşünüyorum . Şirketimdeki birçok ekip --force-with-leasearıza güvenliği için varsayılan seçenek olarak kullanıyor . Çoğu durumda gereksizdir, ancak başka bir kişinin uzaktan kumandaya katkıda bulunduğu bir şeyin üzerine yazmanız durumunda size çok fazla baş ağrısı kurtaracaktır.

Belgelere baktığınızdan eminim ama burada daha fazla açıklama olabilir:

https://git-scm.com/docs/git-push


39

Güvenilir ve / veya resmi kaynaklardan bir cevap çizimi arıyorum.

Tarafından bahsedilen "karşılaştırma ve takas" torek içinde yorumların ve onun diğer cevap daha da gösterilmektedir Git kendisinin kaynaklardan .

ikincisi sadece uzaktan kumandanın yerel şubenin sahip olmadığı taahhütleri yoksa?

Bu özellik bu işlemde tanıtıldı (Aralık 2013, Git v1.8.5-rc0)

--force-with-lease aksi belirtilmedikçe, güncel değerlerinin makul bir varsayılanla aynı olmasını zorunlu kılarak güncellenecek tüm uzak referansları koruyacaktır;

Şimdilik, "bazı makul varsayılanlar" geçici olarak " güncellenen uzaktan kumandanın ref için sahip olduğumuz uzaktan izleme şubesinin değeri " olarak tanımlanmaktadır ve böyle bir uzaktan izleme şubemiz yoksa bir hatadır.

Yani "kira" şu anlama gelir:

" force-with-lease": Yeniden temel alınan tarihin ne olması gerektiğine karar vermek için getirdiğinizde ref üzerinde kira sözleşmesi yaptığınızı varsayarsınız ve yalnızca kiralama işlemi bozulmamışsa geri itebilirsiniz.

Kaynaklar hala "cas" den bahsediyor:

  • Bu seçeneğe aslen " cas" ("karşılaştır ve takas et" için) adı verildi, çok teknik olduğu için kimsenin sevmediği isim.
  • İkinci girişim buna "lockref" adını verdi (çünkü kavramsal olarak bir kilit aldıktan sonra itmek gibidir) ama "kilit" kelimesi, başkalarının itmeyi reddedebileceğini ima ettiğinden, bu seçeneğin çalışma şekli değildir.
  • Bu raunt ona “kiralamaya zorla” diyor.
    Yeniden temel alınan tarihin ne olması gerektiğine karar vermek için getirdiğinizde ref üzerinde kira sözleşmesi yaptığınızı varsayarsınız ve yalnızca kiralama işlemi bozulmamışsa geri itebilirsiniz.

Yani: " git push --force-with-leasevs. --force"

" push --force-with-leaseVarsayılan olarak " da bahsettiğim gibi Git 2.13 (Q2 2017), bir arka plan işlemi (Git eklentisine sahip bir IDE'de bulduğunuz gibi) çalıştığında seçeneğin yok--force-with-lease sayılabileceğini belirtti . Bu durumda hüküm sürer.git fetch origin
--force


29

git push --force yıkıcıdır , çünkü uzak depoyu yerel olarak sahip olduğu her şeyle koşulsuz olarak üzerine yazar. seyahatseverlerin Git adlı itme --force zaten paylaşılan bir platforma itti diğer hareketin yok gibi kesinlikle önerilmez. Kuvvet baskısının en yaygın nedenlerinden biri, bir şubeyi yeniden oluşturmak zorunda kalmamızdır.

Örneğin. Alice ve Bob'un üzerinde çalışacağı bir özellik dalına sahip bir projemiz var. İkisi de bu depoyu klonlar ve çalışmaya başlarlar. Alice başlangıçta özelliğin bir kısmını tamamlar ve bunu ana depoya iter. Her şey yolunda. Bob da işini bitirir, ancak itmeden önce bazı değişikliklerin ustayla birleştirildiğini fark eder. Temiz bir ağaç tutmak isteyen usta dalına karşı bir taban yapar. Tabii ki, bu yeniden temsili dalı itmeye gittiğinde reddedilecek. Ancak Alice'in işini çoktan ittiğini fark etmemekle birlikte, bir kuvvet uygular. Ne yazık ki, bu Alice'in merkezi depodaki değişikliklerinin tüm kayıtlarını silecek.

Ne --force-ile-kira yapar biz bekliyoruz devlet olmadığı sürece bir şube güncellemek için çöp olduğu; yani hiç kimse şubeyi yukarı yönde güncellemedi. Uygulamada bu, yukarı akış ref'sinin beklediğimiz olduğunu kontrol ederek çalışır, çünkü ref'ler karmadır ve ebeveyn zincirini örtük olarak değerlerine kodlar.

İşte git push --force ve git push --force-with-lease ile ilgili iyi bir yazı.


2
ne anlamadım - eğer usta ile yeniden temellendirirseniz, o zaman onsuz zorlayabilmelisiniz --force-with-lease? --force-with-leaseMaster ile yeniden temellendikten sonra neden gereklidir?
Alexander Mills

3
@AlexanderMills'de soruna neden olan bazı olasılıklar olabilir. Bunu ustalaştıran son kişi iseniz, o zaman sorun yok ama başka bir görevle çalışan başka bir kişi varsa, bu ciddi bir soruna neden olabilir. Diyelim ki A - B - C ustaydı, İlk başta Alice bunu A - B - C - D - E ve aynı zamanda Bob'u A - B - C - F - G yaptı. Son iten kişi Alice ise A - B - C - D - E - F - G'ye yeniden bastıktan sonra ustada herhangi bir soruna neden olmaz, ancak başka bir kişi Tom, ana felakette aynı anda A - B - C - D - E - R'yi itmeye çalışır! !
Shakil

3
--forcetaahhütleri kaybetmez, sadece onları ayırır. Uzak repo bakım görevlisinin herhangi bir GC veya budama işlemi yapmadığı varsayılarak git checkout <SHA>ya da hash'larıyla diriltilebilirler git reset --hard <SHA>.
Keith Russell

1
"git'in itme kuvveti, zaten paylaşılan bir depoya itilmiş olan diğer taahhütleri yok edebileceğinden kesinlikle cesaretini kırıyor." Zorla gönderme yapmak, normal git rebase kodunu gözden geçirme iş akışının bir parçasıdır. Ayrıca, daha önce de belirtildiği gibi, bunu yaptıktan sonra bile taahhütleri alabilirsiniz.
Étienne

9

Sunucudaki ön alma kancalarının itmeyi kabul ettiği varsayıldığında, bu her zaman başarılı olacaktır:

git push --force

Devam etmeden önce bu, istemci tarafında belirli bir denetim gerçekleştirirken:

git push --force-with-lease

Belirli bir kontrolü manuel olarak kendiniz yapabilirsiniz. İşte "kiralama kontrolü" algoritması:

  1. Mevcut dalınızı bulun.

  2. Koş git for-each-ref refs/remotes. Git istemcinizin mevcut dalınızın akış yukarı durumuna karşılık geldiğini düşündüğü kesin kimliği not edin.

Örneğin, "foo" dalındaysanız, "refs / remotes / origin / foo" ile ilişkili olan taahhüt kimliğini not edin.

  1. Şu anda yukarı akış sunucusundaki uzak dalın gerçek komut kimliğini belirleyin.

  2. "Git push" un yalnızca adım 2 ve adım 3'ten çıkardığınız taahhüt kimlikleri kabul ederse devam etmesine izin verin. Başka bir deyişle, yalnızca yerel git clone'un yukarı akış kavramı gerçek yukarı akış ile aynı fikirde olursa devam edin.

Burada üzücü bir sonuç var: git fetch"refs / uzaktan kumandalar / origin / *" altındaki tüm referansları en son sürümlerine güncellediğinden, bu komut kombinasyonu esasen aşağıdakilerle aynıdır git push --force:

git fetch

# The command below behaves identically to "git push --force"
# if a "git fetch" just happened!

git push --force-with-lease

Bu doğal zayıflık etrafında git push --force-with-leaseçalışmak için asla kaçmaya çalışıyorum git fetch. Bunun yerine her git pull --rebasezaman yukarı akışla senkronize etmem gerektiğinde çalışırım, çünkü git pullsadece "ref" / remotes altında tek bir ref'yi günceller, --force-with-leaseyararlı "kiralama" özelliğini korur.


1
Çek müşteri tarafındaysa, yarış durumu için bir potansiyel var mı? Yani kontrolten sonra ama zorla itmeden önce başkası değişiklikleri itiyor mu?
craq

2

Kira sözleşmesi zorlaması güvenli değildir. Sylvie'nin dediği gibi çalışıyor. Bir not: Git'te bir dal sadece bir taahhüdün göstergesidir. Ve taahhütler sıfıra veya daha fazla ebeveyn taahhütüne işaret eder. Şubeyi tamamen sert git sıfırlama ve zorla itme veya - - kiraya zorla istemeden itme ile değiştirseniz bile, bu büyük bir sorun olmak zorunda değildir. Şubelerdeki yerel ipucunuzun (O sırada HEAD neredeydi?) Nasıl değiştiğini görmek için şubeye git reflog'unuzu kullanabilirsiniz ve şubeyi tekrar sıfırlayıp itin. Daha sonra sadece uzak dalda yeni taahhütleri kaybedersiniz, ancak ekip üyeleri tarafından geri yüklenebilirler.

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.