Eğer itmek Bir sunucuya taahhüt ve sonra (yerel olarak işlemek olduğunu yeniden git reset
, git rebase
, git filter-branch
veya 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.denyNonFastForwards
Yapı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 .