# GitLab nedir ve Git ile nasıl kullanılır: clone, push, merge request, CI/CD

URL: https://skillaria.top/tr/guides/git/gitlab-nedir-git

GitLab, Git repository'lerini barındıran ve ekip çalışmasını yürüten bir web platformudur: kod, merge request, görevler ve CI/CD tek yerde toplanır. Bulut servisi gitlab.com üzerinde ya da şirketin kendi sunucusunda kullanılabilir; kod clone, push ve pull gibi standart Git komutlarıyla gönderilir ve alınır.

## GitLab nedir

GitLab, Git repository'lerinin tutulduğu ve ekip çalışmasının etrafında kurulduğu bir platformdur: kod incelemesi, merge request (birleştirme talebi), görevler, wiki, konteyner kayıt defteri ve yerleşik CI/CD. Kısaca GitLab, «kendi derleme hattı olan ve isterseniz kendi sunucunuzda da kurabileceğiniz bir GitHub» gibidir. Pek çok şirket, Türkiye'de de, kodunu iç ağa kurulan GitLab'da tutar.

Proje 2011'de kod barındırmak için açık kaynaklı bir uygulama olarak başladı; ardından etrafında GitLab Inc. şirketi kuruldu. Platform iki sürümde bulunur: açık kaynak olan ve kendi sunucunuza ücretsiz kurabileceğiniz Community Edition ile ücretli özellikleri olan Enterprise Edition. Bulut servisi gitlab.com'da planlar Free, Premium ve Ultimate olarak adlandırılır.

Kavramları karıştırmamak önemlidir. Git, bilgisayarınızda çalışan bir sürüm kontrol sistemidir. GitLab ise repository'nin uzak bir kopyasını barındıran ve ekip için arayüz ile araçlar ekleyen bir servistir. Git olmadan GitLab ile çalışamazsınız, ama GitLab olmadan da Git gayet iyi çalışır.

## Git ve GitLab arasındaki fark

«Git ve gitlab nedir» diye arayanlar genellikle bir iş ilanında ya da işe başladıkları ilk günde iki kelimeyle karşılaşır. Fark, bir belgeyle bulut depolama hizmeti arasındaki fark gibidir: Git dosya değişikliklerini, commit geçmişini ve dalları yerelde izler. GitLab bu geçmişi ağ üzerinden alır ve tarayıcıda gösterir.

|  | Git | GitLab |
| --- | --- | --- |

| Nedir | Sürüm kontrol programı | Repository'ler ve ekip çalışması için web platformu |

| Nerede çalışır | Geliştiricinin bilgisayarında | gitlab.com üzerinde veya şirket sunucusunda |

| Ağ gerekir mi | Hayır, push, pull, fetch ve clone dışında | Evet, ağ üzerinden çalışan bir servistir |

| Temel işlevler | Commit, dal, birleştirme, geçmiş | Merge request, inceleme, görevler, CI/CD, erişim izinleri |

| Nasıl kullanılır | Komut satırı, IDE, grafik istemciler | Tarayıcı ve normal Git komutları |

Kodla ilgili tüm işlemleri (commit, branch, merge) hâlâ Git ile yaparsınız. GitLab, sonucu `git push` ile alır ve meslektaşlarınızla tartışmanızı sağlar.

## GitLab ve GitHub arasındaki farklar

İki servis de Git repository'lerini tutar ve kod incelemesini destekler; bu yüzden temel becerileriniz neredeyse aynen taşınır. Farklar vurgularda ve kurulum modelindedir.

| Ölçüt | GitLab | GitHub |
| --- | --- | --- |

| Birleştirme talebi | Merge request (MR) | Pull request (PR) |

| CI/CD | Yerleşik GitLab CI/CD, `.gitlab-ci.yml` dosyası | GitHub Actions, `.github/workflows/` içindeki dosyalar |

| Kendi sunucuya kurulum | Kendi sunucunuza ücretsiz Community Edition | GitHub Enterprise Server, ücretli |

| Platformun kaynak kodu | Açık (Community Edition) | Kapalı |

| Projelerin gruplanması | Gruplar ve iç içe alt gruplar | Organizasyonlar |

| Nerede daha yaygın | Kurumsal geliştirme, iç sunucular | Açık kaynak, herkese açık projeler, portföy |

Pratikte bir geliştirici çoğu zaman ikisini birden kullanır: kişisel projeler ve portföy GitHub'da, kurumsal iş kodu şirketin GitLab'ında. Git komutları aynıdır; değişen yalnızca uzak repository'nin adresidir.

## gitlab.com mu, kendi sunucu mu (self-hosted)

Bulut servisi gitlab.com kişisel projeler ve küçük ekipler için uygundur: kaydolursunuz ve hemen repository oluşturursunuz. Güncellemeler, yedekleme ve erişilebilirlik GitLab'ın sorumluluğundadır. Ücretsiz paketin sınırları (katılımcı sayısı, CI dakikası, depolama alanı) zaman zaman değişir; güncel koşullar için plan sayfasına bakın.

Self-hosted GitLab, şirketin kendi sunucusuna kurduğu sürümdür: Linux paketi, Docker veya Kubernetes ile. Kod iç ağdan çıkmaz, LDAP ile kurumsal girişe bağlanabilir ve derlemeler için kendi runner'larınızı kurabilirsiniz. Karşılığında yönetici güncellemelerden ve yedeklerden sorumludur. Geliştirici için fark neredeyse görünmezdir: adres `gitlab.com` olmaz, örneğin `gitlab.sirket.com.tr` olur.

## GitLab için Git yapılandırması

İlk commit'ten önce ad ve e-posta ayarlayın: bunlar geçmişe yazılır ve GitLab commit'leri e-posta üzerinden profilinize bağlar.

```
git config --global user.name "Ali Yılmaz"
git config --global user.email "ali@example.com"
```

Windows'ta Git Bash'te çalışmak uygundur: Git for Windows ile birlikte kurulur ve `ssh-keygen` içerir, dolayısıyla bu yazıdaki tüm komutlar değişiklik gerekmeden çalışır. Ardından erişim yöntemini seçin: token ile HTTPS ya da SSH anahtarı.

### HTTPS ile giriş: personal access token

Git'in HTTPS işlemleri için hesap parolasını kullanmamanız önerilir; iki faktörlü doğrulama açıksa zaten çalışmaz. Bunun yerine GitLab profil ayarlarındaki Access tokens bölümünde bir personal access token oluşturun. Kodla çalışmak için `read_repository` ve `write_repository` izinleri yeterlidir; bir son kullanma tarihi belirleyin ve token'ı hemen kaydedin, çünkü bir daha gösterilmez.

İlk push'ta veya clone'da Git kullanıcı adı ve parola sorar: GitLab kullanıcı adınızı girin, parola yerine token'ı yazın. Kimlik bilgisi yöneticisi (Git for Windows ile gelir) bunu hatırlar, tekrar girmeniz gerekmez.

### SSH anahtarıyla giriş

SSH günlük kullanım için daha rahattır: anahtarı bir kez ekleyin, bundan sonra hiçbir şey yazmanız gerekmez.

```
ssh-keygen -t ed25519 -C "ali@example.com"
cat ~/.ssh/id_ed25519.pub
```

`.pub` dosyasının içeriğini (genel anahtar) GitLab profil ayarlarında SSH Keys bölümüne yapıştırın. Bağlantıyı şöyle test edebilirsiniz:

```
ssh -T git@gitlab.com
Welcome to GitLab, @ali.yilmaz!
```

## GitLab git clone: repository nasıl klonlanır

Proje sayfasında SSH ve HTTPS için iki adres içeren bir Code düğmesi vardır. İstediğinizi kopyalayın ve `git clone` çalıştırın:

```
# HTTPS ile
git clone https://gitlab.com/my-group/my-project.git

# SSH ile
git clone git@gitlab.com:my-group/my-project.git
```

GitLab'da proje yolu alt grupları içerebilir, örneğin `gitlab.com/company/backend/api.git`; bu normaldir, adresi olduğu gibi kopyalayın.

### Token ile GitLab git clone

Birinin parola girebileceği bir yer olmayan betiklerde ve sunucularda token doğrudan adreste verilir. Kullanıcı adı olarak GitLab kullanıcı adınızı ya da hizmet adı `oauth2`'yi kullanabilirsiniz:

```
git clone https://oauth2:TOKEN_BURAYA@gitlab.com/my-group/my-project.git
```

Dikkat: böyle bir adres `.git/config` dosyasına kaydedilir ve komut geçmişine düşebilir. Otomasyon için en az izinli, süreli bir deploy token ya da project access token kullanın; CI içinde ise yerleşik `CI_JOB_TOKEN` değişkenini tercih edin.

## GitLab'a git push: kodu gönderme

Proje zaten yerelde varsa, GitLab'da boş bir proje oluşturun (ekstra commit olmasın diye README eklemeden) ve uzak repository'yi bağlayın:

```
git remote add origin git@gitlab.com:my-group/my-project.git
git branch -M main
git push -u origin main
```

Bayrak `-u` yerel dalı uzak dala bağlar; bundan sonra `git push` ve `git pull` yazmanız yeterlidir. Günlük döngü diğer servislerle aynıdır:

```
git switch -c feature/login
git add .
git commit -m "Giriş formunu ekle"
git push -u origin feature/login
git pull
```

Etiketler ayrıca gönderilir: `git push origin v1.2.0` ya da hepsini birden `git push --tags`. GitLab'da etiketler Tags bölümünde görünür ve çoğu zaman bir yayın hattını başlatır.

### GitLab git push sırasında sık görülen hatalar

- **HTTP Basic: Access denied** — kullanıcı adı yanlış ya da token yerine parola girilmiş. `write_repository` yetkisi olan bir token oluşturun ve kimlik bilgisi yöneticisindeki eski kaydı silin.
- **Permission denied (publickey)** — GitLab SSH anahtarınızı tanımıyor. Genel anahtarın profilinizde olduğunu kontrol edin ve `ssh -T git@gitlab.com` komutunu çalıştırın.
- **You are not allowed to push code to protected branches** — dal (genellikle `main`) korumalıdır. Değişikliklerinizi kendi dalınıza gönderin ve bir merge request açın.
- **rejected ... (fetch first)** — sunucuda sizde olmayan commit'ler var. `git pull --rebase` çalıştırıp push'u tekrarlayın.
- **remote: Project not found** — adreste yazım hatası var ya da projeye erişiminiz yok; rolünüzü proje sahibinden öğrenin.

## GitLab'da merge request

Merge request, GitHub'daki pull request'in karşılığıdır: dalınızı ana dala birleştirme talebidir. Kod satırlarına yorum yazılan, CI kontrollerinin çalıştığı ve birleştirme kararının verildiği yer burasıdır. Yeni bir dalı push ettikten sonra GitLab terminalde MR oluşturma bağlantısını gösterir; web arayüzünde de MR oluşturma önerisi çıkar.

MR'ı doğrudan komut satırından push seçenekleriyle de oluşturabilirsiniz:

```
git push -o merge_request.create -o merge_request.target=main origin feature/login
```

Tipik akış şöyledir: görev için dal → commit'ler → push → MR → inceleme ve yeşil pipeline → merge. Birleştirmede GitLab commit'leri tek bir commit'te toplayabilir (squash) ve kaynak dalı silebilir. MR'da çakışma varsa en basit çözüm, dalı yerelde `git pull --rebase origin main` ya da `git merge main` ile güncellemek, çakışmaları çözmek ve tekrar push etmektir.

Bitmemiş işleri Draft olarak işaretleyin: böyle bir MR yanlışlıkla birleştirilemez, ama meslektaşlarınız değişiklikleri görüp tartışabilir.

## GitLab'da CI/CD: .gitlab-ci.yml

GitLab'ın öne çıkan özelliği yerleşik CI/CD'dir. Repository'nin köküne bir `.gitlab-ci.yml` dosyası koymanız yeterlidir: her push'ta GitLab, aşamalardan (stages) ve işlerden (jobs) oluşan bir pipeline başlatır. İşleri runner'lar çalıştırır: gitlab.com'da ortak runner'lar vardır, kendi sunucunuzda bunları ayrıca kurmanız gerekir.

```
stages:
  - test
  - deploy

test:
  stage: test
  image: python:3.12
  script:
    - pip install -r requirements.txt
    - pytest

deploy:
  stage: deploy
  script:
    - ./deploy.sh
  rules:
    - if: $CI_COMMIT_TAG
```

Bu örnekte testler her push'ta çalışır, `deploy` işi ise yalnızca bir etiket gönderildiğinde başlar: `git tag v1.0.0` ve `git push origin v1.0.0`. Pipeline sonuçları doğrudan merge request içinde görünür; kontroller geçmeden birleştirmeyi engelleyebilirsiniz.

## GitLab'da repository nasıl silinir

Git komutları sunucudaki bir projeyi silemez: `git push` yalnızca dalları ve etiketleri değiştirir. Proje web arayüzünden silinir: proje ayarları, General bölümü, Advanced bloğu ve onay adını yazmanızı isteyen silme düğmesi. Owner rolü gerekir. Yerel kopya kalır; bu yalnızca `.git` içeren bir klasördür.

Yerel repository'yi sunucudaki hiçbir şeyi silmeden GitLab'dan ayırmak istiyorsanız `git remote remove origin` yeterlidir.

## Ne zaman GitLab seçilmeli

- Kodun dış bir bulut servisine çıkamaması ve kendi sunucunuza ihtiyaç duyulması.
- Üçüncü taraf servislere ihtiyaç duymadan hazır bir CI/CD istenmesi.
- Ekip hiyerarşisi olan büyük bir kurum; iç içe gruplar ve esnek roller işe yarar.
- GitLab kullanan bir şirkete katılıyorsanız: bu durumda seçim zaten yapılmıştır, ama Git becerileriniz tamamen taşınır.

Portföy ve açık kaynak için genellikle GitHub tercih edilir: topluluğu daha geniştir ve projeler daha görünürdür. Aynı projeyi iki serviste de tutmanızda bir engel yoktur; bir repository'nin birden fazla remote'u olabilir.

## Sonuç

GitLab, Git repository'leri için merge request tabanlı inceleme, görevler ve yerleşik CI/CD sunan bir platformdur; hem bulutta hem de kendi sunucunuzda çalışır. Onunla çalışmak tanıdık komutlara indirgenir: token veya SSH anahtarıyla girişi ayarlayın, sonra clone, commit, push ve merge request. Uzak repository'ler ve ekip süreçleri Git kursunda uygulamalı olarak ele alınmaktadır.

## FAQ

**GitLab ücretsiz mi?**

Kendi sunucunuza kurulan Community Edition ücretsizdir; gitlab.com'da sınırlamaları olan bir Free planı vardır, gelişmiş özellikler ise ücretli Premium ve Ultimate planlarında sunulur.

**Bir projeyi GitHub'dan GitLab'a taşıyabilir miyim?**

Evet: GitLab GitHub'daki projelerin içe aktarılmasını destekler; geçmişi elle de taşıyabilirsiniz: eski adresten git clone --mirror ve yeni adrese git push --mirror ile.

**GitLab için ayrı Git komutları öğrenmem gerekir mi?**

Hayır, kodla standart Git komutlarıyla çalışırsınız; GitLab web arayüzünü ekler, otomasyon için ise komut satırı aracı glab ve API vardır.

**GitLab Flow, Git Flow'dan nasıl farklıdır?**

GitLab Flow daha sadedir: işler özellik dallarında yapılır ve main'e merge request ile birleştirilir; ortamlar ve sürümler için gerekirse ayrı dallar eklenir, Git Flow'daki develop ve hotfix dalları olmadan.


---
Source: Skillaria.Top (https://skillaria.top)
