17 KiB
category | tool | contributors | filename | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
tool | git |
|
LearnGit.txt |
Git dağınık versiyon kontrol ve kaynak kod yönetim sistemidir.
Bunu projenin bir seri anlık durumunu kaydederek yapar ve bu anlık durumları kullanarak versiyon ve kaynak kodu yönetmeni sağlar.
Versiyonlama Konseptleri
Versiyon kontrol nedir?
Versiyon kontrol, zaman içerisinde dosya(lar)daki değişikliği kaydeden sistemdir.
Merkezi Versiyonlama vs. Dağınık Versiyonlama
- Merkezi versiyon kontrolü dosyaların eşitlenmesine, takibine ve yedeklenmesine odaklanır.
- Dağınık versiyon kontrolü değişimin paylaşılmasına odaklanır. Her değişiminin benzersiz bir adı vardır.
- Dağınık sistemlerin belirlenmiş bir yapısı yoktur. Git ile kolayca SVN'deki gibi merkezi bir sistem elde edebilirsin.
Neden Git?
- Çevrimdışı çalışabilir
- Diğerleriyle beraber çalışmak kolaydır!
- Dallanma kolaydır!
- Dallanma hızlıdır!
- Git hızlıdır
- Git esnektir
Git Mimarisi
Repository
Bir grup dosya, dizin, geriye dönük kayıt, commit, head. Bunları kaynak kodun veri yapısı gibi düşünebilirsin, herbir kaynak kod "elemanı" seni kendi revizyon geçmişine eriştirir.
Bir git repo'su .git dizini ve çalışma ağacından oluşur.
.git Dizini (repository bileşeni)
.git dizini bütün konfigrasyon, log, dallanma, HEAD ve daha fazlasını tutar. detaylı liste
Çalışma Ağacı (repository bileşeni)
Temelde repo'daki dizinlerin ve dosyalarındır. Sıkça çalışma ağacın olarak anılır.
Index (.git dizininin birleşeni)
Index git'in evreleme alanıdır (staging area). Temelde çalışma ağacını Git repo'sundan ayıran bir katmandır. Bu geliştiricilere neyin Git repo'suna gönderileceği hakkında daha fazla güç verir.
Commit
Bir git commit'i Çalışma Ağacındaki bir takım değişiklerdir. Mesela 5 tane dosya eklemişsindir ve diğer 2 tanesini silmişindir, bu değişikler commit'te (anlık kayıtta) tutulacaktır. Bu commit daha sonra diğer repo'lara bastırılabilir (pushed) ve bastırılmaz!
Branch
Bir branch esasen yaptığın son commit'e göstericidir(pointer). Commit'lemeye devam ettiğinde, bu gösterici otomatik olarak son commit'e güncellenir.
Tag
Bir tag, tarihteki belirli bir noktanın işaretidir. İnsanlar bunu genelde sürüm notları için kullanır (v1.0 vs.)
HEAD ve head (.git dizininin birleşenleri)
HEAD mevcut branch'a bir göstericidir. Bir repository yalnızca 1 aktif HEAD'e sahiptir. head, commit'e bir göstericidir. Bir repository herhangi bir sayıda head'e sahip olabilir.
Git'in Stage'leri
- Modified - Dosyada değişikler yapıldı ama henüz Git Veritabanına commit yapılmadı.
- Staged - Modified edilmiş bir dosyayı, sonraki commit'e gitmek üzere işaretler.
- Committed - Dosyalar Git Veritabanına commit'lendi.
Kavramsal Kaynaklar
Komutlar
init
Boş bir Git repository'si oluştur. Git repository'sinin ayarları, depolanmış bilgileri ve daha fazlası ".git" adlı dizinde (bir klasör) tutulur.
$ git init
config
Ayarları yapılandırmak için. Repository, sistemin kendisi veya global yapılandırmalar
için olarabilir. (global yapılandırma dosyası ~/.gitconfig
).
# Print & Set Some Basic Config Variables (Global)
$ git config --global user.email "MyEmail@Zoho.com"
$ git config --global user.name "My Name"
git config hakkında daha fazla bilgi için.
help
Her bir komutun detaylı kılavuzuna hızlı bir erişim için. Ya da sadece bazı şeylerin anlamı için hızlı bir hatırlatıcı için.
# Quickly check available commands
$ git help
# Check all available commands
$ git help -a
# Command specific help - user manual
# git help <command_here>
$ git help add
$ git help commit
$ git help init
# or git <command_here> --help
$ git add --help
$ git commit --help
$ git init --help
dosyaları ignore etme
git'in bazı dosya(ları) ve klasör(leri) kasıtlı olarak takip etmemesi için. Genel olarak,repository'de ne de olsa paylaşılacak, private ve temp dosyaları için.
$ echo "temp/" >> .gitignore
$ echo "private_key" >> .gitignore
status
index dosyası(temelde çalıştığın repo) ve mevcut HEAD commit arasındaki farkı göstermek için.
# Will display the branch, untracked files, changes and other differences
$ git status
# To learn other "tid bits" about git status
$ git help status
add
Dosyaları staging area'ya eklemek için. Eğer yeni dosyaları staging area'ya git add
yapmazsanız, commit'lere eklenmez!
# add a file in your current working directory
$ git add HelloWorld.java
# add a file in a nested dir
$ git add /path/to/file/HelloWorld.c
# Regular Expression support!
$ git add ./*.java
# You can also add everything in your working directory to the staging area.
$ git add -A
Bu yalnızca dosyayı staging area'a/index'e ekler, çalışılan dizine/repo'ya commit etmez.
branch
Branch'ları yönetir. Bu komutu kullanarak, branch'ları görebilir, düzenleyebilir, oluşturabilir, silebilirsin.
# list existing branches & remotes
$ git branch -a
# create a new branch
$ git branch myNewBranch
# delete a branch
$ git branch -d myBranch
# rename a branch
# git branch -m <oldname> <newname>
$ git branch -m myBranchName myNewBranchName
# edit a branch's description
$ git branch myBranchName --edit-description
tag
tag'leri yönetir
# List tags
$ git tag
# Create a annotated tag
# The -m specifies a tagging message, which is stored with the tag.
# If you don’t specify a message for an annotated tag,
# Git launches your editor so you can type it in.
$ git tag -a v2.0 -m 'my version 2.0'
# Show info about tag
# That shows the tagger information, the date the commit was tagged,
# and the annotation message before showing the commit information.
$ git show v2.0
# Push a single tag to remote
$ git push origin v2.0
# Push a lot of tags to remote
$ git push origin --tags
checkout
index'in versiyonun eşlemek için çalışma ağacındaki,veya belirtilen ağactaki, tüm dosyaları günceller.
# Checkout a repo - defaults to master branch
$ git checkout
# Checkout a specified branch
$ git checkout branchName
# Create a new branch & switch to it
# equivalent to "git branch <name>; git checkout <name>"
$ git checkout -b newBranch
clone
Varolan bir repository'i yeni bir dizine clone'lar veya kopyalar. Ayrıca clone'lanmış repodaki her bir branch için, uzak branch'a bastırmana izin veren, uzak takip branch'ları ekler.
# Clone learnxinyminutes-docs
$ git clone https://github.com/adambard/learnxinyminutes-docs.git
# shallow clone - faster cloning that pulls only latest snapshot
$ git clone --depth 1 https://github.com/adambard/learnxinyminutes-docs.git
# clone only a specific branch
$ git clone -b master-cn https://github.com/adambard/learnxinyminutes-docs.git --single-branch
commit
index'in mevcut içeriğini yeni bir "commit"te saklar. Bu commit, kullanıcının oluşturduğu bir mesajı ve yapılan değişiklikleri saklar.
# commit with a message
$ git commit -m "Added multiplyNumbers() function to HelloWorld.c"
# signed commit with a message (user.signingkey must have been set
# with your GPG key e.g. git config --global user.signingkey 5173AAD5)
$ git commit -S -m "signed commit message"
# automatically stage modified or deleted files, except new files, and then commit
$ git commit -a -m "Modified foo.php and removed bar.php"
# change last commit (this deletes previous commit with a fresh commit)
$ git commit --amend -m "Correct message"
diff
Shows differences between a file in the working directory, index and commits. Bir dosyanın, çalışma ağacı, index ve commit'ler arasındaki farklarını göster.
# Show difference between your working dir and the index
$ git diff
# Show differences between the index and the most recent commit.
$ git diff --cached
# Show differences between your working dir and the most recent commit
$ git diff HEAD
grep
Bir repository'de hızlıca arama yapmana izin verir.
İsteğe Bağlı Yapılandırmalar:
# Thanks to Travis Jeffery for these
# Set line numbers to be shown in grep search results
$ git config --global grep.lineNumber true
# Make search results more readable, including grouping
$ git config --global alias.g "grep --break --heading --line-number"
# Search for "variableName" in all java files
$ git grep 'variableName' -- '*.java'
# Search for a line that contains "arrayListName" and, "add" or "remove"
$ git grep -e 'arrayListName' --and \( -e add -e remove \)
Daha fazla örnek için Git Grep Ninja
log
Repository'deki commitleri gösterir.
# Show all commits
$ git log
# Show only commit message & ref
$ git log --oneline
# Show merge commits only
$ git log --merges
# Show all commits represented by an ASCII graph
$ git log --graph
merge
Dış commit'lerdeki değişiklikleri mevcut branch'a "merge" et (birleştir).
# Merge the specified branch into the current.
$ git merge branchName
# Always generate a merge commit when merging
$ git merge --no-ff branchName
mv
Bir dosyayı yeniden taşı veya yeniden adlandır
# Renaming a file
$ git mv HelloWorld.c HelloNewWorld.c
# Moving a file
$ git mv HelloWorld.c ./new/path/HelloWorld.c
# Force rename or move
# "existingFile" already exists in the directory, will be overwritten
$ git mv -f myFile existingFile
pull
Bir repository'den çeker ve diğer branch'a merge eder.
# Update your local repo, by merging in new changes
# from the remote "origin" and "master" branch.
# git pull <remote> <branch>
$ git pull origin master
# By default, git pull will update your current branch
# by merging in new changes from its remote-tracking branch
$ git pull
# Merge in changes from remote branch and rebase
# branch commits onto your local repo, like: "git fetch <remote> <branch>, git
# rebase <remote>/<branch>"
$ git pull origin master --rebase
push
Bir branch'taki değişikleri, uzak branch'a bastır ve birleştir.
# Push and merge changes from a local repo to a
# remote named "origin" and "master" branch.
# git push <remote> <branch>
$ git push origin master
# By default, git push will push and merge changes from
# the current branch to its remote-tracking branch
$ git push
# To link up current local branch with a remote branch, add -u flag:
$ git push -u origin master
# Now, anytime you want to push from that same local branch, use shortcut:
$ git push
stash
Stash'leme çalışma dizinindeki kirli durumu alır ve bitmemiş değişiklikler yığınına kaydeder. Bu değişikleri istediğin zaman tekrar uygulayabilirsin.
Mesela git repo'nda bazı işler yaptın ama remote'dan pull yapmak istiyorsun.
Bazı dosyalarında kirli (commit'lenmemiş) değişiklikler olduğundan git pull
yapamazsın. Onun yerine önce git stash
ile değişikliklerini yığına kaydet!
(stash, sözlük anlamı: bir şeyi, özel bir yere güvenli biçimde saklamak)
$ git stash
Saved working directory and index state \
"WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")
Şimdi pull yapabilirsin!
git pull
...changes apply...
Herşeyin tamam olduğunu kontrol et
$ git status
# On branch master
nothing to commit, working directory clean
Şu ana kadar neleri stash'lediğini git stash list
kullanarak görebilirsin.
Stash'lenen şeyler Son-Giren-İlk-Çıkar şeklinde tutulduğundan en son değişim
en üste olacaktır.
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
Şimdi de kirli değişiklileri yığından çıkarıp uygulayalım.
$ git stash pop
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
#
# modified: index.html
# modified: lib/simplegit.rb
#
git stash apply
da aynı şeyi yapar
Şimdi kendi işine dönmeye hazırsın!
rebase (dikkat)
Branch'ta commit'lenen tüm değişimleri al ve onları başka bir branch'ta tekrar oynat Public repo'ya push edilmiş commit'leri rebase etme
# Rebase experimentBranch onto master
# git rebase <basebranch> <topicbranch>
$ git rebase master experimentBranch
reset (dikkat)
Reset the current HEAD to the specified state. This allows you to undo merges, pulls, commits, adds, and more. It's a great command but also dangerous if you don't know what you are doing.
HEAD'i belirtilen duruma resetle. Bu merge'leri, pull'ları, commit'leri, add'leri ve daha fazlasını geriye almanı sağlar. Muhteşem bir komuttur ama aynı zamanda, ne yaptığını bilmiyorsan, tehlikelidir.
# Reset the staging area, to match the latest commit (leaves dir unchanged)
$ git reset
# Reset the staging area, to match the latest commit, and overwrite working dir
$ git reset --hard
# Moves the current branch tip to the specified commit (leaves dir unchanged)
# all changes still exist in the directory.
$ git reset 31f2bb1
# Moves the current branch tip backward to the specified commit
# and makes the working dir match (deletes uncommitted changes and all commits
# after the specified commit).
$ git reset --hard 31f2bb1
reflog (dikkat)
Reflog, verilen zaman içinde,default olarak 90 gündür, yaptığın git komutlarını listeler.
Bu sana beklemediğin şekilde yanlış giden komutları geriye çevirme şansı verir. (mesela, eğer bir rebase uygulamanı kırdıysa)
Şu şekilde yapıbilirsin:
git reflog
rebase için tüm git komutlarını listele
38b323f HEAD@{0}: rebase -i (finish): returning to refs/heads/feature/add_git_reflog
38b323f HEAD@{1}: rebase -i (pick): Clarify inc/dec operators
4fff859 HEAD@{2}: rebase -i (pick): Update java.html.markdown
34ed963 HEAD@{3}: rebase -i (pick): [yaml/en] Add more resources (#1666)
ed8ddf2 HEAD@{4}: rebase -i (pick): pythonstatcomp spanish translation (#1748)
2e6c386 HEAD@{5}: rebase -i (start): checkout 02fb96d
- Nereye reset'leyeceğini seç, şu durumda
2e6c386
veyaHEAD@{5}
- 'git reset --hard HEAD@{5}' bu repo'nu seçilen head'e eşitler
- Rebase'e yeniden başlayabilir veya onu yalnız bırakabilirsin.
revert
Revert commit'leri geri almada kullanılır. Projenin durumunu önceki bir noktaya alan reset ile karıştırılmamalıdır. Revert, belirtilen commit'in tersine yeni bir commit ekleyecektir.
# Revert a specified commit
$ git revert <commit>
rm
git add'in tersine, git rm çalışma ağacından dosyaları kaldırır.
# remove HelloWorld.c
$ git rm HelloWorld.c
# Remove a file from a nested dir
$ git rm /pather/to/the/file/HelloWorld.c