Favori Git komutlarımı burada saklayacağım. Zaman içinde güzel bir kaynak olmasını istiyorum.
git init
Mevcut dizini git kontrolüne alır.
Git dosyalarının durduğu .git isimli bir dizin oluşturur.
git add .
Dizinde değişmiş tüm dosyaları commit edilmek üzere stage ortamına alır.
git commit -m "Commit mesajı"
Stage ortamına alınmış dosyaları, commit eder.
-m ile yapılan commit işleminin neden yapıldığı yazılır (50 karakteri geçmeyelim).
git commit --amend -m "Commit mesajı"
Son commiti yeni eklemeler ya da düzenlemeleri dahil ederek değiştirir. Böylece tarihçede iki ayrı kayıt olmaz. Son yaptığınız commiti değiştirmek için kullanabilirsiniz.
git log
Commit edilmiş tüm değişiklikleri listeler.
git clone <uzak repo adresi>
Uzak repoyu klonlar.
git init
git remote add origin master
git push -u origin master
Bu da git clone ile benzer işlevi yerine getirir.
İlk önce dizini git kontrolüne alır. Yerel bir repo oluşturur.
Sonra uzak repo bağlantısını ekler.
Sonrada uzaktaki repoya dosyaları gönderir.
-u, bundan sonra sadece git push dendiğinde otomatik olarak uzaktaki belirtilen dala gönderim yapılacağını belirtir.
Buradaki origin, reponun kısa adı; master ise dalın ismidir. Bunlar değiştirilebilir.
git pull
Uzaktaki repodan değişiklikleri çekip mevcut dosyalarla birleştirir.
git fetch ve git merge işlemlerinin tek seferde yapılmasıdır.
git stash
git stash apply
Eğer projede bazı dosyalar değişmişken uzak repodan dosyalar çekilmek ve birleştirilmek istenirse (git pull ile), dosyalar çekilir (git fetch) ama birleştirme işlemi (git merge) gerçekleşmez.
Bunun için bir yöntem, değişen dosyaları bir yerde saklamaktır. Bunun için git stash komutu kullanılır. Bu komut ile değişmiş dosyalar saklanır ve branchteki son temiz çalışan kopyaya (son commite) dönülür. Sonrasında git pull komutu ile işlem gerçekleştirilir. Eğer git pull yapıldıktan sonra birleştirme hatası alındıysa git stash yaptıktan sonra sadece git merge yapılması yeterlidir. Çünkü git pull aslında fetch ve merge işlemlerinin beraber yapılmasıdır, fetch yani dosyaların çekilmesi düzgün çalışmıştır ama merge'te sorun olmuştur. stash komutu ile temiz kopyaya dönülerek git merge yapılabilir.
git pull ile uzak repodan yeni sürüm çekilip birleştirildikten sonra biraz önce git stash ile sakladığımız değişikliklerimizi yeni sürümün üzerine koyabiliriz. Bunun için de git stash apply komutu çalıştırılır. Değişiklikler yeni sürümün üzerine uygulanır. Sorun olursa merge hatası verilir ve bunların manuel olarak düzeltilmesi gerekir.
git stash pop
Yukarıda git stash apply için anlatılanlar aynen geçerlidir. Tek fark, git stash pop yapıldığı zaman eğer stash listesindeki değişiklikler düzgün bir şekilde birleştirilirse, değişiklikler stash listesinden silinir. Bu komut asında git stash apply && git stash drop komuduyla aynı işi yapar.
git push <repo adı> <dal>
Uzak repodaki belirtilen dala yapılan değişiklikler gönderilir.
git push -u <repo> <dal> olarak -u parametresi kullanılırsa varsayılan uzak dal belirtilmiş olur ve sonraki gönderme işlemlerinde sadece git push kullanılabilir.
git remote -v
Uzak repoları ve adreslerini görme.
git branch <yeni dal ismi>
Mevcut dalın son commiti baz alınarak yeni bir dal (branch) oluşturulur.
Git'te bir dal oluşturmak çok hızlı ve güvenilir bir işlemdir.
Her yeni özellik, görülen hata ya da projede çalışan kişiler için yeni bir dal oluşturulabilir.
Dal oluşturulduktan sonra
git checkout <dal ismi>
yazılarak bu dala geçiş yapılır ve bu dalda değişiklikler yapılır. Yapılan değişikliker add ve commit işlemleri ile loglandıktan
sonra tekrar checkout işlemi ile başka bir dala geçilebilir. Bu şekilde yapılan değişiklikler kaybolmaz.
git branch
Tüm dalları listeler. Hangi dalda olduğunuzu, yanında * olan daldan anlayabilirsiniz.
git status
Hangi dalda olunduğu, değiştirilmiş veya eklenmiş dosyalar gösterilir.
git show <commit-id>
Commit id kullanılarak ilgili committe ne değiştiğini gösterir. eğer --no-patch argümanı kullanılırsa, git log gösteriminde olduğu gibi sadece commit ile ilgili detaylar gösterilir.
git tag <etiket ismi>
Mevcut commiti (HEAD), verilen isim ile etiketler.
git push origin <etiket ismi>
Etiketi, origin'e gönderir.
git push --tags
Tüm etiketleri origine gönderir. Önerilmez.
git push origin :<tag ismi>
git push --delete origin <tag ismi>
Uzak repodaki (origin) bir tagı silmek için kullanılır.
git tag <etiket ismi> <commit id>
Belirtilen commiti, verilen isim ile etiketler.
git branch -vv
Sürüm dallarının (branch) detaylı listelemesini yapar.
Hangi dalın hangi uzak repoya bağlı olduğunu gösterir.
git log --pretty=oneline
Git loglarını tek satırda olacak şekilde derli toplu gösterir.
git log --follow -p -- <dosya yolu>
Belirtilen dosyada yapılan tüm değişiklikleri detaylı olarak gösterir.
İlgili Stackoverflow sorusu
git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
Git loglarını grafiksel olarak göstermeye yarayan bir komut
Bu komudu alias olarak tanımlayıp ezberlemeye gerek yok. Aşağıdaki komut bunu yapabiliriz:
git config --add alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short"
Sonrasında git hist komudu ile grafiksel olarak logları inceleyebiliriz.
git diff HEAD~5 HEAD --name-status
git diff HEAD~5 HEAD --stat
Son 5 committe değişen dosyaları gösteren komutlar.
İlki sadece dosya isimleri ile işlemi (A: Added, M: Modified, D: Deleted R#: Renamed) gösterir.
İkincisi ise dosyalardaki işlemlerin istatistiki bilgilerini (silinme, ekleme sayıları gibi) verir.
git diff-tree --no-commit-id --name-only -r <commit-id>
Bir committe değişen dosyaları gösterir. --name-only yerine --name-status ve --stat konarak da değişen dosyalar hakkında farklı bilgiler alınabilir. yerine commite ait bir hash değeri gelebileceği gibi, HEAD (son commit) ya da son committen 3 commit öncesi için HEAD~3 kullanılabilir.
git shortlog -s -n
Katkıda bulunan kişilerin katkı sayısı, ad ve soyad bilgilerini katkıda bulunma (commit) sayılarına göre sıralı şekilde gösterir.
git shortlog -s -n --all --no-merges
Yukarıdakine ek olarak --all ve --no-merges eklenerek, tüm dallardaki (branch) katkıda bulunma sayısı hesaplanır; --no-merges parametresi ile de birleştirme işlemleri (merge commit) dikkate alınmaz.
git log <tag veya commit id>..HEAD --no-merges --pretty=format:"%h %<(15,trunc)%an %cd %<(80,trunc)%s" --date=short
Bir tag ya da commit'ten şu ana kadar yapılmış değişiklikleri, merge commitleri dikkate almadan özet olarak gösterir. Özellikle
yeni sürüm çıkarırken önceki sürümden (tag'e bakarak) bu yana yapılmış değişiklikleri raporlamak için kullanılabilir.
Şunları da buraya ekleyelim.
Gönderilmiş commitleri geri alma - SO
Silinmiş dosyayı geri getirme - SO
Eğer SSH anahtarınızı bir parolayla koruyorsanız (ki öyle de yapmalısınız), her uzak Git sunucusuyla bir işlem yapacağınız zaman bu parolayı girmeniz gerekir. Windows'ta Git Bash kullanıyorsanız ~/.bashrc dosyanıza aşağıdaki satırları eklerseniz, Git Bash'i açtığınızda bir kere SSH anahtarınıza ait parolanız girmeniz istenir ve bu terminalde yapacağınız sonraki işlemlerde bir daha parola girmenize gerek kalmaz.
eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa
Eğer her terminal açtığınızda parola girmek istemiyorsanız aşağıdaki satırı .bashrc dosyasınıza ekleyip add-ssh-key komutunu istediğiniz zaman çalıştırıp SSH anahtarınıza ait parolanızı girebilirsiniz. Önceden girdiyseniz bir daha parola girmeniz de istenmez.
alias add-ssh-key='if ! ssh-add -L 1>/dev/null; then eval `ssh-agent -s`; ssh-add ~/.ssh/*_rsa; else echo "ssh key already added"; fi;';
Aşağıda sürekli kullandığım Git komutları için hazırladığım aliaslar var. Bunları ~/.bashrc ya da ~/.zshrc (Mac) dosyasına ekleyebilirsiniz.
alias gs='git status';
alias gp='git pull';
alias gm='git merge';
alias gps='git push';
alias gc='git commit';
alias gch='git checkout';
alias ga='git add';
alias gst='git stash';
alias gd='git diff';
alias gl='git log';
alias gh='git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short';
alias gpso='git push -u origin `git branch --show-current`';
alias add-ssh-key='eval `ssh-agent -s`; ssh-add ~/.ssh/*_rsa';
alias git='LANG=en_GB git'