Git ve Github Nedir, Nasıl Kullanılır
Tags: github, git
Published: 2021-06-27 12:34:25

## Git nedir
Git, kısaca **versiyon kontrol sistemidir**. Bu söylemi açarsak; yazdığınız programı, kodu veya herhangi bir dosyalar topluluğunu, versiyonlara ayırarak ve **iterasyonlar** halinde geliştirmek istiyorsanız kullanacağınız sistem diyebiliriz.

**Git yerel olarak, sizin bilgisayarınızda bulunan bir uygulamadır. Github ise Git ile yazılan projeler için bir depolama servisidir**

## Kurulum
Ben kurulumu *Debian* tabanlı sistemler için anlatacağım, ama küçük bir araştırma ile kolayca kendi işletim sisteminizdeki yükleme şeklini bulabilirsiniz
```
sudo apt install git
```
## Kullanım
Eğer bir dizinde, git *initialize* ederek, local repository oluşturabiliriz. Bunu yaparken *.git* dizini de otomatik olarak oluşacaktır.

```
git init
```
Veya, halihazırdaki bir repository'i **clone**'layıp bilgisayarımıza indirmek istiyorsak:
```
git clone <link>
```
Örnek olarak
```
git clone https://github.com/limanmys/core
```
### Not
`git clone` ve Github üzerindeki *Download* butonu aynı şey değildir. Github üzerinden indirirseniz **.git** klasörü olmadığı için, geliştirmeye devam ederek **commit** veya **push** atamayız.

Bu noktada **git credential**'larımızı girmemiz gerekiyor
```
git config --global user.email "you@example.com"
git config --global user.name "YourName"
```
### Add
Daha sonrasında, yerel çalışma ortamımızda yaptığımız değişiklikleri **staging area** dediğimiz yerel alana almak için:
```
git add .
```
Veya tek bir dosya, dizin vs. almak istiyorsak
```
git add dosya
git add dizin/
```
şeklinde kullanabiliriz. Bu işlem sonrasında bu değişiklikler bizim **local repository**'mize değil, sadece **staging area** içerisine kaydolmuş olur. 

### Not
`git add` öncesinde ve sonrasında aşağıdaki komut ile, sırasıyla, öncesinde eklenmemiş dosyaları ve sonrasında ise eklemiş dosyaların durumunu görebilirsiniz
```
git status
```

### Commit
Bunları **local repository**'e eklemek için:
```
git commit -m "commit mesajı"
```
Bunu yaptığımızda, kodumuz hala daha **local repository**'de bulunur.

Daha kolay anlayabilmeniz için bir görsel
![https://git-scm.com/about/staging-area](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ikxgmu8rtaq204nna8i4.png)
*Görsel git-scm.com'dan alınmıştır*

### Remote add
Bunu uzaktaki sunucumuza aktarmak için, önce sunucunun adresini aşağıdaki komut ile belirtmemiz gerekiyor(eğer **clone**'ladıktan sonra geliştirme yapıyorsanız buna gerek yoktur)
```
git remote add origin <link>
```
Burada **origin** ismi bizim kendi belirlediğimiz bir isimdir. İstediğiniz ismi koyabilirsiniz. Ama **origin** ismi genel kullanımdır ve tercih edilir.

Örnek olarak
```
git remote add origin https://github.com/limanmys/core
```

### Push
**Push**lamadan önce, eğer ana **repo** **branch**imiz **main** ise aşağıdaki komut ile yereldeki git üzerinden **branch**'i main yapabiliriz
```
git branch -M main
```

Daha sonrasında uzak depomuza bu değişiklikleri göndermek için
```
git push -u origin main
```
kullanılır. Buradaki **main** branch ismimizdir. Kullanımınıza göre değişiklik gösterir.
### Not
Eğer **-u** parametresini kullanırsanız, uzaktaki *branch* ile yerel *branch*'inizi birbirine eşitleyerek
`git pull origin main` yerine `git pull` kullanarak işlem yapabilmenizi sağlar.

Bu komutu yazdığınızda, eğer ilk git kullanımınız ise, size **Username** ve **Password** soracaktır. Bu bilgileri girdiğinizde kodunuz uzaktaki sunucuya gitmiş olacaktır.

### Not
Eğer Github hesabınızda **Two Factor Authentication** açıksa, şifre yerine [Github üzerinden alacağınız bir tokeni](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token), veya yerelde [oluşturacağınız](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) bir **SSH anahtarını** Github hesabınıza [eklemeniz](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account) gerekir. Ben **SSH anahtarı** oluşturmayı öneriyorum.

Remote mantığını anlayabilmek için bir görsel daha
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6u9s6p8i6x9lkegwx5n0.png)
*Görsel [bu linkten](https://support.nesi.org.nz/hc/en-gb/articles/360001508515-Git-Reference-Sheet) alınmıştır*

### Pull
Bu noktadan sonra bizim dışımızda birinin yaptığı değişiklikleri yerel **repo**muza çekmek için

```
git pull origin main
```

veya **-u** parametresini kullandıysanız

```
git pull
```
komutunu kullanabilirsiniz. Dosyanızın yerel **repo**nuza geldiğini göreceksiniz.

### Fork
Github üzerinden [forkladığımız](https://docs.github.com/en/get-started/quickstart/fork-a-repo) **repo**'yu *clone*'layarak yerel **repo** oluşturabilirsiniz. Bu **repo**'nun **origin**'i kendi **fork**'unuzun ismi olacağı için, **upstream**, yani **fork**'ladığınız **repo**'nun *remote* olarak eklenmesi gerekir.
```
git remote add upstream https://github.com/<OriginalUser>/<OriginalRepo>
```
#### Not
**upstream** genel olarak tercih edilen isimdir.

Eğer **fork**'ladığınız repoda bir değişiklik varsa ve bunu kendi **repo**'nuz ile eşitlemek isterseniz
```
git fetch upstream
git checkout main
git merge upstream/main
```

### Branch
Eğer farklı bir **branch** üzerinde çalışmak isterseniz
```
git checkout -b <branch_adı>
```
ile yeni **branch**'i oluşturup, o **branch** üzerinde çalışmaya başlayabilirsiniz. **-b** parametresi olmadan da halihazırda bulunan bir **branch**'e geçilebilir

```
git checkout main
```

Eğer yereldeki bir **branch**i silmek isterseniz
```
git branch -d <BranchName>
```

### Stash
Eğer halihazırda bazı değişiklikler yaptıktan sonra, henüz **push**'lamadan, reponuzun herhangi bir **branch**'indeki değişiklikleri yerel **repo**nuza uygulamak isterseniz

```
git stash
git pull
git stash pop
```

### Commit Amend
Eğer son aldığınız **commit** mesajını değiştirmek isterseniz
```
git add .
git commit -amend -m "yeni commit mesajı"
```
kullanabilirsiniz.

### Reset
**Push**'lamadığınız değişiklikleri geri almak için;

**HEAD**'e geri dönmek için(son remote **commit** veya son **push**)
```
git reset --hard HEAD 
```
#### Not
Bu kısımlardaki komutlarda, **--hard** parametresi, **değişikliklerinizin kaybolmasına** yol açar. Eğer **değişikliklerinizi kaybetmeden** dönmek istiyorsanız, **--soft** parametresini kullanabilirsiniz

```
git reset --soft HEAD
```

```
git reset --hard HEAD~1     (bir önceki commit'e gitmek)

git reset --hard HEAD~2     (iki önceki commit'e gitmek)
```

#### Hard Reset Geri Alma
Hard reset geri almak için

```
git reset --hard HEAD@{1}
```

### Revert
Eğer **hard reset** ile kaybedeceğiniz **commit**'leri kaybetmek istemiyor ve onların da **commit** geçmişinde bulunmasını istiyorsanız
```
git revert HEAD
```
Bu komut için **hash** kullanmanız da gerekebilir. Bunun için

```
git log
```
ile dönmek istediğimiz **commit**'in **hash**'ini bularak
```
git revert [hash]
```

### Diff
Git'teki değişiklikleri görmek için
```
git diff
```
veya **git add** ile **stage**'lemişseniz
```
git diff --staged
```