+3

Giới thiệu về Git

Git là gì?

Git là hệ thống kiểm soát phiên bản phân tán mà nguồn mở ( Open Source Distributed Version Control System). Các dự án thực tế thường có nhiều nhà phát triển làm việc song song. Vì vậy, một hệ thống kiểm soát phiên bản như Git là cần thiết để đảm bảo không có xung đột mã giữa các nhà phát triển. Ngoài ra, các yêu cầu trong dự án thay đổi thường xuyên. Vì vậy, cần một hệ thống cho phép nhà phát triển quay lại phiên bản cũ hơn của mã.

1. Thế nào là repository, branch?

  • Repository là gì ?
    Repository hay còn gọi là Repo, dịch ra tiếng Việt có nghĩa là kho, đây chính là nơi chứa tất cả mã nguồn cho một dự án được tạo bởi Git. Bạn có thể hiểu một cách khác là Repository chính khai báo thư mục chứa dự án của bạn trên local hoặc remote. Một repo sẽ có hai cấu trúc dữ liệu chính đó là Object store và Index được lưu trữ ẩn trong thư mục .git .

    Có hai loại repository là local repository và remote repository:

    • Local repository: là repo được cài đặt trên máy tính của lập trình viên, repo này sẽ đồng bộ hóa với remote bằng các lệnh của Git.
    • Remote repository: là repo được cài đặt trên server chuyên dụng, điển hình hiện nay là Github.
  • Branch là gì ?
    Đối với những dự án có nhiều thành viên tham gia thì mỗi thành viên sẽ nhận được nhiều task từ leader, vì vậy việc xử lý task này trên cùng một thời gian là rất khó vì dễ bị đụng code. Để giải quyết vấn đề này thì chúng ta sẽ sử dụng branch của Git, tương ứng với mỗi nhiệm vụ chúng ta sẽ tạo một branh và làm việc trên đó, các branch này sẽ hoạt động riêng lẻ và không anh hưởng lẫn nhau.
    Vậy branch là những phân nhánh ghi lại luồng thay đổi của lịch sử, các hoạt động trên mỗi branch sẽ không ảnh hưởng lên các branch khác nên có thể tiến hành nhiều thay đổi đồng thời trên một repository giúp giải quyết nhiều nhiệm vụ cùng lúc.
    Khi bạn tạo một repository thì Git sẽ thiết lập branch mặc định là master, nghĩa là nó sẽ tự tạo một branch master và mọi hoạt động của ban lúc này đều nằm trên branch master.

2. Làm thế nào để xóa một branch ở phía local, làm thế nào để xoá một branch remote

Nếu bạn muốn xóa một nhánh, đầu tiên cần checkout sang nhánh khác cần xóa.

  • Xóa branch ở phía local:
     $ git branch -d <name_branch> 
    
    Đây là cách xóa an toàn, nếu branch cần xóa đã được merge vào một branch nào đó, hoặc khi tạo pull request vào một Romote Repository khác và đã được merge, thì có thể xóa branch bằng cách này. Nếu chưa được merge thì sẽ hiện thông báo lỗi là chưa được merge vào branch nào.
    $ git branch -D <name_branch>
    
    Đây là hard delete, sẽ xóa branch bất chấp branch đã được merge hay chưa.
  • Xóa branch ở phía reomote:
    $ git push --delete <name_remote> <name_branch>
    
    hoặc
    $ git push <ten_remote> --delete <ten_branch>
    

3. Làm thế nào để push một branch ở local lên remote dưới một cái tên khác

Bình thường việc push một branch ở local lên remote branch được thực hiện bằng cách: $ git push <remote_name> <branch_name>. Nhưng có một số lý do mà muốn push branch với một tên khác thì ta làm như sau:

 $ git push <remote_name> <local_branch_name>:<remote_branch_name>

4. Thế nào là rebase? Phân biệt rebase với merge?

  • Git rebase là gì ?

    Git rebase là tích hợp các thay đổi từ nhánh này vào nhánh khác. Trong git có 2 cách để thực hiện công việc này, đó là git rebasegit merge. Chúng ta cùng phân tích để tìm hiểu rõ hơn về sự khác nhau giữa 2 cách này.

  • Phân biệt rebase và merge .

    • Git rebase
      Trước tiên bạn chuyển sang branch đang làm việc

      $ git checkout <working_branch>
      

      Thực hiện tích hợp branch <rebase_branch> vào branch trên.

      $ git rebase <rebase_branch>
      
      • Nó thực hiện bằng cách đi tới commit cha chung của hai nhánh (nhánh bạn đang làm việc <working_branch> và nhánh đang muốn rebase <rebase_branch>), tìm sự khác biệt trong mỗi commit của nhánh mà bạn đang làm việc, lưu lại các thay đổi đó vào một tập tin tạm thời, khôi phục lại nhánh hiện tại về cùng một commit với nhánh bạn đang rebase, và cuối cùng áp dụng lần lượt các thay đổi.
    • Git merge

      $ git checkout <working_branch>
      $ git merge <merge_branch>
      
      • Git dùng 2 bản commit cuối cùng của từng nhánh rồi tích hợp lại với nhau tạo thành 1 commit mới theo kiểu hình thoi. Thực hiện 'merge' thì các commit đã tồn tại không bị thay đổi, chỉ tạo ra 1 commit mới tích hợp của 2 commit mới nhất.
      • Đặc điểm: các commit của 2 nhánh được sắp xếp theo thời gian tạo commit.
  • Với những dự án mà member đã quen với Git và muốn lưu giữ lại tất cả những record thì rebase là tốt hơn . Nếu có member dự án không nằm trong công ty thì do trao đổi với nhau sẽ rất khó nên rebase sẽ phát huy lợi thế trong lúc này
  • Với những dự án nào member chưa quen dùng Git thì tất nhiên merge là 1 sự lựa chọn sáng suốt . Tuy nhiên sẽ phải bù lại phần git commit ko được lưu lại bằng mail hoặc chat nội bộ.

5. Thế nào là git fetch? Phân biệt fetch với pull

  • Git fetch Câu lệnh mà chúng ta thường dùng với git fetch đó là git fetch origin. Sử dụng cậu lệnh này, ta có thể cập nhật thông tin mới nhất từ Git remote repository. Nhưng thông tin ở đây không có nghĩa là toàn bộ data từ Git remote repository, nó chỉ là thông tin metadata ví dụ như Git remote repository của chúng ta có những branch nào, có những thay đổi nào từ Git remote repository mà chúng ta chưa cập nhật về Git local repository hay không? Nó chỉ cập nhật những thông tin đó, chứ không làm thay đổi, đồng bộ Git local repository với Git remote repository.
  • Git pull
        git pull origin master 
        = git fetch origin + git merge origin/master
    
    Lệnh git pull trước tiên chạy git fetch để tải nội dung từ remote repository sao cho phù hợp với nội dung đó. Lệnh git pull là sự kết hợp của hai lệnh git fetch và git merge. Trong giai đoạn đầut tiên của hoạt động, git pull sẽ thực thi một git fetch nằm trong phạm vi nhánh cục bộ mà HEAD được chỉ vào. Khi nội dung được tải xuống, git pull sẽ nhập workflow hợp nhất. Một cam kết hợp nhất mới sẽ được tạo và HEAD được cập nhật để trỏ đến commit mới.

6. Thế nào là git stash?

Hãy tưởng tượng rằng bạn đang làm việc trên một tính năng ở trong một dự án phần mềm được quản lý bởi Git. Bạn đang ở ngay giữa chừng trong việc tạo ra một số thay đổi thì bạn nhận được một yêu cầu khắc phục một lỗi nghiêm trọng. Để bắt đầu giải quyết vấn đề, bạn cần một branch mới và một thư mục rỗng. Tuy nhiên, để chuyển sang nhánh mới bạn cần commit những phần dang dở ở trên, điều này có thể tạo ra một commit thừa. Trong trường hợp này, bạn nên nghĩ tới git stash, nó sẽ lưu lại trạng thái chưa được commit, và bạn có thể thoải mái chuyển sang branch khác để làm việc

  • Xem lại lịch sử thay đổi: $ git stash list
  • Xem lại lịch sử thay đổi cùng nội dung của nó: $ git stash list -p
  • Xem lại lịch sử thay đổi: $ git stash show stash@{<index>}
  • Xóa thay đổi: $ git stash drop stash@{<index>}
  • Xóa toàn bộ: `$ git stash clear'
  • Apply stash: $ git stash apply stash@{<index>}

7. Làm thế nào xóa bỏ trạng thái của một vài commit gần đây.

Có 2 cách để thực hiện công việc này:

  • Cách 1: Sử dụng git revert
    $ git revert <commit_id>
    

Lệnh này tạo commit đảo ngược với commit có commit_id đã chọn, commit chỉ định bị xóa bỏ, các commit mới hơn vẫn được giữ nguyên.

  • Cách 2: Sử dụng git reset --hard
    $ git rebase -i HEAD<commit_id>
    
    Lệnh này sẽ xóa toàn bộ các commit trước đó và đưa branch về trạng thái commit có commit_id đã chọn.

8. Gộp một vài commit thành một commit duy nhất.

Để gộp một nhóm commit thành 1 commit duy nhất ta dùng lệnh:
$ git rebase --interactive <commit_end>
hoặc
$ git reset <commit_end>
Trong đó <commit_end> là id của commit cuối cùng trong nhóm cần gộp.
Trong text editor, pick|squash|fixup các commit các commit cần gộp lại sau đó save file và thoát.

9. Phân biệt git reset, git reset --hard, git reset --soft

git reset

$ git reset <commit_id>

Reset trạng thái file của commit, file không thay đổi, con trỏ về vị trí commit_id

git reset --hard

$ git reset --hard <commit_id>

Reset trạng thái file của commit, file thay đổi về thời thời điểm commit, con trỏ về vị trí commit

git reset --soft

$ git reset --soft <commit_id>

Không reset trạng thái file của commit, file không thay đổi, con trỏ về vị trí commit

10. Thế nào là cherry-pick? Khi nào thì dùng cherry-pick?

  • Cherry-pick là một cách checkout một commit tại branch nhất định về branch hiện tại.
  • Cú pháp:
    $ git checkout $my_branch
    $ git cherry-pick $git_revision
    
  • Trong ảnh dưới, chúng ta sẽ cherry-pick tư các node C D E từ branch 2 sang branch 1:

11. Git Flow

  • Khi làm việc nhóm, điều quan trọng là phải đồng nhất về quy trình làm việc. Git cho phép bạn thực hiện bằng nhiều con đường, nhiều cách khác nhau.Tuy nhiên, nếu bạn không đồng nhất quy trình làm việc chung trong nhóm của bạn, sự nhầm lẫn là không thể tránh khỏi.

  • Git Flow là gì ?

    • git-flow cung cấp các lệnh thứ tự cho người dùng. Mỗi lệnh thực hiện nhiều tác vụ tự động và theo một thứ tự xác định trước. Qua các lệnh này, ta sẽ hình thành nên quy trình làm việc.
    • git-flow không phải là git, cũng không có nghĩa có thể thay thế cho Git. Nó là 1 tập hợp các kịch bản kết hợp với các lệnh Git tiêu chuẩn một cách thông minh.
    • Nói 1 cách rõ ràng, bạn không phải sử dụng các tập lệnh git để sử dụng quy trình của git-flow. Bạn có thể dễ dàng tìm hiểu quy trình làm việc riêng lẻ - và đơn giản thực hiện các lệnh này một mình. Tuy vậy, các đoạn mã lệnh theo git-flow giúp bạn tránh khỏi phải ghi nhớ tất cả những điều này, giúp cho việc đơn giản hóa quá trình làm việc chuẩn.

Kết luận

Nếu bạn muốn biết thông tin chi tiết, các bạn có thể tham khảo các link bên dưới:
Learn Git Branching
How to Use Git and GitHub
Và cuối cùng không thể thiếu là trang chủ của Git rồi😀 Git


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí