"Git add, git commit" öncesi veya sonrası "git pull" işlemini ne zaman yapmam gerekir?


93

Doğru yol nedir?

git add foo.js
git commit foo.js -m "commit"
git pull
git push

Veya

git pull
git add foo.js
git commit foo.js -m "commit"
git push

Veya

git add foo.js
git pull
git commit foo.js -m "commit"
git push

UPD:

Bu durumda izlenen ve değiştirilen bir dosyayı hazırlamak git addiçin kullandığımı söylemeyi unuttum . Depoya yeni bir dosya dahil etmemek. Bu bir komut sırasını değiştiriyor mu?


Yanıtlar:


97

Bunu yapmanın en iyi yolunun şu olduğunu düşünüyorum:

Yerel değişikliklerinizi saklayın:

git stash

Şubeyi en son koda güncelleyin

git pull

Yerel değişikliklerinizi en son kodla birleştirin:

git stash apply

Değişikliklerinizi ekleyin, uygulayın ve uygulayın

git add
git commit
git push

Tecrübelerime göre Git ile en az direniş yolu budur (yine de komut satırında).


4
Bunun neden daha iyi olduğunu açıklayabilir misin ? Bu hangi sorunları önler? Özellikle, bu neden basit bir commit> push> push'tan daha iyidir? (Bunun en iyi cevap olabileceğini düşünüyorum, ancak şu anda iyi bir cevap olarak kabul edilebilecek kadar bilgi yok.)
dallin

7
Belki bu çok anekdottu ama bu yaklaşımı (kaynak ağacı gibi bir şey yerine komut satırında) her zaman çok daha kolay buldum. Büyük bir takımda çalışırken bir commit yapmak ve sonra çekmek, her zaman büyük birleştirme çatışmalarına yol açar, çünkü git, değişikliklerimi gelen ile bir dosyada birleştirmede çok iyi değildi. Saklayarak, yeni değişiklikleri çekmeme ve ardından güncellenmiş kodu değişikliklerimi eklemek için bir temel olarak kullanmama izin verdi. Benim için daha net oldukları için çatışmalarla başa çıkmak daha kolaydı (çünkü benim değişikliklerim artık çatışmalardı). Geriye dönüp baktığımda, belki de durumum için daha kolaydı.
johnjo

1
Öyleyse kulağa "Bir fili nasıl yersin? Her seferinde bir ısırık" gibi bir şey gibi geliyor. Örneğin, daha az ve muhtemelen daha net değişikliklere sahip olacak şekilde birleştirmeleri basitleştirmek için süreci birkaç adıma daha bölmek. Mantıklı.
dallin

Git add burada gerekli mi? Tüm dosyalar zaten hazırlamaya eklenmişse!
Sharp Edge

Ya kullanmıyorsanız git stash?
Aaron Franke

76

çekme = getir + birleştirme.

Birleşmeden önce yaptığınız şeyi taahhüt etmelisiniz.

Bu yüzden taahhüt ettikten sonra çekin.


8
Bu, yaptığınız her taahhüt için fazladan bir taahhütte bulunmanız ve repoyu özensiz hale getirmeniz anlamına mı gelir? Ayrıca ilk taahhüt mesajınız, ardından her seferinde bir birleştirme yorumu ile sonuçlanır. Öyleyse, aşağıda @johnjo tarafından belirtilen saklama yöntemini kullanmaya meyilli olurum.
Pazartesi

3
@DanielM Evet, birleştirme için fazladan bir kesinleştirme var (açık bir varsayılan kaydetme mesajıyla). Bu oldukça iyi bir şeydir çünkü son işleminizi veya meslektaşınızın son işlemini veya birleştirme taahhüdünü kontrol etmenizi sağlar. Bundan kaçınmak istiyorsanız ve taahhütlerinizi meslektaşınızın taahhütlerinden sonra yerleştirmek istiyorsanız, rebasebunun yerine yapabilirsiniz merge. Ya bunu yapabilir git commit && git rebaseya git pull --rebase.
Arnaud Denoyelle

İpucu için teşekkürler, @Arnaud. Birçok farklı SO sorusunu okuduktan sonra, bu yorum onu ​​yaptı. Meslektaşlarım farklı dosyalar üzerinde çalışırken tercih git pullettiğim seçenek , en doğal bulduğum için değişikliklerimi aşamalandırmaktır. Pek çok farklı iş akışının çalıştığını fark etsem de (zula da güzeldir), bu yüzden muhtemelen bir zevk meselesi.
yeğen

51

Büyük birleşmeleri ve olası çakışmaları en aza indirmek için uzak daldan olabildiğince sık çekim yapmanızı öneririm.

Bunu söyledikten sonra, ilk seçenekle gideceğim:

git add foo.js
git commit foo.js -m "commit"
git pull
git push

Değişikliklerinizi çekmeden önce tamamlayın, böylece kayıtlarınız çekme sırasında uzaktan değişikliklerle birleştirilir. Bu, herhangi bir şey ters giderse kodunuzun zaten işlendiğini bilerek başa çıkmaya başlayabileceğiniz çatışmalara neden olabilir ve herhangi bir nedenle birleştirmeyi iptal etmeniz gerekir.

Eminim ki birisi benimle aynı fikirde olmayacaktır, bu birleştirme akışını yapmanın doğru bir yolu olduğunu düşünmüyorum, sadece insanlar için en iyi olanı.


1
Soru ile ilgili güncellememi görebilir misiniz lütfen? Örneğimde git addtam olarak ne için kullanıldığını açıklamayı unuttum .
Green

1
Yeni bir dosya veya izlenen / değiştirilmiş bir dosya olması fark etmez. Hala taahhütte bulunun ve sonra çekin.
Jasarien

7

Bence git pull --rebase, yerel olarak yakın zamanda yaptığınız taahhütleri, belirli bir noktada sahip olmadığınız uzaktan kayıtların üzerine yerleştirmenin en temiz yolu.

Böylece, her değişiklik yapmaya başlamak istediğinizde çekmenize gerek kalmaz.


Benim de yaptığım şey bu, ancak bununla ilgili kesinlikle iki ana düşünce okulu olduğunu belirtmek için (bireysel taahhütlerdeki çatışmaları düzeltmenin mi yoksa birleştirme taahhüdünde bir kez mi en iyisi olduğu etrafında) Linus ile birleştirme kampında kendisiyle . Neyse ki aracı kendisi opinionated değildir, bu yüzden ancak sizin ve projenizin ihtiyaçlarına :-) için en uygun kullanmak
Luke Usherwood

3

Değişikliğinizin uzak şubenin mevcut durumunun üstüne oturmasını istiyorsunuz. Yani muhtemelen kendini adamadan hemen önce çekmek istersin. Bundan sonra, değişikliklerinizi tekrar itin.

Uzak dal ile herhangi bir çakışma olmadığı sürece "kirli" yerel dosyalar sorun teşkil etmez. Yine de çatışmalar varsa, birleştirme başarısız olur, bu nedenle yerel değişiklikleri yapmadan önce çekmede herhangi bir risk veya tehlike yoktur.


1
Arnaud'un da belirttiği gibi işe yaramayacak, çekmek önce değişikliklerinizi gerçekleştirmenizi gerektirir.
Jasarien

Git'im pek çok yerel değişiklikle uğraşmaktan mutlu görünüyor. Elbette, uzak dalda aynı dosyalar değiştirilirse, çekme işleminin birleştirme kısmı başarısız olur. Düzgün bir birleştirme çatışması yaratmak için önce taahhüt etmem gerekiyor, tabii. Bu nedenle, yerel olarak ve uzaktan değiştirilen dosya kümesi ayrıksa, çekip sonra işleme almak sorun değil. Aksi takdirde git çekmeyecektir. Denemekle zarar gelmez.
AlexE

İnsanlar farklı dosyalar üzerinde çalışırken tercih ettiğim seçenek bu ve bunu en doğal buluyorum.
yeğen
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.