forked from hionay/presentations
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgit.slide
More file actions
256 lines (202 loc) · 13 KB
/
git.slide
File metadata and controls
256 lines (202 loc) · 13 KB
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
git
versiyon kontrol sistemi
15 Nov 2016
Tags: git, vcs, dvcs
Halil Ibrahim Onay
https://halil.io
@hionay
* Versiyon Kontrolü Sistemi (VCS)
- *VCS*, dosyanın/dosyaların istediğiniz versiyonuna sonrasında erişmenizi ve geri dönmenizi sağlayan sistemdir.
- Bu sistem ile projede istediğiniz bir noktaya dönebilir, kayıtlar arasındaki farklılıkları görebilir, sorun çıkaran bir dosyayı kimin değiştiğini görebilirsiniz.
- *VCS* ile projenizde yolunda gitmeyen birşeyler olursa dosyalarınızı kolayca kurtarabilirsiniz.
* Lokal Versiyon Kontrol Sistemi (LVCS)
- Çoğu kullanıcının version tutmak için kullandığı metod, dosyaları başka bir klasörde tutmak olmuştur. Bu metod çok basit olmasına karşın beraberinde bir çok sorun getirir. Hangi projede çalıştığınız, hangi dosyaya yazdığınız zamanla unutulabilir ve projeniz bu metod ile karışabilir.
- Bu sorunla başa çıkabilmek için programcılar uzun zaman önce bütün değişiklikleri lokal bir veritabanında tutan versiyon kontrol sistemi geliştirdiler.
* Lokal Versiyon Kontrol Sistemi (LVCS)
.image git/local.png
* Merkezi Versiyon Kontrol Sistemleri (CVCS)
- LVCS'de programcıların projelerde birlikte koordine çalışamaması CVCS'nin ortaya çıkmasını sağladı. Bu sistemler CVS, Subversion (SVN) gibi versiyonlanan bütün dosyaları tek bir sunucuda tutar. Aynı projede birden fazla kişi çalışabilir ve bu sayede kimin projenin neresinde çalıştığı görülebilir.
- Bu tip sistemlerde de bazı sorunlar ortaya çıkmıştır. En ciddi sorun her şeyin tek bir sunucuya bağlı olmasıdır. Sunucu kapalı olduğunda kimse versiyon değişikliklerini sunucuya gönderemez ve bu da programcıların aynı projede birlikte çalışmasına engel olur.
* Merkezi Versiyon Kontrol Sistemleri (CVCS)
.image git/centralized.png
* Dağıtık Versiyon Kontrol Sistemleri (DVCS)
- DVCS'de (Git, Mercurial ve Bazaar gibi), istemciler istedikleri dosyaların sadece son görüntüsünü (snapshot) almaz tüm repoyu (repository/proje) indirirler (aynalama yaparlar).
- Sunucu kapandığında veya başka bir sorun çıktığında, projeyi bulunduran herhangi bir kullanıcı bunu sunucuya/sunuculara tekrar yükleyebilir.
- Her klonlama reponun aynı zamanda komple bir yedekleme işlemidir.
* Dağıtık Versiyon Kontrol Sistemleri (DVCS)
.image git/distributed.png
* Git Temelleri
* Dosya Farklılıkları Yerine Dosya Görüntüleri
- Git ile diğer VCS'lerin arasındaki en büyük fark Git'in data'ya öncelik vermesidir. Diğer sistemler (CVS, Subversion, Bazaar) sadece dosya bazlı değişiklikler hakkında bilgi tutarlar.
.image git/deltas.png
* Dosya Farklılıkları Yerine Dosya Görüntüleri
- Git, içerdiği dosyaları minyatür bir dosya sistemi içinde görüntüler (snapshot) olarak düşünür.
- Her commit yaptığınızda, Git, dosyalarınızın o an nasıl göründüğünün görüntüsünü/fotoğrafını çeker ve bu görüntüyü referans olarak saklar.
- Git, etkili ve hızlı olabilmek için, dosyanın içeriği değişmediyse o dosyayı tekrar saklamaz ve sadece o dosyaya ait bir link/referans oluşturur.
.image git/snapshots.png
* Neredeyse bütün operasyonlar lokalde gerçekleşir
- Git üzerinde çoğu operasyon sadece lokal bir ortama ihtiyaç duyar.
- Diğer sistemlerin (CVS, Subversion vs.) aksine repoların tüm geçmişi aynı zamanda lokalde de tutulduğu için Git çok hızlı işlem yapar.
- Örneğin bir projenin geçmişine bakmak isterseniz, Git bunu sunucudan çekip size göstermek yerine direk lokal veritabanından gösterir.
- Bir dosyanın şu anki hali ile 1 ay önceki halini karşılaştırmak isterseniz, Git, sunucuya tekrar sormak yerine lokaldeki veritabanından 1 ay önceki dosyayı bulup farklılıkları size direk gösterebilir.
- İnternetin olmadığı bir ortamda bu şekilde rahatça çalışabilir, internete çıktığınız anda istediğiniz zaman sunucuya son değişiklikleri gönderebilirsiniz.
- CVS, Subversion gibi Merkezi Versiyon Kontrol Sistemlerinde ise internet bağlantısı olmadan dosyalarınızı değiştirebilir ancak commit yapamazsınız çünkü sunucu bağlantısı gerektirir.
* Git üzerinde bütünlük ve doğruluk
- Git üzerinde her şeyin kaydedilmeden önce checksum değeri hesaplanır ve bu değer referans olarak kullanılır.
- Bu sayede Git'in bilgisi dışında bir dosya veya klasörün içeriği değiştirilemez.
- Git bunun için SHA-1 hash algoritması kullanır.
- Oluşturulan bu değer, rakamlar ve küçük harflerden oluşan 40 karakterlik bir string'dir.
24b9da6552252987aa493b52f8696cd6d3b00373
* Üç Durum
- Git üzerinde dosyaları belirten 3 ana durum vardır: işlenen (commit), değiştirilen (modify) ve sahnelenen (stage).
- İşlenen (committed), datanın güvenli bir şekilde lokal veritabanına kaydedilmesi anlamına gelir.
- Değiştirilen (modified), dosyanın değiştiği ancak lokal veritabanına henüz işlenmemiş (commit) olduğu anlamına gelir.
- Sahnelenen (staged) ise değiştirilmiş bir dosyanın şu anki versiyonunun bir sonraki işlenecek (commit) görüntüye (snapshot) gitmesi için işaretlenmesi anlamına gelir.
* Üç Durum
.image git/areas.png
* Git Kurulumu
Linux:
.link http://git-scm.com/download/linux http://git-scm.com/download/linux
Mac:
.link http://git-scm.com/download/mac http://git-scm.com/download/mac
Windows:
.link http://git-scm.com/download/win http://git-scm.com/download/win
Windows (GUI):
.link http://windows.github.com/ http://windows.github.com/
* Git Ayarları
$ git config --global user.name "Adiniz Soyadiniz"
$ git config --global user.email mail@adresiniz
- Projenize özel bir ayar girmek isterseniz `--global` parametresini girmeden değiştirebilirsiniz
* Git Repoları
- Projeniz için bir git reposu oluşturmak istiyorsanız projenin olduğu klasöre gidip şu komutu vermeniz gerekir.
$ git init
- Bu komut ile projeniz içinde `.git` klasörü oluşturulur. Bu klasörde git'in ihtiyaç duyduğu repoya ait bir çok bilgi bulunur.
- Hali hazırda olan dosyalarınızı versiyon kontrolüne sokmak için `stage` aşamasına almanız gerekir.
$ git add *.cs
$ git add README
$ git commit -m 'ilk commit'
* Git Repoları
- Başka bir git reposunu bilgisayarınıza indirmek için `clone` komutunu kullanmanız gerekir.
- Klonladığınız repo artık tüm geçmişiyle birlikte bilgisayarınıza inmiş olur.
$ git clone https://github.com/hionay/presentations
- Başka bir klasör olarak indirmek isterseniz bunu bir sonraki parametrede belirtebilirsiniz.
$ git clone https://github.com/hionay/presentations sunumlar
* Değişiklikleri repoya kaydetmek
- Projede istediğiniz bir değişikliği tamamladığınızda bu değişiklikleri *commit* etmeniz gerekir.
- Projenizdeki dosyalar 2 durumdan birinde olabilir: izlenen (tracked) ve izlenmeyen (untracked)
- İzlenmeyen dosyalar son commit'iniz içinde yer almayan ve henüz *staged* duruma geçmemiş dosyalardır.
- Bir repoyu uzaktan klonladığınızda bütün dosyalar *tracked* durumunda ve değişikliğe uğramamış halde iner.
- Dosyaları değiştirdikçe Git, bu dosyaları *modified* olarak belirler sonrasında ise bu değişen dosyaları *commit* etmek üzere *staged* durumuna alırsınız.
* Değişiklikleri repoya kaydetmek
.image git/lifecycle.png
* Dosyalarınızın durumunu kontrol etmek
- Bu kontrolu `git`status` komutuyla sağlarız.
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
- Bu durum izlenen (yeni eklenen) veya değişikliğe uğramış dosyanızın olmadığını belirtir.
* Dosyalarınızın durumunu kontrol etmek
- Yeni bir dosya eklediğinizde veya dosyalarda değişiklik yaptığınızda `git`status` bu durumu belirten bir çıktı verir.
$ echo 'MERHABA' > hello.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
- Gördüğünüz gibi *hello.txt* dosyası *untracked* olarak gözüküyor. *untracked* durumu kısaca Git'in bu dosyayı bir önceki *commit* üzerinde görmemesi anlamına gelir.
* Yeni dosyaların izlenmesi
- Yeni bir dosyayı *tracked* durumuna almak için `git`add` komutu kullanılır.
$ git add hello.txt
- Tekrar `git`status` ile durum kontrolü yaptığınızda *hello.txt* dosyanızın artık *tracked* ve *staged* durumuna geçtiğini görürsünüz.
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.txt
* Değişiklik yapılan dosyaları staged durumuna almak
- Başka bir dosyayı değiştirdiğinizde (*deneme.txt*) ve tekrar `git`status` ile durum kontrolü yaptığınızda son durum şu şekilde gözükecektir.
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: deneme.txt
- Bu durumda *commit* edilecek dosya sadece *hello.txt* dosyasıdır. Değişiklik yapılan dosyanın da *commit* edilebilmesi için önce *staged* durumuna alınması gerekir.
* Değişiklik yapılan dosyaları staged durumuna almak
- Değişiklik yaptığımız dosyayı *staged* durumuna aldığımızda 2 dosya da artık commit edilmeye hazır hale gelir.
$ git add deneme.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.txt
modified: deneme.txt
* Dosyaları görmezden gelmek
- Bazı dosyalarınızı Git'in görmemesini ve izlememesini `.gitignore` dosyasına bu dosyaları yazarak sağlayabilirsiniz. Genelde bu dosyalar otomatik oluşturulan loglar, çalıştırılabilir binary dosyalardır.
$ cat .gitignore
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
* Dosya farklarına bakmak
- Değiştirdiğiniz dosyalarda son *commit* yaptığınız görüntüsüne (snapshot) göre nelerin değiştiğini görmek istiyorsanız `git`diff` komutunu kullanabilirsiniz.
$ echo "merhaba dunya" >> deneme.txt
$ git diff
diff --git a/deneme.txt b/deneme.txt
index b7e1062..3d5e79e 100644
--- a/deneme.txt
+++ b/deneme.txt
@@ -1 +1,2 @@
selam
+merhaba dunya
warning: LF will be replaced by CRLF in deneme.txt.
The file will have its original line endings in your working directory.
- *staged* durumuna aldığınız dosyaların son *commit* içindeki görüntüsüyle aradaki farkı ise `--staged` parametresi ile görebilirsiniz.
* Değişiklikleri commit etmek
- Dosyalarınız istediğiniz şekilde *staged* durumuna gelmiş ise artık bu dosyaları commit edebilirsiniz.
$ git commit
- Komutu ile terminaldeki varsayılan editorunuz açılır ve commit mesajınızı yazıp kaydedip çıkış yaptığınızda bu dosyalar artık commit edilmiş olur.
- Editoru açmadan commit mesajınızı parametre olarak da yazıp commit yapabilirsiniz.
$ git commit -m "Add text to hello.txt file"
[master 463dc4f] Add text to hello.txt file
2 files changed, 2 insertions(+)
create mode 100644 hello.txt
* Değişiklikleri geri almak
- Son yaptığınız commit içine bir dosyayı koymayı unuttuysanız veya bir kaç değişiklik daha yapmanız gerektiyse veya commit mesajınızı değiştirmek isterseniz tüm bu değişiklikleri yaptıktan sonra bu komut ile tekrar commit edebilir ve önceki commit'inizi düzeltebilirsiniz.
$ git commit --amend
* Bir dosyayı unstaged durumuna almak
- Bir dosyayı *commit* yapmak üzere *staged* durumuna aldınız ve sonradan bu dosyanın aslında o *commit* içinde olmaması gerektiğini farkettiyseniz o dosyayı şu şekilde tekrar *unstaged* durumuna alabilirsiniz.
$ git reset HEAD hello.txt
Unstaged changes after reset:
M hello.txt
* Dosyadaki değişiklikleri son görüntüdeki haline getirmek
- Dosyada istenmeyen bir değişiklik yaptıysanız bir önceki yaptığınız *commit* içindeki haline dosyayı geri getirebilirsiniz.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: hello.txt
$ git checkout -- hello.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
* Commit kayıtlarını görmek
- Repodaki commitleri ve ayrıntılarını `git`log` komutuyla görebilirsiniz.
- Kullanabileceğiniz faydalı parametreler `--oneline`, `--graph` gibi.