Herkes usta üzerinde çalışırken git acısını nasıl en aza indirebilirim?


123

Yaklaşık on kişilik dokümantasyon ekibimiz yakın zamanda SVN'den Git'e taşındı. SVN'de herkes usta üzerinde çalıştı - her zaman nefret ettiğim bir model, ama bu değişikliği yapamadım. Git'e taşınmanın bir parçası olarak bunu düzeltmeye karar verdik, ancak henüz bunu yapamıyoruz (yapıların keyfi dallardan oluşmasına izin verecek derlemeleri beklemek). Bu arada, herkes usta üzerinde çalışıyor. Evet bunun korkunç olduğunu biliyorum, inan bana.

Şimdi Git'in iki aşamalı modelinin (yerel ve uzak) neden olduğu SVN kullandığımızdan çok daha fazla hıçkırık görüyoruz. Bazen insanlar taahhüt eder ancak itemezler ya da bekleyen yerel değişikliklerle çatışmalar kurarlar. Dün biri, son değişiklikleri değiştirdi - bir şekilde - bir birleşme yanlış gitti, ki bence Git'i çekip olağanüstü değişiklikler yaptığınızda yaptığınız bir birleşme oldu. (Bana tam olarak ne yaptığını söyleyemedi ve bir GUI kullandığı için kabuk tarihini kontrol edemiyorum.)

En yetkin Git kullanıcısı olarak (okuyunuz: daha önce kullandım, süper karmaşık bir şey olmasa da), politika belirleyen, araçları öğreten ve karışıklıkları temizleyen kişi benim. Dalları geliştirmeye geçene kadar, paylaşılan, aktif bir efendiyi daha az hataya açık hale getirmek için bu araçları nasıl kullandığımız konusunda ne gibi değişiklikler yapabilirim?

Takım, Windows'ta Tortoise Git'i kullanıyor. Tortoise Git kullanıyoruz çünkü daha önce Tortoise SVN kullanıyorduk. ( Ben şahsen bazı işlemler için Cygwin komut satırını kullanın, ama takım temizleyinonlar bir GUI ihtiyaç ve biz bunu ile gidiyoruz yaptı.) Cevapları değiştirmeler önermemektedir, bu araç ile çalışmalıdır.

Kaplumbağa Git'in tek bir işlem olarak kullanılabilen "Teslim Et ve İttir" i var ve onlara her zaman yapmalarını söyledim. Ancak, atomik değil - bu (sonuçta yerel olanın) taahhüdünün sadece iyi çalıştığı, ancak itirazın (bir çatışma veya bir ağ sorunu nedeniyle) çalışmadığı anlamına gelebilir. Bu olduğunda, belirsiz bir hata alırlar; BitBucket işlem günlüğünü, yeni bir işlem hakkında herhangi bir şüpheleri olup olmadığını ve görmezlerse zorlamalarını kontrol etmelerini söyledim . (Eğer sorun buysa çatışmayı çözmek veya ne yapacaklarını bilmiyorlarsa yardım isteyin.)

Takımın zaten "erken ve sık çekme" gibi alışkanlıkları var. Bununla birlikte, çekilişin yeni olduğunu düşündüğüm çatışmalara neden olabileceği anlaşılıyor. Yeni değilse, SVN'den çok daha sık. Git'in nasıl çekileceğini değiştirebileceğimi duydum (birleştirme yerine yeniden yapılanma), ancak oradaki takasları (veya çevremizde nasıl yapabileceğimizi) iyi anlayamıyorum.

Sunucu BitBucket'tir (Github değil). Depomuz üzerinde tam yönetim kontrolüm var ancak sunucuda daha genel olarak yok. Bunların hiçbiri değişken değil.

Kaynak dosyalar XML'dir. Ayrıca, birleştirme yapamayacağınızı herkesin bildiği grafik dosyaları da var, ancak neredeyse hiç orada çarpışmalarımız olmadı. Birleştirme çatışmaları, grafiklerden değil XML dosyalarından gelir.

Git'i, paylaşım uzmanının ekip için daha sorunsuz çalışmasını sağlamak için gözden geçirilmiş, test onaylı çekme istekleriyle özellik dalları kullanmaya devam edene kadar ne gibi değişiklikler yapabilirim?


52
Kaplumbağa kullanmayın, Git Extensions'ı kullanın. Kaplumbağa, Git'in SVN olmadığını ve git büyüklüğünün çoğunu yok etmeye çalıştı. SVN-> Git geçişini iki kez geçtim ve Git Extension, insanların gitmeyi düşünmesini sağlamak için harika bir araçtır.
Wilbert

91
Git SVN değil. SVN'yi Git ile kopyalamaya çalışırsanız, Git'in tüm ağrı noktalarının birleşmesiyle birlikte SVN'nin tüm acı noktalarını alırsınız, hiçbirinin yararlarından hiçbiri olmadan, hiçbir zaman işe yaramaz. En büyük problem sosyal bir problem, yeni kavramları öğrenmeyi reddeden takım üyeleriniz var. Bunu teknik çözümle çözemezsiniz, Git kavramlarını öğrenmek için ekip üyelerinizden satın almalarını sağlayarak başlamalısınız, onları aynı SVN gibi olduğuna ikna etmeye çalışın.
Lie Ryan,

10
Diğer uygulamaları önermemeniz gerektiğini söylediğinizi biliyorum, ancak @Wilbert'in hakkı var. TortoiseGit, deneyimlerime göre onları daha fazla acı veren şeyleri gizlemeye çalışıyor. Bir UI isteniyorsa, en kolay geçişi (okudum: geleneksel olmayan yazılım ekiplerini takım üzerinde eğitiyorum ve DevOps'u) Atlassian'ın SourceTree'sinde (uygun eğitim ile) buldum. GitFlow'u ayrıca Git modelini anlamalarına yardımcı olmak için de kullandım (yine de, bu tüm takımlara uymuyor).
JasCav

28
Sürekli Entegrasyonun temel prensibi olan usta üzerinde çalışan herkesin kaka yapıyor olması beni şaşırttı . Sağlam bir test süitiniz olduğu ve yapımın ne zaman bozulduğunun herkes farkında olduğu sürece, ustadan çalışmak takım işbirliğinde avantaj sağlayabilir. Özellik dallandırma (hemen hemen tüm diğer iş akışlarının bir dereceye kadar dayandığı), korumaları yerinde olmadan eşit derecede yıkıcı olabilir. Muhtemelen burada oyunda daha derin bir kök problemin var.
DanK

14
@DanK, ayrıca operasyonun sorunun kökenini yanlış tanımladığını düşünüyorum. Master'da değişiklikleri gizleyen insanlar varsa ve bir şubeye geçerseniz, şubede değişiklikler yapan insanları göreceksiniz. Bireysel şubelere taşınırsanız, şubelerinde birleşme sorunları olan (ya da şubelerinde aylarca birleşme olmadan şubelerinde gelişen) insanlar olacak.
user3067860 6:17

Yanıtlar:


11

Şimdiye kadar SourceTree, kavramları öğrenmek için en iyi IDE idi, çünkü her aşamada sahip olduğunuz tüm ilgili diyalogları ve seçenekleri gösterir, varsayılan seçenekler genellikle iyidir, rebase ile uğraşmayın, vb. Normal akışı izleyin:

  • Ustadan çekin, sadece güncel olduğunuzdan emin olmak için
  • Dosyalarınızı değiştirin
  • Değişikliklerinizi kabul edin (yalnızca yerel olarak)
  • Master'dan tekrar çekin (bu, çatışmaların ortaya çıkmasına neden olur)
  • Çakışmalar çözülene kadar tüm dosyaları düzenleyin; yani dosya, işlemek istediğiniz özellik konumunda (ham dosyada <<<<< HEAD ve >>>> ana iletiler yok)
  • Birleştirme değişikliklerini kabul et
  • it

Herkes bu tarifi takip ederse, iyi olmalı.

Ne zaman birisi daha büyük veya merkezi bir değişiklik yaparsa, diğer kullanıcıları yerel olarak işlem yapmaları ve ustalardan çekilmeleri konusunda bilgilendirir, böylece daha sonra çok fazla çatışma almazlar ve ilk kişi hala onlarla çatışmaları çözmek için buralardadır.

Herkesin akışı anlamasını sağlamak için çok zaman harcayın, aksi takdirde bir süre dolanabilir ve daha sonra ana şubeyi sıkıştırarak rahat hissedebilirsiniz, örneğin "uzaktan kumanda yerine dosyamı kullan" sadece bir çatışmayı çözmek için diğer insanlar tarafından yapılan tüm değişiklikleri dışarı.

Git, öğrenmesi zor bir sistemdir, özellikle de Svn ile büyüdüyseniz, sabırlı olun ve düzgün bir şekilde öğrenmeleri için onlara zaman verin, yeni kullanıcılarla bazen bir gün biraz karışıklığı temizlemek için harcayabilirsiniz, bu normaldir. ;)


9
nitpick: SourceTree bir Entegre Geliştirme Ortamı değil ...
Mathieu Guindon

Bu iş akışını test sürüşü yapan birileri (benden başka biri dışında) var (Tortoise Git ile, demek istediğim) herhangi bir sürpriz / sorunu ortadan kaldırmak için. Hiçbiri olmadığını varsayarak, bunu birkaç gün içinde takıma sunmayı planlıyorum.
Monica Cellio

Bu yüksek oylu cevabın bu bölgeyle aynı bölgeyi kapladığını biliyorum , ama bu cevabın adım adım anlatıldığı tarifi görene kadar değildi, bu yüzden nasıl uygulanacağımı anladım. bunu kabul ediyorum (tarif için, IDE :-) için değil). Daha fazla sorun yaşamadan bu süreci birkaç gündür takip ediyoruz. "Gitme yolunu" keşfetmeye ve anlamaya daha fazla odaklanacağız.
Monica Cellio

100

Aynı şubeden başkasıyla çalışırken, hatırlamanız gereken üç ana şey vardır:

  • Asla kullanmayın --forceEğer sürece gerçekten ne yaptığınızı biliyorum.
  • Ya commitda stashçalışmalarınız her şeyden önce devam ediyor pull.
  • A'dan pullhemen önce yaparsanız genellikle daha kolay olur push.

Bunun dışında, dağıtılmış versiyon kontrolü ile "resmi" deponuzun şubeleri kullanıp kullanmamasının önemi olmadığını belirteceğim. Bu, bireysel kullanıcıların yerel depolarında ne yaptıklarına dair hiçbir önemi yoktur. Şirketim tamamen farklı bir merkezi VCS kullandığında yerel şubeleri almak için git'i kullanırdım. Özellikleri için yerel dallar oluştururlar ve yerelleriyle birleştirme hataları yaparlarsa master, yeniden günlüğe veya başka sihirlere girmeden düzeltmeleri çok daha kolaydır .


51
Her zaman pullönce pushharika bir tavsiye, ama bir adım daha ileri gideceğim ve pull --rebasene zaman yapabileceğinizi düşünün .
anaximander

20
@anaximander, ya herkesin
rebase

12
@TemporalWolf Bana pastadan bahsettikleri de
buydu

15
@anaximander "o zaman çatışmayı çözmedin ve yanlış yapıyorsun. Bu durumda, rebase ile güvenilmez". Yani, bir daha asla, bir daha bile olsa, bir birleşme çatışmasına karışmadığını mı söylüyorsun? Bu genelleştirmeyi yapabileceğiniz kadar basit kod tabanları üzerinde çalışmak hoş olmalı. İşte Linus'un kişisel olarak bu siyah ve beyaz yaklaşımların hepsinden daha kabul edilebilir bulduğum bir rebase'i ele alması.
Voo

10
" --forceNe yaptığınızı gerçekten bilmiyorsanız asla kullanmayın ." Daha ileri giderdim. En güvenilir kişiler dışındaki herkesin "ana" depodaki yeniden yazma tarihine izin verme . Bunu yapıp yapamayacağınız en azından kısmen barındırma sunucunuza bağlıdır, ancak BitBucket seçeneğiniz vardır.
jpmc26

68

Herkesin git öğrenmesi için bir gün sürmesi mümkün mü?

Profesyonelleri kullanan bilgisayarlardan gerçekten yeni bir araç öğrenmesi beklenmeli ve herhangi bir VCS'de birçok hata yapabilmek mümkün olsa da aracı kullanmak için tasarlandığı gibi kullanması gerekir.

Bunu tanıtmanın en iyi yolu, her birinin bir değişiklik yaptığında (mümkün olduğu kadar kısa) kendi branşında çalışmalarını sağlamak ve yeniden yaptıklarında daha sonra yeniden yapıldığında ustayla birleşmektir. Bu, mevcut çalışma şeklinden çok uzakta değildir ve daha karmaşık işlemler yapacak kadar güvende hissedinceye kadar alışabilecekleri basit bir iş akışı sunar.

Pencereleri kullanmıyorum ama eğer Kaplumbağa temel olarak onlardan saklıyor ve SVN gibi davranıyorsa, belki de Kaplumbağa yanlış bir araçtır.


37
"eğer Tortoise basitçe onlardan saklıyor ve SVN gibi davranıyorsa, belki de Tortoise yanlış bir araçtır." bu. OP'nin aleti değiştirmediğini söylediğini biliyorum, ancak git'in nasıl çalıştığını gizliyorsa, geliştiricilerinizin kişisel gelişimine ve operasyonel verimliliğinize zarar verir. Ekibiniz VCS'nizi kötüye kullanmaya devam ederse kullanmaya devam edecektir.
02'de,

3
Bir başka yardımcı git öğrenme kaynağı da Git Şubesini Öğrenmektir . Görsel bir ağacı gösterir ve ek olarak bir sanal alana sahiptir, böylece bir grup komutla alay edebilir ve ne tür bir ağacın sonuçlandığını görebilirsiniz.
TemporalWolf

4
Geliştirme ekibindeki herkesin git (ve loş ya da soluk değil) öğrenmesi bir günden uzun sürdü, bu yüzden doktor takımı için de doğru olacağını varsaydım. Burada belirtilen sitelere yorumlarda bakacağım (belki de bu veya başka bir cevapta olmalılar?).
Monica Cellio

3
Tüm hataları yapmadan ve çelişkili birleşme ve yeniden doğma sıkıntısı çekinceye kadar git öğrenemezsiniz, sadece bir şube yapmanın üstündeki kısa akışı öğrenmeleri gerekir; şubelerini tekrar master'la birleştirmek. Bu akışta karşılaştıkları herhangi bir acıyı gidermeye çalıştıklarında öğrenebilecekleri herhangi bir öğrenme (bazıları olacaktır). En azından doktor ekibinin kod tabanını çiğneme endişesi yok.
MarkJL

1
@ 2rs2ts Kaplumbağa Git olağanüstü bir git gui. Tüm pencerelerime yüklüyorum ve git komut satırını çok iyi biliyorum. Mergetool, şimdiye kadar kullandığım en iyilerden biri. Tortoise Git'i kullanarak bir çok acemi kullanıcı kullanmaya başladım. En büyük sorun, gelişmiş git seçeneklerinden bazılarını yalnızca basit bir onay kutusuyla göstermesidir. Bu nedenle --force push gibi bir seçenek sadece push gui'deki bir kutuyu işaretleyerek yapılabilir. İşini kaybeden şeyin yaptıkları bu olabilir. Tortoise'ı fazla kullanmıyorum, ancak daha basit hale getiren birkaç şey var.
gnash117

26

Bazen yaptığınız şeyin değişmesi gerekir.

En büyük sorun herkesin olmasıdır edilir usta üzerinde çalışıyor. Bu, kod geliştirme için tipik değildir ve sizin durumunuzda da yanlış model olabilir. Bunu değiştirebilirseniz, değişikliklerin ayrı dallarda yapılmasını isteyerek / talep ederek, daha iyi durumda olacaksınız. Şubelerle aşağıdakileri kazanabilirsiniz:

  • Doğrudan baskı yapılmasına masterizin verilmemesini zorunlu kılın .
  • Bitbucket aracılığıyla, çekme isteklerinin oluşturulup birleştirilmeden önce en az bir onay almasını sağlayın . Bu, kullanıcının değişikliklere bakmasını sağlar ve ayrıca kullanıcı masaüstünde ne olursa olsun UI, kodun uzak sürümüyle çakışmalar göstereceğinden birleşmenin kendisini daha az acı verici hale getirir. Bu, başarılı olmuş, ancak başarılı olmayan senaryoyu önler.
  • Birleştirme işleminden önce reponuza "yapı" oluştur. Bunun bir belge deposu olduğunun farkındayım, ancak belki de bu derlemeden oluşturulabilecek yazım denetimi, hukuki kazıma veya otomatik çeviri (STRING_DEF şeylerini bir csv dosyasına aktarma) olabilir. Ya da belki değil, işinize bağlıdır.
  • İnsanların aynı anda daha kolay bir şekilde birçok farklı şey üzerinde çalışmasına izin verin. Evet, bu da zula ile yapılabilir, ama bu biraz dağınık ve bir şey de bunları kullanmadığınızı söylüyor.

Eğer değilse olamaz dallanma kullanmak, bir yazma düşünebilirsiniz merge-and-pushuzakta ağrı noktalardan bazılarını otomatikleştirebildiğiniz senaryoyu. Belki kullanıcının ustada kalmadığını kontrol eder, bir alma ve çekme yapar ve sonra birleştirme girişiminde bulunur ( muhtemelen ile--no-commit --no-ff ), vb.


3
Bahsettiğiniz tüm nedenlerden ötürü dallanmaya geçeceğiz (ancak en çok özellikle kontrol edilen PR'lar ve birleşmeden önce şubede çözülecek sorunları çözme yeteneği). Bir birleştirme ve basma komut dosyasına nasıl saldırılacağı hakkında daha fazla bilgi verebilir misiniz?
Monica Cellio

6
Bu tavsiyeye katılmıyorum. Uzun süre çalışan özellik dalları, ustadan çalışmaktan çok daha yıkıcı olabilir (eğer yerinde iyi bir iş akışı yoksa ne olacak). Martin Fowler'ın bu konuda harika bir makalesi var. Günün sonunda, OP'ler ekibinin Git sorunu değil, iş akışı işbirliği sorunu var. Daha fazla şubenin bu sorunu daha da basitleştireceğini savunuyorum.
DanK

6
Uzun süredir devam eden özellik dalları benim savunduğum şey değil (ne dediğim). "Düzenli" gelişim için kötü olduklarına ve burada daha iyi olmayacaklarına katılıyorum. Birleşmeden önce gözden geçirilebilen / test edilebilecek küçük değişiklik gruplarına sahip düzenli "mantı" dalları çok faydalıdır ve burada cevabında belirtilen tüm nedenlerden dolayı bir dokümantasyon deposudur.
Dan1701

3
Tabii ki, ne söylediğinizi anlıyorum ve teoride katılmıyorum ama burada tarif edilen işbirliği sorunları ile, en iyi niyetlerle bile, OP ekibinin şubelerinin istemeden uzun süredir devam eden branşlara dönüşeceğini düşünüyorum . Günün sonunda, bir ana hatta vs. özellik dalında çalışmak burada temel problem değil. Sorun, dağıtılmış bir VCS'nin giriş / çıkışlarının anlaşılmaması ve geliştiriciler arasında işbirliği / uyum eksikliğidir. Özelliğin dallanma özelliği sorunu çözmez, ancak IMO onu daha da kötüleştirir.
DanK

2
Bunu sohbete taşımaya ihtiyacımıza yaklaşıyoruz, ancak, eğer her zaman bir özellik dalındaysanız, işinizi bitiremezsiniz. Gönderilen şubeyle birleştirilmesi gerekir (veya bu durumda yayınlanır). Bu, ekibinin yaşadığı problemler etrafında otomatik kontroller ve güvenlik önlemleri getirilmesine izin verir. Bir özellik dalı, çoğu araçta (en azından Bitbucket) gerekli onaylarla çekme isteklerine izin verecek şekilde ayarlanmış ve dallanma modelinin bir parçası olarak önceden oluşturulmuş birleştirme işlemlerinde tamamen farklıdır. master.
Dan1701 6:17

12

Birleştirmeleri yineleyebileceğinizi vurgulayın

Sizin için açık olabilir, ancak eski SVN kullanıcıları bir birleştirme işlemini birden çok kez çözmeye çalışabileceklerinin farkında olmayabilir. Bu, aldığınız yardım bayraklarının sayısını azaltabilir.

Çalıştığınız zaman trunkSVN'de etrafta oturmadan kayıtsız şartsız değişiklik yapmanız gerekirdi. O zaman bir yaparsın svn update. Bu noktada değişiklikleriniz sonsuza dek diğer insanlarla değişecektir. Geri almanın bir yolu yoktu (afaik), bu yüzden her şeyi manuel olarak kontrol etmekten ve deponun iyi durumda olduğunu ummaktan başka seçeneğiniz yoktu. Ne zaman gerçekten birleşmeyi tekrar yapmak çok daha rahat olurdu.

Gittiğimizde bile insanlar aynı zihniyete sahip olacaklardı. Çok fazla istenmeyen hataya yol açıyor.

Neyse ki git ile geri dönmenin bir yolu var, çünkü özellikle yerel taahhütlerde bulunabilirsiniz. (Komut satırında bunun nasıl ifade edildiğini daha sonra açıklayacağım)

Bu nasıl yapılsa da, alete göre değişecektir. Bir çekmeyi yinelemenin çoğu GUI'de tek bir düğme olarak görünmediğini, ancak muhtemelen mümkün olduğunu tespit ediyorum. Cygwin'i kullanmanı seviyorum. İş arkadaşlarım sourcetree kullanıyor. BitBucket kullandığınızdan beri aynı şirket tarafından yönetildiği için bunu GUI'niz olarak kullanmak mantıklı olacaktır: Atlassian. Daha sıkı bir entegrasyon olduğundan şüpheleniyorum.

Çekme ile ilgili olarak

Sanırım birleşmenin pullinsanları neyin mahvettiği konusunda haklısın . A pullaslında git fetchdeğişiklikleri sunucudan alan ve ardından git merge origin/<branchname>uzaktan değişiklikleri yerel şubenizde birleştiren * ifadesidir. ( https://git-scm.com/docs/git-pull )

Sonuçta tüm standart birleştirme komutları pull ile çalışır. Bu birleştirme çatışmalar varsa tarafından iptal edebilirsiniz git merge --abort. Hangi birleşmeden önce seni geri götürmeli. Sonra ya git pullda ile tekrar deneyebilirsiniz git merge origin/<branchname>.

Bir şekilde iş arkadaşlarınızın GUI seçim aracını kullanarak yukarıdakilerin nasıl yapıldığını öğrenebilirseniz , sorunlarınızın çoğunu çözeceğini düşünüyorum. Üzgünüm, daha spesifik olamam.

* Kökeninin burada her zaman böyle olmadığını anlıyorum.

git reflogSorunları teşhis etmek için kullanın

Sizin gibi, çoğunlukla GUI araçlarının kötüye kullanılmasıyla yaratılan sorunları teşhis etmek zorundayım. Bunun git reflogbazen depodaki eylemlerin oldukça tutarlı bir izi olduğu için yardımcı olabileceğini düşünüyorum. Zaman zaman okumak zor olsa da.

Bir alternatif

Durumunuz geçici olduğu için , devam edecek süreci gerçekleştirene kadar SVN'ye geri dönebilirsiniz. “Gitmeyi bir kez denedik ama işe yaramadı…” diyerek birçok yerde devam ettiği için bunu yapmakta tereddüt ederdim ve asla geri almadım.

Diğer bazı yaygın geçiş problemleri

  • İnsanlar sık ​​sık depolarını silip geri alırlar, depolarının kullanılamaz bir durumda olduğuna ikna olurlardı. Genellikle bu, yerel ve uzak farkın izini kaybetmekten kaynaklanıyordu. Hem GUI araçları hem de CLI bunu göstermede başarısız oluyor. CLI'de git log --decoratefarkları gözden geçirmenin en kolay yolunu buluyorum . Fakat işler ustada çok kıllı olursa (örneğin)git reset --hard origin/master

2
Son noktanız: Gerçek ve hızlı bir genel bakış için git log --oneline --decorate --graphideal buluyorum . Öyle ki, bu kesin kombinasyon için bir kabuk takma adı tanımladım.
cmaster

1
Cevabınız için +1, sadece önerilen alternatifi kötü bulduğumu düşünüyorum. SVN'ye geri dönseniz bile daha sonra acı çekeceksiniz ve daha sonra gelecekte git. Takımdaki insanlar, başka seçeneğe sahip değillerse, yeni, farklı, acı verici aracı öğreneceklerdir. Sadece kullandıktan ve aptalca hatalar yaptıktan sonra, git neler yapabileceğini takdir etmeye başlayacaklar.
CodeMonkey

8

- Olası bir mekanizma, açık kaynak ekipleri bir çok benimsemiş olması, çatallaşma modelini kullanmaktır https://www.atlassian.com/git/tutorials/comparing-workflows bir çatallaşma git iş akışı tartışırken (açıkça enunciate emin olun ) .

Bu geliştiricinin veya alt ekibin, BitBucket'ten teslim aldıkları depo çatalları vardır , bunun için bir mekanizma sağlarlar , varsayılan uzaktan kumandaya ek olarak "yukarı akış" kökeni ayarlarlar - yukarı akış getirmeyi "hatırlamaları gerekir" "ve" Remote / Upstream / Master'ı düzenli aralıklarla birleştirir.

Yapı araçları, ustaya farklı bir projede, yani çatalda gösterileceği için yapı mekanizma problemlerinizi çözecektir.

Daha sonra birçok insandan doğrudan ana projeye itme yeteneğini kaldırabilir ve rolleri gözden geçirip onaylayan daha küçük bir insan ekibi oluşturabilirsiniz. Bkz https://www.atlassian.com/git/tutorials/making-a-pull-request

İstenilen kontrollerin itten hemen önce yapılmasını sağlamak için okunacak yer kancalar üzerindeki git kitabı bölümündedir - https://git-scm.com/book/gr/v2/Customizing-Git-Git-Hooks - İşin geçerli olmasını sağlamak için önerilen taahhüt üzerinde bazı testler yapmak gibi şeyler yapmak için ön işleme ve ön itme kancalarını kullanabilirsiniz. - Müşteri tarafı kancalarıyla ilgili tek sorun, geliştiricilerin onları devre dışı bırakabilmesi veya etkinleştirememesidir. onlar.

Her iki yukarı akış alma / birleştirme ve kancalar TortoiseGit'te mevcuttur.


Gerçekten kötü bir fikir değil. Ayrıca, bu takım daha rahat oluncaya kadar bir Merge Master'dan faydalanacak gibi geliyor. +1
Greg Burghardt

2
BitBucket, mümkün olduğunda çatalları otomatik olarak hızlı bir şekilde hızlandıran bir çatal senkronizasyon özelliğine sahiptir. Bugün çatallaşmak ve önümüzdeki hafta hiç akıntıdan endişe duymadan kökeninden çekmek çok uygun.
turta

3

Bu, sezgisel görünmeye başlayacak ama beni duyun:

Git ile deneme yapmaya başlamak için onları teşvik edin.

Git hakkındaki ilginç şeylerden biri, herhangi bir yerel operasyonu tamamen güvenli hale getirmenin şaşırtıcı derecede kolay olmasıdır. Git'i ilk kullanmaya başladığımda, kendimi yaparken bulduğum şeylerden biri, bir şeyi mahvetmeme ihtimaline karşı tüm dizini yedekleme olarak sıkıştırmaktı . Daha sonra bunun çok büyük bir kirlilik olduğunu ve işinizi korumak için neredeyse hiç gerekli olmadığının farkına vardım, ancak ne haltında olduğunuzu ve ne yaptığını bilmiyor olsanız bile, çok güvenli ve çok basit olma erdemine sahip Denemek istediğiniz komut çıkacaktır. Bunu yaparken kaçınmanız gereken tek şey push. Hiçbir şeyi zorlamazsanız, istediğiniz herhangi bir şeyi denemek için% 100 güvenli bir yoldur.

Bir şeyler denemekten korkma, gitmeyi öğrenmenin en büyük engellerinden biridir. Size göz korkutucu olan her şey üzerinde çok fazla kontrol sağlıyor . Gerçek şu ki, günlük kullanımınızın çoğu için birkaç güvenli operasyona sadık kalabilirsiniz, ancak bunların hangi komutları araştıracağını bulmak biraz daha zor.

Onlara bir güvenlik hissi vererek , işleri kendi başlarına nasıl yapacaklarını çözmeye çalışmaktan çok daha istekli olacaklar. Ve yerel makinelerinde kendileri için çalışan kişisel bir iş akışı bulma konusunda çok daha fazla güçlenecekler. Herkes aynı şeyi yaparsa yerel , yani yeter ki onlar ne standartlarına uymak gibi gayet itin . Onları böyle hissetmelerini sağlamak için bir işlem yapmadan önce tüm repoyu sıkıştırmayı alırsa, sorun değil; bir şeyler yaptıkça ve bir şeyler denedikçe daha iyi şeyler yapabilecekler. Bir şeyleri denemeye ve ne yaptığını görmeye başlaman için.

Bu, eğitimin değersiz olduğu anlamına gelmez. Aksine, eğitim size özellikleri, kalıpları ve normları tanıtmada yardımcı olabilir. Ancak , günlük işinizde oturup oturup bir şeyler yapmak yerine geçmez . Ne git ne de SVN sadece bir sınıfa girebileceğiniz şeylerdir ve o zamanlar hakkında her şeyi bilirsiniz. Onları tanımak için problemlerinizi çözmek için kullanmanız ve hangi özelliklerin hangi problemlere daha iyi uyması gerektiği.

Git ve gitmeyi öğrenmek için cesaretini kırmayı bırak.

Hiçbir şeyi zorlamamaktan bahsettim, bu aslında onlara öğrettiğiniz şeylerden birine karşı geliyor: her zaman "Taahhüt & İttir" e. Onlara bunu yapmalarını söylemeyi bırakıp tam tersini yapmalarını söylemelisiniz. Git temelde değişikliklerinizin yapılabileceği 5 "yere" sahiptir:

  • Diskte, kaydedilmemiş
  • Aşamalı ancak taahhüt edilmedi
  • Bir de yerel işlemek
  • Yerel bir depoda
  • Uzaktan depolar (Yalnızca taahhütler ve etiketler hiç farklı havuzlar arasında itilir ve çekilir)

Her şeyi tek bir adımda çekip itmeye teşvik etmek yerine, bu 5 farklı yerden yararlanmaya teşvik edin. Onları cesaretlendirin:

  • Bir şey yapmadan önce değişiklikleri al.
  • Bir Make kararı getirilen değişikliklerin nasıl işleneceğini. Seçenekler:

    • Yerel değişikliklerini tamamlayın, ardından alınan değişikliklerin üstüne yeniden ekleyin.
    • Yerel değişikliklerini kabul et ve ardından getirilen değişikliklerle birleş.
    • Değişikliklerini saklayın, birleştirin ve ardından çakışmaları düzeltin ve çözümleyin.

      Başka şeyler var, ama buraya girmeyeceğim. Bir çekme, kelimenin tam anlamıyla sadece bir getirme ve birleştirme olduğunu unutmayın. Onlar gibi değil; o ise onları. ( --rebaseDeğişikliklerin yapılması, getirme + birleştirme'den getirme + yeniden oluşturmaya çekmek için geçerlidir.)

  • Değişikliklerini yapın ve ardından gözden geçirin.
  • Aşamalı değişikliklerini yapın ve ardından taahhüdü gözden geçirin.
  • Ayrı olarak itin.

Bu, çalışmalarını herkese açık hale getirmeden önce çalışmalarını kontrol etmelerini teşvik eder , bu da hatalarını daha erken yakalayabilecekleri anlamına gelir. Taahhütlerini görecekler ve “Bekle, istediğim şey bu değil” diye düşünecekler ve SVN'den farklı olarak, itmeden önce geri dönüp tekrar deneyebilirler.

Değişikliklerinin nerede olduğunu anlama fikrine alıştıktan sonra, adımların ne zaman atlanacağına ve belirli işlemlerin ne zaman birleştirileceğine karar vermeye başlayabilirler (ne zaman çekilmesi gerektiğine, ne zaman çekmek istediğinizi biliyorsunuzdur; .

Bu aslında Git'in SVN üzerindeki muazzam faydalarından biri ve git bu kullanım şekli göz önünde bulundurularak tasarlandı . Buna karşılık SVN, merkezi bir depoya bürünüyor, bu nedenle git için kullanılan takımın aynı iş akışı için optimize edilmiş olması şaşırtıcı değil. SVN'de, taahhüdünüz yanlışsa, tek gerçek başvurunuz yanlışlığı gidermek için yeni bir taahhüttür.

Bunu yapmak aslında doğal olarak bir sonraki stratejiye yol açacaktır:

Yerel şubeleri kullanmalarını teşvik edin

Yerel şubeler aslında paylaşılan dosyalar üzerinde çalışmanın acı noktalarını çok kolaylaştırıyor. İstediğim tüm değişiklikleri kendi şubemde yapabilirim ve onları zorlamadığımdan hiç kimseyi etkilemeyecek. Sonra zaman geldiğinde, aynı birleştirme ve yeniden pazarlama stratejilerinin hepsini kullanabilirim, ancak daha kolay:

  • Yerel şubemi yeniden değerlendirebilirim, bu da onu ustaca önemsiz hale getirdi.
  • Yerel şubemin değişikliklerini buna dahil etmek için ustada düz bir birleştirme (yeni bir taahhüt oluşturma) kullanabilirim.
  • Şubeumun kurtarılması zor bir durum olduğunu düşünüyorsanız, tüm yerel şubemi ustalıkla tek bir bağlılıkla birleştirebilirim.

Yerel şubeleri kullanmak da sistematik bir dallanma stratejisi bulmak için iyi bir başlangıçtır. Kullanıcılarınızın kendi dallanma ihtiyaçlarını daha iyi anlamalarına yardımcı olur, böylece herkesin duyduğu için Gitflow'a düşmek yerine ihtiyaçlara ve ekibin mevcut anlayış / beceri seviyesine dayalı bir strateji seçebilirsiniz.

özet

Kısacası, git SVN değildir ve böyle davranılamaz. Gerek:

  • Güvenli denemeyi teşvik ederek korkuyu ortadan kaldırın.
  • Git'in ne kadar farklı olduğunu anlamalarına yardımcı olun ki normal iş akışını nasıl değiştirdiğini görebilsinler.
  • Sorunlarını daha kolay çözmelerine yardımcı olmak için mevcut özellikleri anlamalarına yardımcı olun.

Tüm bunlar , bir dizi standardı uygulamaya başlayabileceğiniz noktaya ulaşana kadar giderek daha iyi git kullanımını benimsemenize yardımcı olacaktır .

Spesifik özellikler

Kısa vadede, aşağıdaki fikirler yardımcı olabilir.

rebase

Rebase'den bahsettin ve sorunda gerçekten anlamadın. İşte benim tavsiyem: az önce tarif ettiğim şeyi deneyin. Bazı değişiklikleri yerel olarak uygulayın, bir başkası bazı değişiklikleri zorladı. Değişikliklerinizi yerel olarak taahhüt edin . Depo dizininizi yedekleyin. Diğer kişinin değişikliklerini al. Şimdi bir rebase komutunu çalıştırmayı deneyin ve taahhütlerinize ne olacağını görün! Sonsuz blog yayınları okuyabilir veya yeniden düzenleme ve nasıl kullanmanız gerektiği veya kullanmaması gerektiği konusunda eğitim alabilirsiniz, ancak bunların hiçbiri, canlı yayınlandığını görmek için bir yedek değildir. Öyleyse dene .

merge.ff=only

Bu kişisel zevk meselesi olacak, ama en azından geçici olarak, anlaşmazlığı gidermekle ilgili sorunların olduğunu söylediğinden beri tavsiye edeceğim. Ben tavsiye ayarı merge.ffiçinonly :

git config --global merge.ff only

"ff" "hızlı ileri" anlamına gelir. Hızlı ileri birleştirme, git'in farklı komisyonlardan gelen değişiklikleri birleştirmesi gerekmediği zamandır. Şube işaretçisini grafikteki düz bir çizgi boyunca yeni bir işleme doğru hareket ettirir.

Bunun pratikte yaptığı, git'in otomatik olarak birleştirme komisyonları oluşturmaya çalışmasını önlemektir. Bu nedenle, yerel olarak bir şey taahhüt edersem ve ardından bir birleştirme taahhüdü oluşturmaya çalışmak yerine (ve kullanıcıyı potansiyel olarak çakışmalarla başa çıkmaya zorlamak yerine) başka birinin değişikliklerini kabul edersem, birleştirme başarısız olur. Aslında, git yalnızca bir a gerçekleştirmiş olacak fetch. Yerel bir taahhüdünüz yoksa, birleştirme normal şekilde ilerler.

Bu, kullanıcılara birleştirme girişiminde bulunmadan önce farklı taahhütleri gözden geçirme şansı verir ve onları birleştirmenin en iyi şekilde nasıl ele alınacağına dair bir karar vermeye zorlar. Yeniden git merge --no-ffyapılandırabilir , birleştirme işlemine devam edebilir ( yapılandırmayı atlamak için kullanarak ), veya şimdilik değişikliklerimi birleştirmeyi bırakıp daha sonra halledebilirim. Bu küçük hızlı çarpma ekibinizin birlikler hakkında yanlış kararlar vermekten kaçınmasına yardımcı olacağını düşünüyorum. Birleşmeleri idare etmede daha iyi olduklarında ekibinizin kapanmasına izin verebilirsiniz.


2

Şirketimde aynı SVN -> git deneyiminden geçtim ve deneyimlerime göre, tek çare zaman. İnsanların araçlara alışmalarına, hata yapmalarına, onları nasıl onaracaklarını gösterin. Hızınız bir süre acı çekecek ve insanlar işlerini kaybedecek ve herkes biraz tetchy olacak, ancak bu VCS'niz kadar temel bir şeyi değiştirmenin doğasıdır.

Bununla birlikte, TortoiseGit'in geçiş döneminin başlarında bir yardımdan ziyade bir engel olduğu görüşünde olan herkesle aynı fikirdeyim. TortoiseGit ... en iyi zamanlar için iyi bir GUI değildir ve git'in aslında basitlik adına nasıl çalıştığını gizleyerek iş arkadaşlarınızın iki aşamalı taahhüt gibi temel git kavramlarını anlamalarını önler.

Devs'i komut satırını (git bash veya posh-git ) bir hafta boyunca kullanmaya zorlama (oldukça sert) kararını verdik ve git'in gerçekte nasıl çalıştığını ve SVN'den nasıl farklı olduğunu anlamak için harikalar yarattı. Kulağa sert gelebilir, ancak basitçe denemenizi öneririm çünkü git modelini anlama anlayışı yaratır - ve bunu bir kez yaptıklarında, iş arkadaşlarınız gitmeden önce GUI cephelerini kullanmaya başlayabilirler.

Son not: Git'in neredeyse nasıl çalıştığını anlatan iş arkadaşlarınız olacak ve hiç çalışmayanlar olacak. İkinci grup, kodlarının yerel makineden sunucuya geçmesini sağlamak için mistik teşvikler öğretmeniz ve böylece herkesin görmesini sağlamanız gerekir.


1

Son zamanlarda, aşağıdaki iş akışını ana şubeyi asla doldurmamak için uyarladım:

1) Herkes esas olarak ana daldan bir kopyası olan kendi dalını kullanır.

Ana şubeye "master" ve kendi şubeme "my_master" adını verelim.

Ben şubemi ustadan yaptım, o yüzden aynısı. Kendi şubemde yeni bir özellik üzerinde çalışmaya başladım ve bittiğinde aşağıdakileri yapıyorum.

Şubemde parasal olarak, kodlamayı yeni bitirdim

git add . && git commit -m "Message" && git push

Ana şubeye geri dön

git checkout master

Güncel değilse çekin

git pull

Kendi şubeme geri dön

git checkout my_master

En son efendimi kendi şubemle birleştir

git merge master

Çakışmaları ve birleştirmeleri düzelt

Her şeyi tekrar test et

Her şey birleştiğinde ve kendi şubemde sabitlendiğinde, it

git push

Ana şubeye geri dön

git checkout master

Şubemle birleştir

git merge my_master

Önceden bir birleşme ile kendi şubenizde çözüldüğü için çatışmalar olması imkansız

Master it

git push

Herkes bunu takip ederse, ana dal temiz olur.


0

Bu yüzden TFS'den git'e geçen ve eski düşünme tarzlarını koruyan bir ekibimiz var. Genel operasyon kuralları aşağı yukarı aynıdır.

Evet, bu herkesin usta üzerinde çalıştığı anlamına gelir. Bu o kadar da kötü değil; ve TFS veya SVN için kullanılan bir ekip bunu en doğal bulacak.

Bunu mümkün olduğunca acısız hale getirmek için genel prosedürler:

  1. do git stash && git pull --rebase && git stash popher sabah
  2. erken ve sık taahhüt edin (derhal itmeye gerek yok; en azından git bu avantajından yararlanmaya başlayabiliriz)
  3. itmek için aşağıdaki döngüyü yapın:

    git add git commit git pull --rebase fix any merges compile git push loop until you don't get the can't fast forward error message.


Bunu yaparsanız, SVN ile de kalabilirsiniz. Aynı zamanda otomobil günlerinde at arabası ile kalabileceğiniz gibi oldu. Elbette, arabanızı bir at arabasıyla aynı hızda sürebilirsiniz. Ancak, bununla elde ettiğiniz tek şey, kendinizi engellemek ve bir aracı kullanabilecek insanları size kızdırmak. Arabanı sürmeyi öğren. Şimdi.
cmaster

@cmaster: Bizim için git'in 1 numaralı avantajı sunucunun kaybıydı, tüm kaynak kontrol geçmişini kaybetmedi. (Başımıza geldi - yedeklerimiz vardı, ancak teyp sürücüsü, geri yüklemeye çalıştığımızda kaset yemeye başladı.)
Joshua

@cmaster: O zamandan beri başka kullanışlı git özelliklerini de tanıtmaya başladık, ancak dallanma değişikliklerini kullanmayacağız.
Joshua

@cmaster Yavaş yavaş araba kullanmak ile ata binmek arasındaki fark, aracı sürmenin sizi daha hızlı sürmeniz için hazırlamasıdır. Ata binmek değil. Bir arabaya atlayan herkes, içinde bulundukları ilk birkaç kez 60 mil gitmek için gaza çarpmak zorunda değildir.
jpmc26

@ jpmc26 İlk sürüş derslerimi aldığımda, kesinlikle 30 km / s sürüş yapmam istendi ve bu dersin de 50 km / s'de kısa bir mesafe içerdiğine inanıyorum. Bu kesinlikle tipik bir at arabasından çok daha fazlası. Aynı şey şu şekilde devam eder git: Genelde birinci günden itibaren çatallaşmayı ve birleşmeyi öğrenirsiniz. Bu kullanmanın ayrılmaz bir parçası git. Bundan kaçının ve aracı 15 km / s'den daha fazla giderken bir aracı kötüye kullandığınız gibi kötüye kullanıyorsunuz.
cmaster

-3

Herkes usta üzerinde çalışıyorsa, yapabileceğiniz hiçbir şey yok. İşler kaçınılmaz olarak berbatlaşacak.

Bir müşteriye gönderilen tamamlanmış ürünler için master kullanmalısınız. Devam eden gelişim için geliştirmeyi kullanmalı ve hiç kimsenin gelişime itmesine izin vermemelisiniz. Standart, herkesin dev'ten şubelere dalması, değişiklik yapması, yerelden sunucudaki şubesine itmesi ve bir zorlama isteği göndermesidir. Sonra birisi değişimi gözden geçirir ve gelişim ile birleştirir.

Çatışmalardan kaçınmak için herkes gelişmeyi zorlamadan önce kendi branşında birleştirir ve bu aşamadaki çatışmaları çözer (bu nedenle yalnızca yerel olarak bir geliştiriciyi etkiler). Geliştirmeyle birleşme çatışmalara yol açarsa, o zaman birleştirilmez - geliştirici gelişmeyi tekrar kendi branşında birleştirir ve tekrar sunucuya iter ve ardından tekrar gözden geçirilir.

Sourcetree'yi örneğin bu işi hiç acı çekmeden yapmak için kullanabilirsiniz.


4
Bu sadece “usta” yı “geliştirme” ile değiştirir ve insanların varsayılan bir ödeme işleminden sonra geliştirme dalına geçmeme riski de vardır. Ağır GitFlow ve seyrek GitHub Flow arasındaki mutlu bir ortam olan GitLab Flow'u tercih ederim .
Cees Timmerman

Eğer Gitflow beğenmezseniz @CeesTimmerman, ilginizi olabileceğini OneFlow'un de.
jpmc26
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.