# GitLab คืออะไร และใช้งานร่วมกับ Git อย่างไร: clone, push, merge request, CI/CD

URL: https://skillaria.top/th/guides/git/what-is-gitlab

GitLab คือเว็บแพลตฟอร์มสำหรับเก็บรีโพ Git และทำงานเป็นทีม รวมการดูโค้ด merge request งาน และ CI/CD ที่มีในตัวไว้ในที่เดียว ใช้งานได้ทั้งบนคลาวด์ที่ gitlab.com หรือบนเซิร์ฟเวอร์ของบริษัทเอง โค้ดยังส่งและดึงด้วยคำสั่ง Git ปกติ เช่น git clone, git push และ git pull

## GitLab คืออะไร

GitLab คือแพลตฟอร์มที่ใช้เก็บรีโพ Git และจัดการการทำงานเป็นทีมรอบ ๆ รีโพนั้น ไม่ว่าจะเป็นการดูโค้ด merge request (คำขอรวม) งาน วิกิ รีจิสทรีคอนเทนเนอร์ และ CI/CD ที่มีในตัว พูดง่าย ๆ GitLab คือ «GitHub ที่มีไปป์ไลน์การ build ของตัวเอง และสามารถติดตั้งไว้บนเซิร์ฟเวอร์ของคุณเองได้» บริษัทจำนวนมาก โดยเฉพาะในประเทศไทย เก็บโค้ดไว้ใน GitLab ที่ติดตั้งในเครือข่ายภายในองค์กร

โปรเจกต์นี้เริ่มในปี 2011 ในฐานะแอปพลิเคชันโอเพนซอร์สสำหรับโฮสต์โค้ด และต่อมาก็พัฒนาเป็นบริษัท GitLab Inc. แพลตฟอร์มมีสองรุ่น คือ Community Edition ซึ่งเป็นรุ่นโอเพนซอร์สที่ติดตั้งบนเซิร์ฟเวอร์ของคุณได้ฟรี และ Enterprise Edition ที่มีฟีเจอร์แบบเสียเงิน บน gitlab.com แพ็กเกจมีชื่อว่า Free, Premium และ Ultimate

ควรแยกแยะแนวคิดเหล่านี้ให้ชัด Git คือระบบควบคุมเวอร์ชัน เป็นโปรแกรมที่ทำงานบนคอมพิวเตอร์ของคุณ ส่วน GitLab คือบริการที่เก็บสำเนารีโพระยะไกล และเพิ่มอินเทอร์เฟซกับเครื่องมือให้ทีม ไม่มี Git ก็ใช้ GitLab ไม่ได้ แต่ Git ทำงานได้ดีโดยไม่ต้องมี GitLab

## Git และ GitLab ต่างกันอย่างไร

คนที่ค้นหาว่า «git และ gitlab คืออะไร» มักเจอคำทั้งสองพร้อมกันในประกาศงานหรือในวันแรกของการทำงาน ความต่างคล้ายกับเอกสารกับคลาวด์ไดรฟ์ Git ติดตามการเปลี่ยนแปลงของไฟล์ และเก็บประวัติ commit กับสาขาไว้ในเครื่อง ส่วน GitLab รับประวัติเหล่านี้ผ่านเครือข่ายและแสดงในเบราว์เซอร์

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

| คืออะไร | โปรแกรมควบคุมเวอร์ชัน | เว็บแพลตฟอร์มสำหรับรีโพและการทำงานเป็นทีม |

| ทำงานที่ไหน | บนคอมพิวเตอร์ของนักพัฒนา | บน gitlab.com หรือเซิร์ฟเวอร์ของบริษัท |

| ต้องใช้อินเทอร์เน็ตหรือไม่ | ไม่จำเป็น ยกเว้น push, pull, fetch, clone | จำเป็น เพราะเป็นบริการเครือข่าย |

| หน้าที่หลัก | commit, สาขา, merge, ประวัติ | merge request, รีวิว, งาน, CI/CD, สิทธิ์การเข้าถึง |

| วิธีใช้งาน | บรรทัดคำสั่ง, IDE, โปรแกรม GUI | เบราว์เซอร์กับคำสั่ง Git ปกติ |

งานทุกอย่างกับโค้ด เช่น commit, branch, merge ยังทำใน Git เหมือนเดิม GitLab เพียงรับผลลัพธ์ผ่าน `git push` และให้คุณพูดคุยเรื่องนั้นกับเพื่อนร่วมทีม

## GitLab กับ GitHub ต่างกันอย่างไร

ทั้งสองบริการเก็บรีโพ Git และรองรับการรีวิวโค้ด ดังนั้นทักษะพื้นฐานใช้ได้เหมือนกันทั้งหมด ความต่างอยู่ที่จุดเน้นและวิธีการติดตั้ง

| หัวข้อ | GitLab | GitHub |
| --- | --- | --- |

| คำขอรวม | Merge request (MR) | Pull request (PR) |

| CI/CD | GitLab CI/CD ที่มีในตัว ไฟล์ `.gitlab-ci.yml` | GitHub Actions ไฟล์อยู่ใน `.github/workflows/` |

| ติดตั้งเอง | Community Edition ฟรี ติดตั้งบนเซิร์ฟเวอร์ของคุณ | GitHub Enterprise Server เสียเงิน |

| ซอร์สโค้ดของแพลตฟอร์ม | เปิดเป็นโอเพนซอร์ส (Community Edition) | ปิด |

| การจัดกลุ่มโปรเจกต์ | กลุ่มและกลุ่มย่อยซ้อนกัน | องค์กร (Organizations) |

| นิยมใช้ที่ไหน | การพัฒนาในองค์กร เซิร์ฟเวอร์ภายใน | โอเพนซอร์ส โปรเจกต์สาธารณะ พอร์ตโฟลิโอ |

ในการทำงานจริง นักพัฒนามักใช้ทั้งสองอย่าง โปรเจกต์ส่วนตัวและพอร์ตโฟลิโอไว้บน GitHub และโค้ดงานไว้บน GitLab ขององค์กร คำสั่ง Git เหมือนกันทุกประการ เปลี่ยนเพียงที่อยู่ของรีโมตรีโพ

## gitlab.com หรือเซิร์ฟเวอร์ของตัวเอง (self-hosted)

gitlab.com บนคลาวด์เหมาะกับโปรเจกต์ส่วนตัวและทีมเล็ก ลงทะเบียนแล้วสร้างรีโพได้ทันที การอัปเดต การสำรองข้อมูล และความพร้อมใช้งานเป็นความรับผิดชอบของ GitLab ข้อจำกัดของแพ็กเกจฟรี (จำนวนสมาชิก นาทีของ CI พื้นที่จัดเก็บ) อาจเปลี่ยนแปลงเป็นครั้งคราว จึงควรดูเงื่อนไขล่าสุดในหน้าแพ็กเกจ

Self-hosted GitLab คือบริษัทติดตั้งบนเซิร์ฟเวอร์ของตัวเอง จากแพ็กเกจ Linux, Docker หรือ Kubernetes โค้ดไม่ออกจากเครือข่ายภายใน สามารถเชื่อมการล็อกอินองค์กรผ่าน LDAP และตั้งค่า runner ของตัวเองสำหรับการ build ข้อแลกเปลี่ยนคือผู้ดูแลระบบต้องรับผิดชอบการอัปเดตและการสำรองข้อมูลเอง สำหรับนักพัฒนาแทบไม่รู้สึกถึงความต่าง ต่างกันเพียงที่อยู่ที่จะไม่ใช่ `gitlab.com` แต่เป็นอย่างเช่น `gitlab.company.co.th`

## ตั้งค่า Git ให้ทำงานกับ GitLab

ก่อน commit ครั้งแรก ตั้งชื่อและอีเมลของคุณ ข้อมูลนี้จะเข้าไปอยู่ในประวัติ และ GitLab จะใช้อีเมลเพื่อเชื่อม commit กับโปรไฟล์ของคุณ:

```
git config --global user.name "Somchai Jaidee"
git config --global user.email "somchai@example.com"
```

บน Windows แนะนำให้ใช้ Git Bash ซึ่งติดตั้งมาพร้อมกับ Git for Windows และมี `ssh-keygen` อยู่ด้วย ทำให้คำสั่งทั้งหมดในบทความนี้ใช้ได้โดยไม่ต้องแก้ไข จากนั้นเลือกวิธีล็อกอิน ระหว่าง HTTPS ด้วยโทเค็น หรือกุญแจ SSH

### ล็อกอินด้วย HTTPS: personal access token

ไม่ควรใช้รหัสผ่านบัญชีกับการทำงานของ Git ผ่าน HTTPS และเมื่อเปิดการยืนยันตัวตนสองขั้นตอน รหัสผ่านก็ใช้ไม่ได้อยู่แล้ว ให้สร้าง personal access token แทนในการตั้งค่าโปรไฟล์ GitLab (ส่วน Access tokens) สำหรับการทำงานกับโค้ดต้องใช้สิทธิ์ `read_repository` และ `write_repository` ตั้งวันหมดอายุและบันทึกโทเค็นทันที เพราะจะไม่แสดงซ้ำอีก

ตอน push หรือ clone ครั้งแรก Git จะถามชื่อผู้ใช้และรหัสผ่าน ให้กรอกชื่อผู้ใช้ GitLab และใช้โทเค็นแทนรหัสผ่าน ตัวจัดการข้อมูลรับรอง (มีในตัวของ Git for Windows) จะจำไว้ให้ จึงไม่ต้องกรอกซ้ำ

### ล็อกอินด้วยกุญแจ SSH

SSH สะดวกกว่าสำหรับการทำงานประจำวัน เพิ่มกุญแจเพียงครั้งเดียว แล้วจะไม่ต้องกรอกอะไรอีก

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

นำเนื้อหาของไฟล์ `.pub` (กุญแจสาธารณะ) ไปวางในการตั้งค่าโปรไฟล์ GitLab ที่ส่วน SSH Keys ทดสอบการเชื่อมต่อ:

```
ssh -T git@gitlab.com
Welcome to GitLab, @somchai.jaidee!
```

## Git clone GitLab: วิธีโคลนรีโพ

ที่หน้าโปรเจกต์มีปุ่ม Code ซึ่งมีที่อยู่สองแบบ คือ SSH และ HTTPS คัดลอกแบบที่ต้องการแล้วรัน `git clone`:

```
# ผ่าน HTTPS
git clone https://gitlab.com/my-group/my-project.git

# ผ่าน SSH
git clone git@gitlab.com:my-group/my-project.git
```

ใน GitLab พาธของโปรเจกต์อาจมีกลุ่มย่อย เช่น `gitlab.com/company/backend/api.git` ซึ่งเป็นเรื่องปกติ ให้คัดลอกที่อยู่ทั้งหมด

### Git clone GitLab ด้วยโทเค็น

ในสคริปต์หรือบนเซิร์ฟเวอร์ที่ไม่มีใครกรอกรหัสผ่านได้ ให้ใส่โทเค็นลงในที่อยู่โดยตรง ชื่อผู้ใช้จะเป็นชื่อของคุณหรือ `oauth2` ก็ได้:

```
git clone https://oauth2:TOKEN_ของคุณ@gitlab.com/my-group/my-project.git
```

ข้อควรระวัง: ที่อยู่แบบนี้จะถูกบันทึกใน `.git/config` และอาจไปอยู่ในประวัติคำสั่งของ shell สำหรับงานอัตโนมัติ ควรใช้ deploy token หรือ project access token ที่มีสิทธิ์น้อยที่สุดและมีวันหมดอายุ และใน CI ให้ใช้ตัวแปรในตัว `CI_JOB_TOKEN`

## Git push ไปยัง GitLab: ส่งโค้ดขึ้น

หากโปรเจกต์มีอยู่ในเครื่องแล้ว ให้สร้างโปรเจกต์เปล่าใน GitLab (ไม่ต้องใส่ README เพื่อไม่ให้เกิด commit ที่ไม่จำเป็น) แล้วผูกรีโมตรีโพ:

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

แฟล็ก `-u` เชื่อมสาขาในเครื่องกับสาขาระยะไกล หลังจากนั้นพิมพ์ `git push` และ `git pull` ได้เลย วงจรการทำงานปกติไม่ต่างจากบริการอื่นเลย:

```
git switch -c feature/login
git add .
git commit -m "เพิ่มฟอร์มเข้าสู่ระบบ"
git push -u origin feature/login
git pull
```

แท็กต้อง push แยกต่างหาก: `git push origin v1.2.0` หรือจะส่งทั้งหมดพร้อมกันด้วย `git push --tags` ใน GitLab แท็กจะปรากฏในส่วน Tags และมักจะเริ่มไปป์ไลน์การเผยแพร่รีลีส

### ข้อผิดพลาดที่พบบ่อยตอน git push ไปยัง GitLab

- **HTTP Basic: Access denied**: ชื่อผู้ใช้ผิด หรือกรอกรหัสผ่านแทนโทเค็น ให้สร้างโทเค็นที่มีสิทธิ์ `write_repository` และลบรายการเก่าออกจากตัวจัดการข้อมูลรับรอง
- **Permission denied (publickey)**: GitLab ไม่รู้จักกุญแจ SSH ของคุณ ตรวจว่าได้เพิ่มกุญแจสาธารณะในโปรไฟล์แล้ว และรัน `ssh -T git@gitlab.com`
- **You are not allowed to push code to protected branches**: สาขา (มักเป็น `main`) ถูกป้องกันไว้ ให้ push การเปลี่ยนแปลงไปยังสาขาของคุณเอง แล้วสร้าง merge request
- **rejected ... (fetch first)**: มี commit บนเซิร์ฟเวอร์ที่คุณยังไม่มี ให้รัน `git pull --rebase` แล้ว push อีกครั้ง
- **remote: Project not found**: ที่อยู่สะกดผิด หรือคุณไม่มีสิทธิ์เข้าถึงโปรเจกต์ ให้สอบถามบทบาทของคุณจากเจ้าของโปรเจกต์

## Merge request ใน GitLab

Merge request คือเทียบเท่า pull request ของ GitHub คือการขอให้รวมสาขาของคุณเข้าสู่สาขาหลัก เพื่อนร่วมทีมจะแสดงความเห็นที่บรรทัดของโค้ดใน MR ระบบ CI รันการตรวจสอบ และมีการตัดสินใจว่าจะรวมหรือไม่ หลัง push สาขาใหม่ GitLab จะแสดงลิงก์สำหรับสร้าง MR ในเทอร์มินัล และในหน้าเว็บก็จะมีข้อเสนอให้สร้าง MR ด้วย

สามารถสร้าง MR จากบรรทัดคำสั่งได้โดยใช้ push options:

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

ขั้นตอนทั่วไปคือ สาขาสำหรับงาน → commit → push → MR → รีวิวและทำให้ไปป์ไลน์เป็นสีเขียว → merge เมื่อ merge GitLab สามารถรวม commit เป็นอันเดียว (squash) และลบสาขาต้นทางได้ หาก MR มีคอนฟลิกต์ วิธีที่ง่ายที่สุดคืออัปเดตสาขาในเครื่องด้วย `git pull --rebase origin main` หรือ `git merge main` แก้คอนฟลิกต์ แล้ว push อีกครั้ง

งานที่ยังไม่เสร็จให้ทำเครื่องหมายเป็น Draft MR แบบนี้จะไม่ถูก merge โดยไม่ตั้งใจ แต่เพื่อนร่วมทีมยังเห็นการเปลี่ยนแปลงและสามารถพูดคุยได้

## CI/CD ใน GitLab: .gitlab-ci.yml

จุดเด่นของ GitLab คือ CI/CD ที่มีในตัว เพียงวางไฟล์ `.gitlab-ci.yml` ไว้ที่รากของรีโพ ทุกครั้งที่ push GitLab จะรันไปป์ไลน์ (pipeline) ที่ประกอบด้วยขั้นตอน (stages) และงาน (jobs) งานจะถูกรันโดย runner: gitlab.com มี runner สาธารณะให้ใช้ ส่วนเซิร์ฟเวอร์ของตัวเองต้องติดตั้ง runner แยก

```
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
```

ในตัวอย่างนี้ การทดสอบรันทุกครั้งที่ push ส่วนงาน `deploy` จะรันเฉพาะเมื่อมีการ push แท็ก: รัน `git tag v1.0.0` แล้ว `git push origin v1.0.0` ผลของไปป์ไลน์จะแสดงโดยตรงใน merge request และสามารถตั้งให้ห้ามรวมได้ หากการตรวจสอบยังไม่ผ่าน

## วิธีลบรีโพใน GitLab

คำสั่ง Git ไม่สามารถลบโปรเจกต์บนเซิร์ฟเวอร์ได้ `git push` ทำได้เพียงเปลี่ยนสาขาและแท็ก การลบโปรเจกต์ทำในเว็บอินเทอร์เฟซ: เปิดการตั้งค่าโปรเจกต์ ไปที่ส่วน General แล้วในบล็อก Advanced กดปุ่มลบ และพิมพ์ชื่อโปรเจกต์เพื่อยืนยัน ต้องมีบทบาท Owner สำเนาในเครื่องจะไม่ถูกลบ เป็นเพียงโฟลเดอร์ที่มี `.git` อยู่

หากต้องการตัดการเชื่อมโยงรีโพในเครื่องกับ GitLab โดยไม่ลบอะไรบนเซิร์ฟเวอร์ ใช้คำสั่ง `git remote remove origin` ได้เลย

## เมื่อไรควรเลือก GitLab

- โค้ดห้ามนำไปไว้บนคลาวด์ภายนอก ต้องใช้เซิร์ฟเวอร์ของตัวเอง
- ต้องการ CI/CD ที่พร้อมใช้งานโดยไม่ต้องพึ่งบริการภายนอก
- องค์กรขนาดใหญ่ที่มีลำดับชั้นของทีม จึงต้องการกลุ่มซ้อนกันและบทบาทที่ยืดหยุ่น
- คุณกำลังเข้าทำงานในบริษัทที่ใช้ GitLab อยู่แล้ว ในกรณีนี้ไม่มีตัวเลือกให้เลือก แต่ทักษะ Git ใช้ได้ครบถ้วน

สำหรับพอร์ตโฟลิโอและโอเพนซอร์ส คนส่วนใหญ่มักเลือก GitHub เพราะมีชุมชนใหญ่กว่าและโปรเจกต์มองเห็นได้มากกว่า ไม่มีอะไรห้ามเก็บโปรเจกต์ไว้ทั้งสองบริการพร้อมกัน เพราะรีโพหนึ่งสามารถมีหลาย remote ได้

## สรุป

GitLab คือแพลตฟอร์มสำหรับรีโพ Git ที่มีการรีวิวผ่าน merge request งาน และ CI/CD ที่มีในตัว ใช้ได้ทั้งบนคลาวด์และบนเซิร์ฟเวอร์ของตัวเอง การใช้งานคือตั้งค่าการล็อกอินด้วยโทเค็นหรือกุญแจ SSH แล้วใช้คำสั่งที่คุ้นเคย ได้แก่ clone, commit, push และ merge request การทำงานกับรีโมตรีโพและขั้นตอนการทำงานเป็นทีมมีการอธิบายโดยละเอียดพร้อมตัวอย่างจริงในคอร์ส Git

## FAQ

**GitLab ฟรีหรือไม่?**

Community Edition สำหรับติดตั้งบนเซิร์ฟเวอร์ของคุณฟรี บน gitlab.com มีแพ็กเกจฟรี Free ที่มีข้อจำกัด ฟีเจอร์ขั้นสูงต้องใช้แพ็กเกจแบบเสียเงิน Premium หรือ Ultimate

**ย้ายโปรเจกต์จาก GitHub ไป GitLab ได้หรือไม่?**

ได้ GitLab รองรับการนำเข้าโปรเจกต์จาก GitHub และยังย้ายประวัติด้วยตัวเองได้ โดยใช้ git clone --mirror จากที่อยู่เดิม แล้วใช้ git push --mirror ไปยังที่อยู่ใหม่

**ต้องเรียนคำสั่งของ GitLab แยกต่างหากหรือไม่?**

ไม่ต้อง การทำงานกับโค้ดใช้คำสั่ง Git ปกติ GitLab เพิ่มเพียงอินเทอร์เฟซบนเว็บ และสำหรับงานอัตโนมัติมีเครื่องมือบรรทัดคำสั่ง glab และ API

**GitLab Flow ต่างจาก Git Flow อย่างไร?**

GitLab Flow เรียบง่ายกว่า งานทำในสาขาฟีเจอร์และส่งเข้า main ผ่าน merge request และหากต้องการแยกสภาพแวดล้อมหรือรีลีสก็เพิ่มสาขาแยกได้ โดยไม่จำเป็นต้องมีสาขา develop และ hotfix แบบ Git Flow


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