Post

git - the simple guide

Những ngày tháng sinh viên, lúc mới chập chững bắt tay vào code những project để báo cáo cuối kì. Bọn tui làm theo nhóm nhiều người, chia nhỏ công việc và vai trò khác nhau cho từng cá nhân.

Và ấy thế là, mạnh ai nấy code, mãi cho đến khi xong mới ngồi lại để gộp code. Chúng tôi thật vô tri, phải nén lại thành file zip rồi gửi lên drive, tải về giải nén rồi copy/paste với tool chạy bằng cơm.

Kết quả là, thiếu trước hụt sau, code sau khi gộp không chạy được như ý muốn. Cả đám phải thức đến tận sáng để ngồi debug, fix làm sao bản final coi cho ra hồn một chút.

May thay, bọn tui cũng đạt được số điểm mà hàng tá sinh viên khác mong muốn, 10/10. Nghe ảo vcl :))) Nhưng mà đó là sự thật, với đằng sau là những lần gộp code toát mồ hôi và bao đêm thức trắng :)

Giá mà ngày đó biết git sớm hơn, sử dụng git trong các university-project thì đâu phải vất vả, đổ mồ hôi hột nhiều đến thế.

Sau lần đó, bọn tui khôn ra, nói đúng hơn là sợ hãi cái cảm giác 8h sáng báo cáo, mà 3h sáng còn ngồi merge code, fix bug. Tui và mấy khứa bạn bắt tay vào tìm hiểu và sử dụng git để kí ức đáng sợ ấy không lặp lại nữa.

Dưới đây là những gì cơ bản nhất được tìm hiểu, trắc lọc để xem lại mỗi khi cần :v. Chắc quỡn quỡn sẽ update thêm cho đủ đầy, nhưng mà chừng nào quỡn thì tui không biết nữa.


Cài đặt

Tải và cài đặt tuỳ thuộc vào hệ điều hành tương ứng bạn đang sử dụng. git-scm.com/downloads

Kiểm tra version xem đã cài đặt thành công hay chưa bằng lệnh:

1
git --version

Git flow

Một số lệnh cơ bản

1. git init

Lệnh git init thực hiện việc khởi tạo một repository ở trên máy local (máy tính cá nhân).

Ngay tại thư mục thực thi, lệnh git init sẽ tạo ra một thư mục ẩn .git và thư mục này chưa các thông tin của repository ở local như branches, config, HEAD, objects, refs, … vân vân và mây mây.

2. git add

Lệnh git add thực hiện lưu thông tin thay đổi vào stagging area. Có thể hiểu git add như việc bạn nhấn Ctrl + S để lưu lại một trạng thái lúc bạn gõ word, và bạn có thể undo lại trạng thái trước đó với lệnh git reset hoặc tiến đến trạng thái hoàn thành bằng lệnh git commit.

Ví dụ:

1
git add JavaBasic.java

Lệnh trên sẽ thêm file JavaBasic.java vào stagging area. Nếu file JavaBasic.java được git add lần đầu thì sẽ được tạo snapshot toàn bộ file JavaBasic.java, những lần tiếp theo snapshot được tạo là nội dung thay đổi so với commit trước.

Ngoài ra, để tiết kiệm thời gian hoặc muốn commit nhiều thay đổi với cùng mục đích hoặc do quá lười thì git cũng hỗ trợ một số lệnh.

Thêm toàn bộ các thay đổi, bao gồm các folder và file vào stagging area:

1
git add .

Thêm các file thay đổi theo chỉ định phần đuôi mở rộng. Ví dụ, thêm các file .java:

1
git add *.java

3. git commit

Đây là lệnh mà tui nghe hầu hết các bạn đồng nghiệp hay nhắc nhau, phải git commit trước khi tắt máy, trước khi nhấc mông ra về.

git commit nhằm mục đích lưu các thay đổi đã git add từ stagging vào local repository.

Làm gì cũng vậy. Phải lưu cho chắc ăn cái đã. Nhưng mà lưu cũng phải cho người khác biết mình lưu/commit cái gì, kẻo bực lên tụi nó chửi không thương tiếc.

1
git commit -m "commit gì đó để không bị chửi"

Nội dung trong "" thay đổi tuỳ vào mục đích commit và đôi khi phụ thuộc vào tiêu chuẩn của dự án. Chung quy thì mục đích chỉ để người khác nhìn vào biết đoạn code, dòng code đó thay đổi nhằm mục đích gì, hết!!! Àh còn trách bị chửi nữa.

4. git push

Lệnh git push dùng để đẩy các thay đổi đã commit ở local repository lên remote repository. Khi push lên có thể chỉ định push lên các nhánh cụ thể với các cờ:

  • –all đẩy tất cả các nhánh ở local lên remote repository
  • –tags đẩy tất cả các tag ở local lên remote repository
  • –delete xóa một nhánh ở trên remote repository
  • -u đẩy và tạo một upstream (luồng upload tương ứng với nhánh của local), hay sử dụng cho lần đầu đẩy lên remote repository.

5. git clone

Lệnh git clone dùng để kéo source code từ remote repository về local repository để thực hiện các thay đổi.

Có hai cách để clone một repository về máy:

  • Lệnh clone qua ssh:
    1
    
    git clone git@github.com:bthanhtung/test.git
    
  • Lệnh clone qua https:
    1
    
    git clone https://github.com/bthanhtung/test.git
    

6. git reset

Giả sử khi đã git add để thêm toàn bộ các thay đổi vào stagging-area nhưng chợt nhận ra có một vài file chỉ cần thay đổi ở work-space để phục vụ cho việc testing thôi, không cần phải đưa vào stagging-area hay commit/push lên để làm gì thì lệnh git reset là sự trợ giúp đắc lực.

Lệnh git reset thường dùng kết hợp với với các từ khoá hard | soft | HEAD. Một số ví dụ:

1
2
3
4
5
git reset     --hard|soft HEAD     -> Di chuyển con trỏ đến commit hiện tại.
git reset     --hard|soft HEAD^    -> Quay về trước 1 commit so với HEAD.
git reset     --hard|soft HEAD~1   -> Quay về trước 1 commit so với HEAD.
git reset     --hard|soft HEAD~2   -> Quay về trước 2 commit so với HEAD.
git reset     --hard|soft HEAD~n   -> Quay về trước n commit so với HEAD.

Nếu có thể xác định chính xác commit muốn reset tới thì có thể chỉ định rõ hash-commit muốn reset:

1
git reset --hard ee82fbcc0

7. git log

Một trong những cái hay của git giúp việc quản lý và giám sát source-code chặt chẽ hơn đó là cho phép xem lại lịch sử commit.

Lệnh git log liệt kê các commit theo thứ tự từ mới nhất đến cũ nhất, mỗi commit có các thông tin gồm: mã hash của commit, dòng thông báo, người tạo commit và ngày tạo commit.

Đôi khi dùng git log, chợt nhận thấy có những commit kiểu "up", "done", "what the f*", "oh shit", … thì cũng chớ vội bất ngờ :))) tất cả đều do những bức xúc của dev mà ra.

8. git diff

Lệnh git diff có thể kiểm tra thay đổi của file giữa các vùng, các lần commit hay các branch khác nhau.

Kiểm tra sự khác nhau của file giữa workspace đang code và stagging area:

1
git diff

Kiểm tra sự khác nhau của file giữa stagging area và local repository:

1
git diff –staged

Kiểm tra sự khác nhau của file giữa hai lần commit, cái này cần biết hash-commit thì mới so sánh được:

1
git diff 1d2f924 367d9c0

Kiểm tra sự khác nhau của file giữa hai branch, ví dụ giữa branch masterdev:

1
git diff master dev

9. git status

Lệnh này được dùng khá nhiều và rất hữu ích để xem lại các folder và file đã thay đổi.

Trước các file có sự thay đổi có thể có các ký tự tương ứng với các thông tin gồm:

  • ’ ‘ = unmodified (không đổi)
  • M = modified (có sửa đổi)
  • A = added (file mới thêm)
  • D = deleted (file bị xóa)
  • R = renamed (đổi tên file)
  • C = copied (file copy từ file khác)
  • U = updated but unmerged (đã cập nhật, nhưng chưa merge)

Mặc dù có rất nhiều ứng dụng hỗ trợ GUI, nhưng cá nhân tui vẫn thích dùng lệnh hơn :3

10. git branch

Trong thực tế với một dự án sẽ sử dụng nhiều branch để phát triển một phần mềm như nhánh dev, sit, uat, prod.

Kiểm tra nhánh hiện tại:

1
git branch

Tạo thêm nhánh develop mới:

1
git branch develop

Đổi tên nhánh hiện tại thành dev-new:

1
git branch -m dev-new

11. git checkout

Lệnh git checkout thường được dùng để chuyển branch làm việc. Khi clone về, mặc định sẽ ở branch master, giả sử muốn chuyển sang nhánh dev:

1
git checkout dev

Lệnh git checkout cũng có thể vừa chuyển nhánh vừa tạo thêm nhánh mới bằng option -b:

1
git checkout -b dev

12. git restore

Lệnh git restore để khôi phục các thay đổi trên file tại workspace-area.

Một buổi sáng đẹp trời hăng sai cắm mặt ngồi code, thêm mới và sửa đổi các file một cách rất chi là enjoy. Nhưng rồi chợt nhận ra, what the fuck, mấy file này sửa vầy là toang rồi, phải trả lại nguyên bản của nó thôi.

Thay vì ngồi back lại từng dòng, từng đoạn code thì git restore sẽ giúp làm việc đó trong tít tắt.

Để khôi phục file BankService.java:

1
git restore BankService.java

Để khôi phục các file có hậu tố là .java:

1
git restore *.java

Nếu tức tối hay lười quá hoặc là đang bực sếp, kiểu code làm méo gì nữa, khôi phục hết luôn, khỏi code nữa:

1
git restore .

13. git merge

Lệnh git merge thực hiện merge hai branch lại với nhau, lệnh này sẽ thực hiện merge các thay đổi của cả file, folder và thông tin bộ lưu trữ trong .git lại.

Mergelà chuyện đơn giản thôi. Chỉ cần chạy một dòng lệnh là xong. Giả sử muốn merge nhánh dev vào master chẳng hạn:

  • Trước tiên, make-sure rằng đang ở nhánh master:
    1
    
    git checkout master
    
  • Thực hiện merge:
    1
    
    git merge dev
    

Trong các dự án thực tế, nhiều developer sẽ code trên nhiều nhánh cùng một lúc và triển khai nhiều tính năng, nên việc merge sẽ dễ dẫn đến các trường hợp conflict. Vì vậy trước khi merge bạn cần nắm rõ và thực hiện các lệnh kiểm tra trước như git status, git log, git fetch,...

14. git fetch

Lệnh git fetch cập nhật các thay đổi từ remote repository về local repository.

git fetch sẽ chỉ tải repository trên remote repository mà không tải file hay thư mục làm việc về local. Lệnh này nhằm mục đích kiểm tra theo dõi các commit cập nhật trên server từ các branch mà không làm thay đổi luồng làm việc trên máy local.

git fetch origin master git fetch –all

15. git pull

Lệnh git pull lấy toàn bộ thông tin trên remote repository bao gồm dữ liệu file, folder và kho lưu trữ thông tin .git.

Một số lệnh git pull thường dùng:

  • git pull: Lệnh này kéo (fetch) toàn bộ các thay đổi từ nhánh theo mặc định và thực hiện merge chúng vào nhánh hiện tại. Nhánh mặc định thường là nhánh được cấu hình sẵn để pull về (ví dụ: origin/main hoặc origin/master).

  • git pull origin: Tương tự như git pull, nhưng ở đây chỉ rõ remote repository là origin. Thông thường, origin là remote mặc định đại diện cho repository mà bạn đã clone.

  • git pull origin/dev: Lệnh này kéo các thay đổi từ nhánh dev của remote repository origin và sau đó thực hiện merge các thay đổi này vào nhánh hiện tại của bạn.

  • git merge origin/master: Lệnh này sẽ thực hiện merge những thay đổi từ nhánh master trên remote origin vào nhánh hiện tại. Lưu ý, trước khi thực hiện lệnh này, bạn nên thực hiện git fetch để cập nhật các thay đổi từ remote.

Thông thường, để nhanh và tiện lợi, đầy đủ nhất, cứ git pull mà sử dụng.

16. git tag

Lệnh git tag dùng để đánh dấu một điểm nào đó trong lịch sử quá trình commit khi cho rằng điểm đó là quan trọng hoặc cần chú ý.

Thường tag được đánh dựa trên nhánh master, ngay sau khi release một tính năng nào đó lên môi trường production.

Tag được đánh theo quy ước và tiêu chuẩn của dự án hoặc yêu cầu của các sếp (nếu có) miễn sao dễ quản lý.

Một số lệnh với tag thường dùng:

  • Hiển thị các tag:
    1
    
    git tag
    
  • Hiển thị các tag, sử dụng cờ -l hoặc --list để hiển thị thông tin:
    1
    
    git tag -l
    
  • Tạo ra một tag mới đánh dấu vào commit cuối:
    1
    
    git tag -a tag-new -m "create tag-new"
    
  • Có thể tạo tag cho các commit bất kỳ bằng cách lấy mã hash của commit đó:
    1
    
    git tag -a tag-new -m "create tag-new cho hash-commit 9fceb02" 9fceb02
    
  • Xem thông tin về commit được gắn tag:
    1
    
    git show tag-new
    
  • Cập nhật tag lên repo remote:
    1
    
    git push origin tag-new
    
  • Cập nhật tất cả các tag:
    1
    
    git push origin --tags
    
  • Xóa một tag thì cần thực hiện xóa cả ở Local và ở Remote (nếu đã push tag):
    1
    2
    
    git tag -d tag-new
    git push --delete origin tag-new
    

Viết cho dong dài vậy chớ tuỳ tình hình thực tế và vai trò trong dự án mà số lượng lệnh git được sử dụng sẽ khác nhau.

Nếu đã chán ngán với các dòng lệnh khô khan, thì GUI là phương án thay thế tốt nhất và tối ưu nhất cho những ai lười gõ và nhớ lệnh. Một số GUI hỗ trợ sử dụng git tốt và được hàng triệu lập trình viên tin dùng, có thể được kể đến như source-tree, github-desktop.

Bài viết mang tính chất “ghi chú, lưu trữ, chia sẻ và phi lợi nhuận”.
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!

Happy coding! 😎 👍🏻 🚀 🔥

Đọc thêm:

This post is licensed under CC BY 4.0 by the author.