gitgit branchgit mergegit rebasegit stashgit cherry-pickgit taggit forkgit pull requestgit stacked prs
git
git chỉ có một việc: ghi lại lịch sử và cho nhiều người cùng viết vào đó. Mọi lệnh bạn sẽ gặp đều rơi vào một trong bốn chặng dưới đây.
20 cột mốc · 13 có bài trong app
Bắt đầu
1Một mình một máy
Tự quản được lịch sử của chính mình, và quay lui được khi lỡ tay.
- init · add · commitcó bàiBa lệnh đủ để có một lịch sử. Mọi thứ về sau chỉ là biến tấu của chúng.
- status · logcó bàiĐọc được git đang nghĩ gì trước khi gõ lệnh tiếp — thói quen tiết kiệm nhiều giờ nhất.
- restore · resetcó bàiHai đường lùi khác nhau: bỏ sửa đổi chưa commit, và gỡ commit vừa tạo.
- stashcó bàiCất tạm việc đang dở để nhảy sang việc gấp, rồi lấy lại nguyên trạng.
- .gitignoretự tìm hiểuThứ không bao giờ nên nằm trong lịch sử: khoá, node_modules, file build.
2Nhiều dòng công việc
Làm hai việc song song trên cùng một repo mà không giẫm lên nhau.
- branch · switchcó bàiNhánh không phải bản sao thư mục — nó chỉ là một cái tên trỏ vào một commit.
- mergecó bàiGộp hai dòng lịch sử lại, giữ nguyên cả hai đường đã đi.
- rebasecó bàiPhát lại commit của mình lên đầu nhánh khác — lịch sử thẳng, nhưng là lịch sử ĐÃ VIẾT LẠI.
- cherry-pickcó bàiLấy đúng một commit từ nhánh khác, không kéo theo cả nhánh.
- tagcó bàiMột cái nhãn đứng yên vĩnh viễn tại một commit — dùng để đánh dấu bản phát hành.
- Xung đột (conflict)tự tìm hiểuHai nhánh sửa cùng một dòng. git dừng lại và hỏi bạn — nó không bao giờ tự đoán.
3Làm việc với người khác
Đưa việc của mình cho người khác đọc, và nhận việc của họ về.
- remote · push · pullcó bàiMáy mình và máy chủ là hai kho riêng biệt. push/pull là hai chiều đồng bộ giữa chúng.
- forkcó bàiBản sao của repo người khác đứng tên bạn — cách đóng góp khi không có quyền ghi.
- pull requestcó bàiLời đề nghị gộp, kèm chỗ để review. Đây là tầng GitHub, không phải lệnh git.
- stacked PRscó bàiChia một việc lớn thành chuỗi PR nhỏ chồng lên nhau, review được từng khúc.
- fetch khác pull chỗ nàotự tìm hiểufetch chỉ tải về; pull là fetch rồi gộp luôn. Biết chỗ khác nhau là bớt một loại tai nạn.
4Khi mọi thứ rối
Bình tĩnh gỡ, thay vì xoá thư mục rồi clone lại.
- reflogtự tìm hiểuSổ ghi mọi lần HEAD dịch chuyển. Gần như không có gì thật sự mất — nếu đã từng commit.
- reverttự tìm hiểuGỡ tác dụng của một commit đã đẩy lên, bằng cách thêm commit mới thay vì viết lại lịch sử.
- bisecttự tìm hiểuChia đôi lịch sử để tìm commit làm hỏng. Vài bước thay vì đọc trăm commit.
- rebase -itự tìm hiểuSửa, gộp, đổi thứ tự commit trước khi đưa cho người khác đọc.
Đích
Lộ trình dừng ở đây
Bốn chặng trên đủ cho gần như mọi ngày làm việc. Phần dưới là những hướng đi tiếp — không có bài ở đây, và cũng không cần: tới lúc bạn cần chúng, bạn sẽ biết mình đang tìm gì.
- git hooksChạy kiểm tra tự động ngay trước lúc commit hoặc push.
- submodule · subtreeNhúng một repo vào bên trong một repo khác, và những phiền toái đi kèm.
- Quy ước commit messageConventional Commits — và vì sao một lịch sử đọc được lại đáng giá hơn bạn tưởng.
- Chiến lược nhánhGit Flow, trunk-based… mỗi đội chọn một luật chơi khác nhau, không có luật nào đúng sẵn.