1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
|
---
category: tool
lang: tr-tr
tool: git
contributors:
- ["Jake Prather", "http://github.com/JakeHP"]
- ["Leo Rudberg" , "http://github.com/LOZORD"]
- ["Betsy Lorton" , "http://github.com/schbetsy"]
- ["Bruno Volcov", "http://github.com/volcov"]
- ["Andrew Taylor", "http://github.com/andrewjt71"]
- ["Jason Stathopulos", "http://github.com/SpiritBreaker226"]
- ["Milo Gilad", "http://github.com/Myl0g"]
- ["Adem Budak", "https://github.com/p1v0t"]
filename: LearnGit-tr.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.
[Daha fazla bilgi](http://git-scm.com/book/en/Getting-Started-About-Version-Control)
### 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](http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html)
### Ç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
* [Bilgisayar Bilimciler için Git](http://eagain.net/articles/git-for-computer-scientists/)
* [Tasarımcılar için Git](http://hoth.entp.com/output/git_for_designers.html)
## 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.
```bash
$ 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`).
```bash
# 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.](http://git-scm.com/docs/git-config)
### 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.
```bash
# 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.
```bash
$ 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.
```bash
# 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!
```bash
# 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.
```bash
# 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
```bash
# 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.
```bash
# 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.
```bash
# 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.
```bash
# 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.
```bash
# 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:
```bash
# 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"
```
```bash
# 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](http://travisjeffery.com/b/2012/02/search-a-git-repo-like-a-ninja)
### log
Repository'deki commitleri gösterir.
```bash
# 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).
```bash
# 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
```bash
# 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.
```bash
# 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.
```bash
# 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)
```bash
$ 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!
```bash
git pull
```
`...changes apply...`
Herşeyin tamam olduğunu kontrol et
```bash
$ 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.
```bash
$ 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.
```bash
$ 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!
[Ek Okuma.](http://git-scm.com/book/en/v1/Git-Tools-Stashing)
### 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*
```bash
# Rebase experimentBranch onto master
# git rebase <basebranch> <topicbranch>
$ git rebase master experimentBranch
```
[Ek Okuma.](http://git-scm.com/book/en/Git-Branching-Rebasing)
### 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.
```bash
# 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:
1. `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
```
2. Nereye reset'leyeceğini seç, şu durumda `2e6c386` veya `HEAD@{5}`
3. 'git reset --hard HEAD@{5}' bu repo'nu seçilen head'e eşitler
4. Rebase'e yeniden başlayabilir veya onu yalnız bırakabilirsin.
[Ek Okuma.](https://git-scm.com/docs/git-reflog)
### 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.
```bash
# Revert a specified commit
$ git revert <commit>
```
### rm
git add'in tersine, git rm çalışma ağacından dosyaları kaldırır.
```bash
# remove HelloWorld.c
$ git rm HelloWorld.c
# Remove a file from a nested dir
$ git rm /pather/to/the/file/HelloWorld.c
```
## Daha Fazla Bilgi
* [tryGit - Git'i öğrenmek için eğlenceli interaktif bir yol](http://try.github.io/levels/1/challenges/1)
* [Git Dallanmayı Öğren - Git'i web üzerinde öğrenmek için en görsel ve interaktif yol](http://learngitbranching.js.org/)
* [Udemy Git Tutorial: Kapsayıcı bir kılavuz](https://blog.udemy.com/git-tutorial-a-comprehensive-guide/)
* [Git Immersion - Git'in temelinden başlayan bir tur](http://gitimmersion.com/)
* [git-scm - Video Tutorial](http://git-scm.com/videos)
* [git-scm - Dökümantasyon](http://git-scm.com/docs)
* [Atlassian Git - Tutorial & Workflow](https://www.atlassian.com/git/)
* [SalesForce Kopya Kağıdı](http://res.cloudinary.com/hy4kyit2a/image/upload/SF_git_cheatsheet.pdf)
* [Git - Basit bir kılavuz](http://rogerdudler.github.io/git-guide/index.html)
* [Pro Git](http://www.git-scm.com/book/en/v2)
* [Yeni başlayanlar için Git ve Github](http://product.hubspot.com/blog/git-and-github-tutorial-for-beginners)
|