Yeni başlayanlar için Git: Kesin pratik kılavuz


854

Tamam, PJ Hyett'in bu yazısını gördükten sonra , sonuna atlayıp Git ile gitmeye karar verdim .

Yani ihtiyacım olan, Git için pratik bir başlangıç kılavuzu. "Başlangıç", derleyicilerini nasıl kullanacağını bilen, Makefile'nin ne olduğunu bir düzeyde anlayan ve çok iyi anlamadan kaynak kontrolüne dokunan biri olarak tanımlanmaktadır .

"Pratik" olarak tanımlanan bu kişi Git'in arka planda ne yaptığına dair ayrıntılı bir ayrıntıya girmek istemez ve dağıtıldığını bile umursamaz (veya bilmez). Yanıtlarınız olasılıkları gösterebilir, ancak yedeklenen ve güvenli olan bir 'sunucu'da' ana 'bir depo tutmak isteyen yeni başlayanları hedeflemeye çalışın ve yerel depolarına sadece bir' istemci 'kaynağı gibi davranın.

Yani:

Kurulum / Ayarlar

Kod ile çalışma

Etiketleme, dallanma, bültenler, taban çizgileri

Diğer

  • Git'i komut olmayan bir satır kaynağı yapan iyi bir GUI, IDE eklentisi vb. Açıklayın ve bağlantı kurun, ancak lütfen sınırlamalarını ve iyi olanlarını listeleyin.
    • msysgit - Çapraz platform, Git'e dahil
    • gitk - Git'e dahil olan platformlar arası geçmiş görüntüleyici
    • gitnub - Mac OS X
    • gitx - Mac OS X geçmiş görüntüleyicisi
    • smartgit - Çapraz platform, ticari, beta
    • tig - Linux için konsol GUI'si
    • qgit - Windows, Linux için GUI
    • Git Uzantıları - Windows paketi, kullanıcı dostu GUI içerir
  • Yeni başlayanların bilmesi gereken başka ortak görevler var mı?
  • Kaynak kontrol kaynağım olarak ayarlanmış bir yıkım havuzuyla nasıl etkili bir şekilde çalışabilirim?

Diğer Git acemi referansları

Git'e girmek

Girişleri zaman zaman gözden geçireceğim ve tutarlı bir görünüm / his sahibi olacakları için onları düzenli hale getireceğim ve listeyi taramak kolay - basit bir "başlık - kısa açıklama - talimatlar listesi - gotchas ve fazladan bilgi "şablonu. Ayrıca yukarıdaki madde işareti listesindeki girişlere de bağlanacağım, böylece daha sonra kolayca bulabilirsiniz.

Yanıtlar:


118

Nasıl yeni bir proje / havuz yaratırsınız?

Git deposu yalnızca özel bir dizin içeren bir .gitdizindir.

Bu, checkout"çalışan bir kopya" dizinine bir uzak sunucuda bir "havuzun" barındırıldığı "merkezi" sürüm kontrol sistemlerinden (alt sürüm gibi) farklıdır . Git ile, sizin çalışma kopyası olduğunu deposu.

İzlemek git initistediğiniz dosyaları içeren dizinde çalıştırın .

Örneğin,

cd ~/code/project001/
git init

Bu .git, geçerli dizinde (gizli) bir klasör oluşturur .

Yeni bir proje yapmak git initiçin ek bir argümanla (oluşturulacak dizinin adı) çalıştırın:

git init project002

(This is equivalent to: mkdir project002 && cd project002 && git init)

Geçerli geçerli yolun bir git deposunda olup olmadığını kontrol etmek için çalıştırın git status; bir havuz değilse, "ölümcül: Git deposu değil" raporunu verir.

Ayrıca .gitdizini listeleyebilir ve aşağıdakine benzer dosyalar / dizinler içerdiğini kontrol edebilirsiniz:

$ ls .git
HEAD         config       hooks/       objects/
branches/    description  info/        refs/

Herhangi bir nedenden dolayı bir havuzu "de-git" istiyorsanız (o projeyi izlemek için git'i kullanmayı bırakmak istersiniz). Deponun .gittaban düzeyinde dizini kaldırmanız yeterlidir .

cd ~/code/project001/
rm -rf .git/

Dikkat: Bu, tüm düzeltme geçmişini, tüm etiketlerinizi, git'in yaptığı her şeyi yok edecektir . "Geçerli" dosyalara (şu anda görebileceğiniz dosyalar) dokunmaz, ancak önceki değişiklikler, silinmiş dosyalar vb. Kurtarılamaz!


3
Git nesnelerini salt okunur yapar, böylece rm -rf .gitgit'in veritabanını silmek istersiniz .
Josh Lee

Normalde, sürüm kullanımında yoksayılacak dosyaları / ağaçları belirtmek için normal kullanım sırasında bir .gitignore dosyası oluşturulmalıdır. gitignore dosyası. :)
Monoman

Çıplak depolara ne dersiniz? Onlar bir şekilde "merkezileştirilmiş" ve bence bir çeşit merkezileşmeye ihtiyaç duyan birçok proje için iyi bir şey (örn: birçok kişi tarafından geliştirilen projeler)
peoro

git statusBir depoda olduğunuzdan emin olmak için WRT çalışıyor : bunun bir tane var: mevcut kabuğunuzda $ GIT_DIR ortam değişkeni varsa, git geçerli konumunuzu yok sayar ve $ GIT_DIR adresindeki depoyu kullanır. Bilmeliyim, dün bir saat kaybettim.
sanmiguel

110

Git için GUI'ler


Git GUI

Git - git guiKomut satırından Çalıştır ve Windows msysgit yükleyicisi bunu Başlat menüsüne ekler.

Git GUI, git ile yapmanız gerekenlerin çoğunu yapabilir. Sahne alanı değişiklikleri dahil olmak üzere, git ve depoları yapılandırın, değişiklikleri değiştirin, dallar oluşturun / ödünç alın / silin, birleştirme ve daha pek çok şey yapın.

En sevdiğim özelliklerden biri, sağ tıklama menüsündeki "sahne çizgisi" ve "sahne yığını" kısayolları. Aynı şeyi elde edebilirsiniz git add -i, ancak kullanımı daha kolay buluyorum.

En güzel uygulama değil, ancak neredeyse tüm platformlarda çalışıyor (Tcl / Tk'ye dayanarak)

Ekran görüntüleri | bir ekran görüntüsü


gitk

Git ile de dahil. Git geçmişi görüntüleyicisidir ve bir havuzun geçmişini (dallar, oluşturuldukları ve birleştirildikleri zamanlar dahil) görselleştirmenizi sağlar. Taahhütleri görüntüleyebilir ve arayabilirsiniz.

Git-gui ile birlikte güzel gider.


Gitnub

Mac OS X uygulaması. Esas olarak eşdeğerdir git log, ancak github ile bazı entegrasyona sahiptir ("Ağ görünümü" gibi).

Güzel görünüyor ve Mac OS X ile uyumlu. Depolarda arama yapabilirsiniz. Gitnub'ın en büyük eleştirisi, tarihi lineer bir şekilde göstermesidir (her seferinde tek bir dal) - planlı bir gelişme olmasına rağmen, git ile önemli olabilecek dallanma ve birleşmeyi görselleştirmez.

Bağlantıları indirin, günlüğü ve ekran görüntülerini değiştirin | git deposu


GitX

"OS X için gitk klonu" olmayı amaçlamaktadır.

Doğrusal olmayan dallanma geçmişini görselleştirebilir, taahhütleri gerçekleştirebilir, görüntüleme ve arama taahhütlerini yapabilir ve herhangi bir revizyondaki herhangi bir dosyayı (dosya listesi görünümünde basın alanı), herhangi bir dosyayı dışa aktarabilme gibi bazı güzel özelliklere sahiptir. (sürükle ve bırak yöntemiyle).

OS X'e git-gui/ ' den çok daha iyi entegre edilmiştir gitkve olağanüstü büyük depolarda bile hızlı ve kararlıdır.

Orijinal git veri havuzu pieter yakın zamanda güncellenmedi (yazma sırasında bir yıldan fazla). Brotherbard / gitx'te daha aktif olarak korunan bir şube mevcuttur - "kenar çubuğu, getirme, çekme, itme, uzaktan ekleme, birleştirme, kiraz toplama, yeniden oluşturma, klon, klonlama"

İndir | Ekran görüntüleri | git deposu | kardeş çatalı | laullon çatal


SmartGit

Ana sayfadan:

SmartGit dağıtılmış sürüm kontrol sistemi Git için bir ön uçtur ve Windows, Mac OS X ve Linux üzerinde çalışır. SmartGit, bir komut satırı istemcisi üzerinden grafik kullanıcı arabirimi tercih eden geliştiricilerin, günümüzün en güçlü DVCS'si olan Git ile daha da üretken olmalarını amaçlamaktadır.

Web sitelerinden indirebilirsiniz .

İndir


TortoiseGit

TortoiseSVN Windows kullanıcıları için Git sürümü.

TortoiseSVN'yi TortoiseGit'e taşıyor En son sürüm 1.2.1.0 Bu sürüm, taahhüt, gösteri günlüğü, iki sürümü farklılaştır, şube ve etiket oluştur, Yama oluştur vb. Gibi normal görevleri tamamlayabilir. Ayrıntılar için ReleaseNotes'a bakın . Bu projeye katkıda bulunmaya hoş geldiniz.

İndir


QGit

QGit, Qt / C ++ üzerine kurulmuş bir git GUI görüntüleyicisidir.

Qgit ile düzeltme geçmişine göz atabilir, yama içeriğini ve değiştirilmiş dosyaları görüntüleyebilir, farklı geliştirme dallarını grafiksel olarak takip edebilirsiniz.

İndir


gitg

gitg, gtk + / GNOME hedefleyen bir git veri havuzu görüntüleyicisidir. Temel amaçlarından biri, birden fazla masaüstünde git ön uçları için daha birleşik bir kullanıcı deneyimi sağlamaktır. Bu bir çapraz platform uygulaması değil, diğer işletim sistemleri için benzer istemcilerle (OS X için GitX gibi) yakın işbirliği yaparak yazıyor.

Özellikleri

  • Düzeltme geçmişine göz atın.
  • Büyük depoları kullanın (linux deposunu yükler, 1 saniyenin altında 17000+ düzeltme).
  • Değişiklikleri yapın.
  • Sahnede / dengesiz bireysel iri parçalar.
  • Değişiklikleri geri al.
  • Düzeltmelerdeki değişikliklerin renklendirilmiş farkını göster.
  • Belirli bir düzeltme için ağaca göz atın.
  • Belirli bir düzeltme ağacının bölümlerini dışa aktarın.
  • 'Git log' gibi bir komutun geçmişi oluşturmak için anlayabileceği tüm refspec'leri sağlayın.
  • Geçmiş görünümünde şubeleri gösterme ve aralarında geçiş yapma.

İndir: sürümler veya kaynak


Gitbox

Gitbox, Git sürüm kontrol sistemi için bir Mac OS X grafik arayüzüdür. Tek bir pencerede dalları, geçmişi ve çalışma dizini durumunu görebilirsiniz.

Günlük işlemler kolaydır: bir onay kutusuyla sahne ve değişmez değişiklikler. Tek bir tıklama ile işlem yapın, çekin, birleştirin ve itin. FileMerge.app ile fark göstermek için bir değişikliği çift tıklatın.

İndir


GITY

Gity web sitesinde çok fazla bilgi yok, ancak oradaki ekran görüntülerinden zengin özelliklere sahip bir açık kaynak OS X git gui gibi görünüyor.

İndirme veya kaynak


Meld

Meld görsel bir fark ve birleştirme aracıdır. İki veya üç dosyayı karşılaştırabilir ve bunları yerinde düzenleyebilirsiniz (diffs dinamik olarak güncellenir). İki veya üç klasörü karşılaştırabilir ve dosya karşılaştırmalarını başlatabilirsiniz. CVS, Subversion, Bazaar-ng ve Mercurial [ ve Git ] gibi popüler sürüm kontrol sistemlerinden çalışan bir kopyaya göz atabilir ve görüntüleyebilirsiniz .

İndirilenler


Katana

Steve Dekorte tarafından OSX için Git GUI.

Bir bakışta, hangi uzak dalların çekecek değişikliklere ve yerel depoların itme değişikliklerine sahip olduğunu görün. Add, kesinleştirme, itme, çekme, etiketleme ve sıfırlama işlemlerinin git op'ları, görsel farklar ve yerel değişiklik ve eklemeleri vurgulayan proje hieracy'sinin görsel olarak taranması desteklenir.

1 depo için ücretsiz, daha fazla bilgi için 25 $.

İndir


Filiz (eski adı GitMac)

Git'in kullanımını kolaylaştırmaya odaklanır. Doğal bir Kakao (mac benzeri) kullanıcı arayüzü, hızlı havuz tarama, klonlama, itme / çekme, dallanma / birleştirme, görsel fark, uzak dallar, Terminal'e kolay erişim ve daha fazlası.

En sık kullanılan Git eylemlerini sezgisel ve kolay gerçekleştirilebilen Sprout (eski adıyla GitMac) Git'i kullanıcı dostu hale getirir. Git iş akışlarının çoğuyla uyumlu olan Sprout, tasarımcılar ve geliştiriciler, ekip işbirliği ve ileri ve acemi kullanıcılar için mükemmeldir.

İndir | İnternet sitesi


Kule

Mac OSX için zengin özellikli Git GUI. 30 günlük ücretsiz deneme sürümü, tek kullanıcı lisansı için 59 USD.

İndir | İnternet sitesi


Eğit

EGit, Git sürüm kontrol sistemi için bir Eclipse Team sağlayıcısıdır. Git dağıtılmış bir SCM'dir, yani her geliştiricinin kodun her revizyonunun tüm geçmişinin tam bir kopyası vardır, bu da tarihe karşı sorguları çok hızlı ve çok yönlü hale getirir.

EGit projesi Git'in JGit Java uygulamasının üzerine Eclipse araçlarını uyguluyor.

İndir | İnternet sitesi


Git Uzantıları

Windows için Açık Kaynak - Git ile çalışmak için ihtiyacınız olan her şeyi tek bir pakete yükler, kullanımı kolaydır.

Git Extensions, Windows'ta Git ile çalışmayı daha sezgisel hale getiren bir araçtır. Kabuk uzantısı Windows Gezgini'nde bütünleşir ve dosyalar ve dizinler üzerinde bir bağlam menüsü sunar. Visual Studio'dan git kullanmak için bir Visual Studio eklentisi de vardır.

İndir

Git GUI şeyler üzerinde ayrıntılı için dbr büyük teşekkürler .


SourceTree

SourceTree, Git, Mercurial ve SVN için ücretsiz bir Mac istemcisidir. BitBucket'in arkasındaki millet olan Atlassian tarafından inşa edilen, tüm projelerinizle birlikte kullanmak için tek bir araçta ustalaşmanıza izin veren her türlü VC sistemi ile eşit derecede iyi çalışıyor gibi görünüyor, ancak bunlar sürüm kontrollü. Özellik dolu ve ÜCRETSİZ.

Hem acemi hem de ileri düzey kullanıcılar için Uzmanlara Hazır ve Özelliklerle dolu:

Giden ve gelen değişiklik kümelerini gözden geçirin. Dallar arasında kiraz toplama. Yama kullanımı, yeniden yapılandırma, saklama / raf ve çok daha fazlası.

İndir | İnternet sitesi



2
Bazı iyi yanıtlarınız var (özellikle gitcasts ve push / pull cevabı), ancak ayrı bir cevaplara bölmenizi tavsiye edebilir miyim? Question'er, "bir grup bilgiyi tek bir cevaba sıkıştırmaya çalışmamanızı" istedi!
dbr

3
Belki Windows gitters için, TortoiseGit code.google.com/p/tortoisegit listenize eklemelisiniz ...
kret

1
Gity ( macendeavor.com/gity ) bir seçenektir, ancak hala geliştirilmektedir (OS X)
Dave DeLong

2
Tower ("Mac için en güçlü Git istemcisi") Git için yeni ve güzel bir istemcidir.
rubiii

59

Diğer kaynaklara "basitçe" bağlantı vermememizi istemiş olmanıza rağmen, gerçekten iyi olan bir topluluk (ve büyüyen) kaynağı zaten mevcut olduğunda oldukça aptalca: Git Topluluk Kitabı . Cidden, bir sorudaki bu 20+ soru özlü ve tutarlı bir şey olacak. Git Topluluk Kitabı hem HTML hem de PDF olarak mevcuttur ve sorularınızın çoğunu açık, iyi biçimlendirilmiş ve hakemli değerlendirmelerle ve doğrudan sorununuza atlamanıza izin veren bir biçimde yanıtlar.

Ne yazık ki, gönderim seni gerçekten üzerse o zaman silerim. Sadece öyle söyle.


2
Git'i bir DVCS olduğu için kullanmıyorsanız, neden git'i kullanmaya zahmet ediyorsunuz? Bu soru aptalca ve şüpheli bir hedefe ulaşmak için başka şeylere harcanabilecek kaynakları yönlendiriyor.
Randal Schwartz

56

Dosyaları yoksaymak için nasıl yapılandırılır:

Git'in izlemesini istemediğiniz dosyaları yoksayma yeteneği çok kullanışlıdır.

Bir dosyayı veya dosya kümesini yok saymak için bir desen sağlarsınız. Git için model sözdizimi oldukça basit, ancak güçlü. Aşağıda bahsettiğim farklı dosyaların üçüne de uygulanabilir.

  • Boş bir satır hiçbir dosyayı yok sayar, genellikle ayırıcı olarak kullanılır.
  • # İle bakan satırlar yorum olarak kullanılır.
  • ! öneki isteğe bağlıdır ve kalıbı reddeder. Eşleşen herhangi bir reddedilen desen, düşük öncelikli desenleri geçersiz kılar.
  • Gelişmiş ifadeleri ve joker kartları destekler
    • Örn: kalıp: *. [Oa] , havuzdaki .o veya .a ile biten tüm dosyaları (nesne ve arşiv dosyaları) yok sayar.
  • Bir desende eğik çizgi ile biten bir dizin varsa, yalnızca bu dizin ve altındaki yollarla eşleşir. Bu, normal dosyaları ve maçtaki sembolik bağlantıları hariç tutar.
  • Başında eğik çizgi, bu yol adındaki tüm dosyalarla eşleşir.
    • Ör: desen /*.c dosya maç olacak foo.c ama / awesome.c bar

Gitignore (5) kılavuz sayfasından harika bir örnek :

$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
#       Documentation/gitignore.html
#       file.o
#       lib.a
#       src/internal.o
[...]
$ cat .git/info/exclude
  # ignore objects and archives, anywhere in the tree.
  *.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
[...]

Genellikle izlenmeyen dosyaları yok saymanın üç farklı yolu vardır.

1) Deponun tüm kullanıcıları için yoksay:

Çalışma kopyanızın kök dizinine .gitignore adlı bir dosya ekleyin .

Düzenleme .gitignore dosya / göz ardı edilmemelidir gereken tercihlerinizi eşleşecek.

git add .gitignore 

ve işiniz bittiğinde taahhüt edin.

2) Deponun yalnızca kopyasını dikkate almayın:

Tercih ettiğiniz desenlerle $ GIT_DIR / info / exclude dosyasını çalışma kopyanıza ekleyin / düzenleyin .

Örn: Çalışma kopyam ~ / src / project1 olduğundan ~ / src / project1 / .git / info / exclude

Sen bittin!

3) Sisteminizde tüm durumlarda yoksay:

Sisteminiz için genel yoksay kalıpları, istediğiniz herhangi bir dosyaya girebilir.

Benimkine şahsen ~ / .gitglobalignore denir

Daha sonra ~ / .gitconfig dosyamı aşağıdaki satırla düzenleyerek git'e bu dosyayı bildirebilirim :

core.excludesfile = ~/.gitglobalignore

Sen bittin!

Ben bulmak gitignore fazla bilgi için en iyi kaynak olduğu adam sayfasını.


Birisi, lütfen bu gönderiye küçük ama önemli bir ayrıntı ekleyebilir mi? Bu sadece git tarafından izlenmeyen dosyalar için geçerlidir. Dosyayı 'kaldırmak' ancak dosya sisteminde bırakmak için 'git rm --cached dosyaadı' gerekir. Teşekkürler!
Nikita Rybak

Sadece core.excludesfile satırını eklemenin benim için işe yaramadığını belirtmek isterim. Çalışması için [git config --global core.excludesfile ~ / .gitglobalignore] gerekiyordu.
Kodlama Bölgesi

Şimdi Github'da gitignore adı verilen ve çeşitli diller ve geliştirme ortamları için gitignore dosyaları olan bir proje var: github.com/github/gitignore
Ryan Lundy

47

Belirli bir düzeltme grubunu nasıl 'etiketlersiniz'

Belirli bir dosya grubu için belirli bir düzeltme grubunu nasıl 'işaretler' '' etiketler ''?

git tagKomutu kullanma .

Geçerli düzeltmeyi "etiketlemek" için, yalnızca şunu çalıştırırsınız:

git tag -a thetagname
git tag -a 0.1
git tag -a 2.6.1-rc1 -m 'Released on 01/02/03'

Geçerli etiketleri listelemek için git tagargüman olmadan veya -l(küçük harf L) çalıştırmanız yeterlidir :

$ git tag -a thetagname # and enter a message, or use -m 'My tag annotation'
$ git tag -l
thetagname

Bir etiketi silmek için -dbayrağı kullanırsınız :

$ git tag -d thetagname 
Deleted tag 'thetagname'
$ git tag
[no output]

Belirli (önceki) bir taahhüdü etiketlemek için yapmanız yeterlidir ..

git tag [tag name] [revision SHA1 hash]

Örneğin:

git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b

Not: git varsayılan olarak "hafif" bir etiket oluşturur (temel olarak belirli bir düzeltmeye referanstır). "Doğru" yol -abayrak kullanmaktır . Bu, bir etiket mesajı istemek için editörünüzü başlatacaktır (bir taahhüt mesajı istemekle aynıdır -m, etiket satırını komut satırında sağlamak için de kullanabilirsiniz ). Açıklamalı bir etiket kullanmak, kendi kimliğine, tarihine, etiketleyicisine (yazarına) ve isteğe bağlı olarak bir GPG imzasına ( -setiketi kullanarak) sahip bir nesne oluşturur . Bununla ilgili daha fazla bilgi için bu gönderiye bakın

git tag mytagwithmsg -a -m 'This is a tag, with message'

Ek açıklama içeren etiketleri listelemek için -n1her bir etiket mesajının 1 satırını göstermek için bayrağı kullanın -n245(her ek açıklamanın ilk 245 satırını göstermek için, vb.):

$ git tag -l -n1
mytagwithmsg    This is a tag, with message

Daha fazla bilgi için git-tag (1) Kılavuz Sayfasına bakınız.


git etiketi yok , varsayılan olarak sadece hafif referansları etiketleri oluşturun. Bir etiket nesnesi oluşturmak için -a veya -s parametresini kullanmalısınız (açıklamak gibi şeyler kullanacaktır): rockstarprogrammer.org/post/2008/oct/16/…
Dustin

Ah, ilginç. Teşekkürler, bunu yansıtmak için cevabı güncelledim
dbr

Önceden yapılmış bir düzeltmeyi nasıl etiketlersiniz? (üzgünüm çok uzun, bu yüzden gözden
kaçtım, bir

hasen j: Cevaplamak için bilgi eklendi, temeldegit tag tagname revision_SHA1
dbr

1
Etiketleri uzak repoya göndermek için git push (github yardım alanından bilgi) kullanırken --tags ekleyin.
Héctor Ramos

46

GIT ile iş akışı örneği.

Git son derece esnektir ve herhangi bir iş akışına iyi uyum sağlar, ancak belirli bir iş akışını zorlamamak, git ile doğrusal "yedek" iş akışının ötesinde neler yapabileceğinizi ve dallamanın ne kadar yararlı olabileceğini anlamayı zorlaştırabilir. .

Bu blog gönderisi git'i kullanarak kurulumu gerçekten kolay olan çok basit ama etkili bir iş akışını açıklıyor.

blog gönderisinden alıntı: Orijin / master'ın HEAD kaynak kodunun her zaman üretime hazır bir durumu yansıttığı ana şube olduğunu düşünüyoruz:

İş akışı, bu iş akışını uygulayan bir proje yapacak kadar popüler hale geldi: git-flow

Tüm değişikliklerinizi geliştirdiğiniz basit bir iş akışının güzel bir çizimi ve sadece kod bir üretim durumundayken master'a basmanız:

basit iş akışı

Şimdi yeni bir özellik üzerinde veya bir modülü yeniden düzenleme üzerinde çalışmak istediğinizi varsayalım. Yeni bir dal, "özellik" dalı dediğimiz şey, biraz zaman alacak ve bazı kodları kırabilecek bir şey oluşturabilirsiniz. Özelliğiniz "yeterince kararlı" olduğunda ve onu üretime "daha yakın" taşımak istediğinizde, özellik dalınızı geliştirmeye birleştirirsiniz. Birleştirme işleminden sonra tüm hatalar sıralandığında ve kodunuz tüm testleri geçtikten sonra, değişikliklerinizi master'a aktarırsınız.

Tüm bu işlem sırasında, hemen düzeltilmesi gereken korkunç bir güvenlik hatası bulursunuz. Düzeltme adında, normal "geliştirme" dalından daha hızlı geri döndürülen değişiklikler yapan bir dalınız olabilir.

Burada bu özellik / düzeltme / geliştirme / üretim iş akışının nasıl görünebileceğine dair bir resminiz var (blog yazısında iyi açıklandı ve tekrar ediyorum, blog yazısı tüm süreci benden daha ayrıntılı ve çok daha iyi açıklıyor .

Git iş akışı örneği


Ben bir git acemi ve bu diyagram benim için daha kafa karıştırıcı yapar .
finnw

Hangisi, ilki veya sonuncusu? Gönderiyi çok uzun yapmak istemedim, ancak daha sonra her iki diyagramın da küçük bir açıklamasını ekleyeceğim.
ashwoods

Makalenin tamamını okuyun. Bu diyagramdan da kafam karıştı, ama blog yazısı çok iyi yazılmış nvie.com/posts/a-successful-git-branching-model
Felipe Sabino

şimdi daha iyi? i sadece kaba bir genel bakış qive istedim, burada tüm blog yazısı repost değil :)
Ashwoods

39

PJ Hyett'in gönderisinin bir kopyası, artık mevcut değil:

Git Zor Değil

23 Kasım 2008

İnsanlara Git'i Subversion üzerinden neden kullanmaları gerektiğini söylediğimizde, "Git Subversion'u Subversion'dan daha iyi yapıyor, ancak bundan çok daha fazlasını yapıyor."

“Çok daha fazlası” Git'i gerçekten parlatan bir sürü şeyden oluşuyor, ancak Subversion gibi diğer SCM'lerden gelenler için oldukça zor olabilir.

Bununla birlikte, geçişi yaparken Subversion'u kullandığınız gibi Git'i kullanmanıza engel olacak hiçbir şey yoktur.

Gerekli yazılımı yüklediğinizi ve bir yerde uzak bir depoya sahip olduğunuzu varsayarsak, kodu nasıl alırsınız ve Subversion ile değişikliklerinizi geri itersiniz:

$ svn checkout svn://foo.googlecode.com/svn/trunk foo
# make your changes
$ svn commit -m "my first commit"

Git'te bunu nasıl yaparsınız:

$ git clone git@github.com:pjhyett/foo.git
# make your changes
$ git commit -a -m "my first commit"
$ git push

Git'te bunu gerçekleştirmek için bir komut daha. Bu ekstra komutun büyük sonuçları var, ancak bu yazının amaçları için, tek konuştuğumuz bu, bir ekstra komut.

Bak, o kadar da zor değil.

Güncelleme: Ben de Git olduğu için Subversion yerel kopyasını güncelleme eşdeğer karşılaştırıldığında söz değil gafil duyarım svn updateve git pullsırasıyla. Her iki durumda da sadece bir komut.


İlk örnekte göreceli bir yola göz attığınızı görüyorum, ./fooancak get klonu için belirtilen yol yok, nereye bakıyorsunuz?
JD Isaacks

33

Git nasıl kurulur

Windows'ta:

yükleme msysgit

Birkaç indirme var:

  • Git: Aşağıdaki seçeneklerden birine özellikle ihtiyacınız yoksa bunu kullanın.
  • PortableGit: Git'i o bilgisayara yüklemeden PC'de çalıştırmak istiyorsanız bunu kullanın (örn. Git'i bir USB sürücüsünden çalıştırmak)
  • msysGit: Git'in kendisini geliştirmek istiyorsanız bunu kullanın. Sadece için Git kullanmak istiyorsanız sizin kaynak kodu, ancak düzenleme istemiyorum seyahatseverlerin Git adlı kaynak kodu, bunu gerekmez.

Bu ayrıca bir Cygwin bash kabuğu da yükler, böylece gitdaha güzel bir kabukta (cmd.exe'den) kullanabilirsiniz ve ayrıca git-gui ( git guikomut veya Start > All Programs > Gitmenü yoluyla erişilebilir ) içerir

Mac OS X

Git-osx-yükleyiciyi kullanın , ya da kaynaktan da yükleyebilirsiniz

Bir paket yöneticisi aracılığıyla

gitYerel paket yöneticinizi kullanarak yükleyin . Örneğin, Debian'da (veya Ubuntu'da):

apt-get install git-core

Veya Mac OS X ile MacPorts üzerinden :

sudo port install git-core+bash_completion+doc

… Veya fink:

fink install git

… Veya Homebrew :

brew install git

Fedora gibi Red Hat tabanlı dağıtımlarda:

yum install git

Cygwin'de Git paketi "devel" bölümünde bulunabilir

Kaynaktan (Mac OS X / Linux / BSD / vb.)

Mac OS X'te, Geliştirici Araçları yüklüyse Git'i kaynaktan kolayca derleyebilirsiniz. Bir şekilde Git en son sürümünü indirin .tar.bzveya .tar.gzgelen http://git-scm.com/ ve bunu ayıklamak (Bulucu çift tıklama)

Linux / BSD / vb. aynı olmalı. Örneğin, Debian'da (ve Ubuntu'da) build-essentialpaketi üzerinden yüklemeniz gerekir apt.

Sonra bir Terminal, cdnereye dosyaları ayıklamak için (Çalışıyor cd ~/Downloads/git*/çalışması gerekir) ve sonra çalıştırın ..

./configure && make && sudo make install

Bu Git'i varsayılan yere yükleyecektir ( /usr/local- öyle gitolacak /usr/local/bin/git)

Parolanızı girmenizi isteyecektir (for sudo), bu /usr/local/dizine yazabilmesi için sadece "root" kullanıcısı tarafından erişilebilmesi için sudo gereklidir!

Ayrı bir yere kurmak için (Git'in dosyaları diğer araçlarla karıştırılmamışsa), --prefixconfigure komutuyla kullanın:

./configure --prefix=/usr/local/gitpath
make
sudo make install

Bu, gitikiliyi içine yükleyecektir /usr/local/bin/gitpath/bin/git- bu nedenle, her zaman, şunu eklemek zorunda kalmazsınız, içine $PATHaşağıdaki satırı ekleyerek şunu ekleyin ~/.profile:

export PATH="${PATH}:/usr/local/bin/gitpath/bin/"

Sudo erişiminiz yoksa, --prefix=/Users/myusername/binana dizininizi kullanabilir ve yükleyebilirsiniz. Eklemeyi unutmayın ~/bin/için$PATH

X-git-update-to-latest- script betiği aşağıdakilerin çoğunu otomatikleştirir:

Bu komut dosyası, git repo'sunun yerel klonunu güncelleştirir (localy at ~/work/track/git) ve sonra symlink'i yapılandırır, yükler (at /usr/local/git- git describe) ve güncelleştirir /usr/local/git.

Bu şekilde, ben olabilir /usr/local/git/binbenim, PATHve ben her zaman en son sürümünü kullanıyorum.

Bu komut dosyasının en son sürümü kılavuz sayfalarını da yükler. Dizini MANPATHeklemek için ayarlarınızı yapmanız gerekir /usr/local/git/share/man.


5
Fedora: yum install git. GUI çalıştırması için yum install git-gui.
Cristian Ciupitu

2
Mac'te,sudo port install git-core+bash_completion+doc
Singletoned

Mac için fink'i indirdim, ancak fink install git'i çalıştırmak bana hata veriyor: "Başarısız: 'git' belirtimi için paket bulunamadı!"
quano

@quano Orada olmalı, pdb.finkproject.org/pdb/package.php/git - check Fink düzgün bir şekilde güncellendi - Bence koşmaya fink self-updateyardım etmeli
dbr

32

Git Sıfırla

Çektiğinizi söyleyin, kodunuzla birleştirin ve beğenmediğinize karar verin. Git-log veya tig kullanın ve geri dönmek istediğiniz her yerde karma değerini bulun (muhtemelen çekme / birleştirme işleminden önceki son işleminiz) karma değerini kopyalayın ve şunları yapın:

# Revert to a previous commit by hash:
git-reset --hard <hash>

Karma yerine , önceki tamamlama için kısayol olarak HEAD ^ kullanabilirsiniz .

# Revert to previous commit:
git-reset --hard HEAD^

4
Bu, diğer birçok merkezi sürüm kontrol sisteminde geri dönüşün analogudur.
Jeremy Wall

"$ git-reset --hard HEAD ^" başın ebeveyni için kısayol olmalıdır (yani son işlemden önceki durum).
Ben Sayfa

6
sadece düz bir eski git resettesadüfi kazara gerekirgit add
slf

31

Paylaşılan bir ekip havuzunu nasıl kurarsınız?

Nasıl bir kurmak Normal açıklanan depo burada - ama nasıl herkes den ve çekin ve itme edebileceği bir takım depo kurarım?

Paylaşılan bir NFS dosya sistemi kullanma

Ekibinizin zaten kullanılabilecek paylaşılan bir grup üyeliğine sahip olduğu varsayılarak.

mkdir /your/share/folder/project.git
cd /your/share/folder/project.git
newgrp yourteamgroup # if necessary
git init --bare --shared

Bu havuzu kullanmaya başlamak için en kolay şey, kullanmakta olduğunuz yerel bir havuzdan başlamaktır:

cd your/local/workspace/project
git remote add origin /your/share/folder/project.git
git push origin master

Diğerleri şimdi bunu klonlayabilir ve çalışmaya başlayabilir:

cd your/local/workspace
git clone /your/share/folder/project.git

SSH Kullanımı

Hedef sunucuda bir kullanıcı hesabı oluşturun. Parolasız bir hesap, parolasız bir hesap kullanıp kullanmadığınız authorized_keys, gerekli güvenlik düzeyinize bağlıdır. Daha fazla bilgi için Git'i SSH üzerinden yapılandırma konusuna bakın .

Tüm geliştiriciler bu paylaşılan depoya erişmek için aynı hesabı kullanıyorsa, --sharedseçeneği yukarıdaki gibi kullanmanıza gerek yoktur .

Havuzu yukarıdaki ile aynı şekilde başlattıktan sonra, ilk push'u şu şekilde yaparsınız:

cd your/local/workspace/project
git remote add origin user@server:/path/to/project.git
git push origin master

Yukarıdakilerle benzerliği görüyor musunuz? Buna ek olarak olabilecek tek şey, SSH'nin hesabın bir şifresi olup olmadığını öğrenmek istemesidir. Bu istemi şifresiz bir hesapta alırsanız, SSH sunucusu muhtemelen devre dışı bırakılmıştır PermitEmptyPasswords.

Klonlama şimdi şöyle görünüyor:

cd your/local/workspace
git clone user@server:/path/to/project.git

NFS yanında - git sunucusunu ssh üzerinde çalışacak şekilde nasıl ayarlarsınız? - Github.com'un küçük ölçekli bir örneği gibi mi?
Dafydd Rees

İlgili dizinlerde bir grup yapışkan biti ayarlanması gerekli mi, yoksa git bunlarla ilgileniyor mu? İkincisi, git Unix dosyalarının izinlerinde hangi grubu kullanacağını nasıl bilebilir?
Norman Ramsey

SSH hakkında istendiği gibi bir bölüm ekledim. Tüm geliştiriciler birincil grup olarak paylaşılan gruba sahip değilse yapışkan bit gereklidir. Kullanıcılardan herhangi birinin farklı bir birincil grubu varsa, varsayılan olarak bu grup sahipliğine sahip dosyalar oluştururlar. Bu git'in altında olur ve her zaman git'in kontrolü altında değildir.
Asgeir S. Nilsen

hangi git repo-config core.sharedRepository grubu ne işe yarar?
systempuntoout

28

git statussenin arkadaşın, sık kullan. Aşağıdaki gibi soruları cevaplamak için iyi:

  • Bu komut ne yaptı?
  • Hangi şubedeyim?
  • Hangi değişiklikleri yapmak üzereyim ve bir şey unuttum?
  • Bu projede son kez çalıştığım bir şeyin ortasında mıydım (günler, haftalar veya belki aylar önce)?

Diyelim ki svn status, git statusbüyük projelerde bile anında çalışıyor. Git'i sık sık kullanmayı öğrenirken, neler olduğuna dair zihinsel modelimin doğru olduğundan emin olmak için genellikle güven verici buldum. Şimdi çoğunlukla sadece son taahhüdümden beri neyi değiştirdiğimi hatırlatmak için kullanıyorum.

Açıkçası, .gitignore'unuz sağlıklı bir şekilde yapılandırılmışsa çok daha yararlıdır.


27

Değişiklikleri Yap

Bir dosyayı düzenledikten sonra, değişikliklerinizi git olarak yapmanız gerekir. Bu komutu yürüttüğünüzde, herkese neyi değiştirdiğinizi anlatan basit bir metin olan bir taahhüt mesajı istenir.

$ git commit source/main.c

Main.c dosyasını ./source/ dizininde yürütür

$ git commit -a # the -a flag pulls in all modified files

değiştirilen tüm dosyaları işler (ancak yeni dosyalar değil, git-add ile dizine eklenmesi gerekir). Yalnızca belirli dosyaları yürütmek istiyorsanız, önce git-add ile aşamalandırmanız ve sonra -a bayrağı olmadan işlem yapmanız gerekir.

Taahhüt işlemi, uzak depoları değil, yalnızca yerel deponuzu değiştirir. Taahhütleri uzak depoya göndermek istiyorsanız, bir push yapmanız gerekir.

$ git push <remote> <branch> # push new commits to the <branch> on the <remote> repository

CVS veya SVN'den gelen birisi için bu bir değişikliktir çünkü merkezi depoya bağlılık şimdi iki adım gerektirir.


27

Nasıl dallanır?

Git deposundaki varsayılan dal çağrılır master.

Yeni bir şube kullanımı oluşturmak için

git branch <branch-name>

Geçerli havuz türündeki tüm dalların listesini görmek için

git branch

Başka bir şubeye geçmek isterseniz,

git checkout <branch-name>

Yeni bir dal oluşturmak ve bir adımda ona geçmek için

git checkout -b <branch-name>

Bir dalı silmek için şunu kullanın:

git branch -d <branch-name>

Geçerli daldaki değişikliklerle dal oluşturmak için,

git stash
git stash branch <branch-name>

11
bir dal oluşturan ve bir adımda geçiş yapan git check -b <branch-name> kısayolundan bahsetmelisiniz. Muhtemelen bir acemi ve hatta ileri git kullanıcısı için en yaygın kullanım durumudur.
Jeremy Wall

21

En Son Kodu Alma

$ git pull <remote> <branch> # fetches the code and merges it into 
                             # your working directory
$ git fetch <remote> <branch> # fetches the code but does not merge
                              # it into your working directory

$ git pull --tag <remote> <branch> # same as above but fetch tags as well
$ git fetch --tag <remote> <branch> # you get the idea

Bu, uzak depodan kodun en son kopyasını almak için her durumu kapsar.



18

Git Magic ihtiyacınız olan her şey. Garantili ya da paranız geri!


14
Ah, paramı geri istiyorum. Tamamlanmamış bir öğretici (GitMagic) ile = Buggy yazılımı (msysGit) == saat çalışma, neredeyse ücretsiz
SamGoody

16

Şubeleri nasıl birleştirirsiniz?

Bir dalı birleştirmek istiyorsanız (ör master. - release), mevcut dalınızın birleştirmek istediğiniz hedef dal olduğundan emin olun ( mevcut dalınızı görmek için git branchveya git statuskullanın).

Sonra kullan

git merge master

( mastergeçerli dalla birleştirmek istediğiniz dalın adı nerede ).

Herhangi bir çakışma varsa,

git diff

çözmeniz gereken bekleyen çakışmaları görmek için.


2
Favori aracınızla (gvimdiff, kdiff3 veya daha fazlası) üç yönlü fark yaratan git mergetool var
Dave Vogt



12

Uzak şubeleri izleme

Yerel deponuzu klonladığınız bir uzak havuz olduğunu varsayarsak ve bu uzak depoda 'some_branch' adında bir şube olduğunu varsayarsak, yerel olarak nasıl izleyeceğiniz aşağıda açıklanmıştır:

# list remote branches
git branch -r

# start tracking one remote branch
git branch --track some_branch origin/some_branch

# change to the branch locally
git checkout some_branch

# make changes and commit them locally
....

# push your changes to the remote repository:
git push

Git 1.7'de uzak şubeler, yerel bir şube oluşturduğunuzda otomatik olarak takip ediliyor gibi görünüyor. Bu davranışın hangi sürümde başladığını bilmiyorum.
Doppelganger

Aslında, kullanarak tüm uzak dalları listeleyebilirsinizgit remote show REMOTENAME
Felipe Sabino


10

Bir dosyanın iki düzeltmesini veya geçerli dosyanızı ve önceki bir düzeltmeyi nasıl karşılaştırıyorsunuz?

Karşılaştır komutu git diff.

Bir dosyanın 2 düzeltmesini karşılaştırmak için:

$ git diff <commit1> <commit2> <file_name>

Bu, command1'e command2'ye karşı farklılık gösterir; siparişi değiştirirseniz, dosyalar beklediğiniz şekilde olmayabilir, bu da beklediğiniz gibi olmayabilir ...

Geçerli aşamalı dosyayı depoyla karşılaştırmak için:

$ git diff --staged <file_name>

Geçerli etiketsiz dosyayı depoyla karşılaştırmak için:

$ git diff <file_name>

9

Neden bir tane daha? Net, başlamak için mükemmel git kılavuzu gibi gerçekten iyi olanlar vardır . Birinin katkıda bulunabileceği (git hub'da barındırılan) git kitabı dahil olmak üzere iyi bağlantıları vardır ve bu kolektif görev için mükemmeldir.

Stackoverflow'da, gerçekten en sevdiğiniz hileleri görmeyi tercih ederim!

Sadece son zamanlarda keşfettiğim benimki buradagit stash açıklanıyor , bu da mevcut işinizi kaydetmenizi ve başka bir şubeye gitmenizi sağlıyor

EDIT: önceki yazı gibi, gerçekten wiki olarak yazı ile stackoverlow biçimini tercih ederseniz ben bu yanıtı silecek


Hayır, silmeyin. Cevabınız tamamen geçerli - ve başkalarını iyi kaynaklara yönlendirmek kötü bir şey değil. Ben de burada listelenen en yaygın işlemleri istiyorum, ama biraz iş ve başkalarının bunu yapmasını beklemiyorum . Öğrenirken bunu zamanla yapacağım ve bu benim için bir referans olacak.
Adam Davis

9

Konsol kullanıcı arayüzü - Tig

Kurulum:

apt-get install tig

kullanım

Git deposu içindeyken, 'tig' yazın, etkileşimli bir günlüğü görüntülemek için herhangi bir günlüğün 'enter' tuşuna basın. h , temel işlevleri listeleyen yardım için.

önemsiz şeyler

"Tig" geriye "Git" dir.


"Konsol" ve "grafik" biraz çelişkili olduğundan, bir "Konsol UI" olmamalı mı?
dbr

git-log'dan çok daha grafiksel ... ancak, çok daha arayüzlü ...
Dean Rather

8

Uzak bir depoda nasıl dal oluşturabilirim?

Uzak deponuzu tek bir uzak depodan klonladığınızı varsayarsak.

# create a new branch locally
git branch name_of_branch
git checkout name_of_branch
# edit/add/remove files    
# ... 
# Commit your changes locally
git add fileName
git commit -m Message
# push changes and new branch to remote repository:
git push origin name_of_branch:name_of_branch

11
neden name_of_branch: name_of_branch?
Mart'ta Osewa Seun

Evet neden? Bildiğim kadarıyla sadece ihtiyacın var git push origin name_of_branchve şube zaten uzaktan kumandada oluşturulacak
Felipe Sabino

birincisi name_of_branchyerel ad, ikincisi (istenen) uzak dal adıdır, bu nedenle local_name_of_branch:remote_name_of_branchadların farklı olmasını istiyorsanız olabilir . Onları aynı istiyorsanız, yine de böyle belirtmeniz gerekir b / c git, siz söylemedikçe adın aynı olmasını istediğiniz varsayımını yapmaz (bunu yapmak için başka yöntemler de vardır, ancak)
johnny

8

Resmi Git eğitimine başladım . Yeni başlayanlar için yeterince pratik olduğunu düşünüyorum (tanımınıza göre henüz yeni başlayan biriydim!


8

Uzak bir depodaki bir dalı nasıl silebilirim?

:Şube adından önce uzaktan kumandayı kullanarak bir push yapın

git push origin :mybranchname

olmanın originda uzak ismi ve mybranchnamesilinmek üzere şube adı

http://help.github.com/remotes/


7

İtme ve çekme değişiklikleri

Basitleştirilmiş bir şekilde, sadece git pushve yapın git pull. Değişiklikler birleştirilir ve bir çakışma varsa git size bildirir ve bunu manuel olarak çözebilirsiniz.

Uzak bir depoya ilk kez bastığınızda bir git push origin master(ana dal olan ana) yapmanız gerekir . O andan itibaren sadece git push.

Etiketleri ile itin git push --tags.


7

Check-Out Kodu

Önce boş bir dizine gidin, depo yapmak için "git init" komutunu kullanın, sonra uzak depoyu kendinize kopyalayın.

git clone user@host.com:/dir/to/repo

Başlangıçta klonladığınız her yerde "git pull" varsayılan olarak alınır.


7
Bence klon ilk önce init çalıştırma ihtiyacını ortadan kaldırmak için init adımını yapar. git init gerçekten de ilk havuzu oluşturmak veya standart bir klondan farklı olarak kurmak istediğiniz birden fazla uzaktan kumandalı özel yapılandırmalar içindir.
Jeremy Wall

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.