+8

Một số định nghĩa thường gặp khi sử dụng Git.

Mục lục


  • Thế nào là repository, branch.
  • Làm thế nào để xoá một branch ở phía local, làm thế nào để xoá một branch remote.
  • Làm thế nào để push một branch ở local lên remote dưới một cái tên khác (Ví dụ như ở local tên branch là task#1, và muốn push lên branch task#2 ở remote).
  • Thế nào là git rebase. Phân biệt rebase với merge.
  • Thế nào là git fetch. Phân biệt fetch với pull.
  • Thế nào là git stash.
  • Làm thế nào xoá bỏ trạng thái của một vài commit gần đây.
  • Làm thế nào để gộp một vài commit thành một commit duy nhất.
  • Phân biệt git reset, git reset --hard, git reset --soft.
  • Thế nào là cherry-pick, khi nào thì dùng cherry-pick.
  • Git Flow
1. Thế nào là repository, branch.

Repository được hiểu là một kho chứa mã nguồn của dự án, thư mục .git, các lịch sử thay đổi mã nguồn.

Để tiến hành 1 dự án đã tồn tại bằng GIT, bạn chỉ cần thực hiện lệnh $ git init tại thư mục dự án, hoặc nếu bạn có dự án trên remote repository thì bạn cần thực hiện clone dự án đó về máy bằng lệnh git clone [url]. Có hai repository cần phân biệt là:

  • remote repository: kho chứa từ xa được lưu trên Internet, hoặc một network nào đó.
  • local repository: kho chứa được lưu trực tiếp trên máy cá nhân.

Branch đơn giản là một con trỏ có thể di chuyển được đến 1 trong các commit.

  • Branch mặc định của git là branch master. Ngoài ra bạn có thể tạo ra branch mới bằng lệnh $ git branch <tên_branch>. Tuy nhiên lệnh này chưa chuyển sang nhánh mới luôn mà bạn phải thực hiện checkout qua branch mới bằng lệnh $ git checkout <tên_branch>
2. Làm thế nào để xoá một branch ở phía local, làm thế nào để xoá một branch remote.

Để xóa branch ở phía local:

  • Đối với các branch đã được merge vào một branch khác ta sử dụng lệnh $ git branch -d <tên_branch>

  • Để xóa branch bất kỳ cho dù đã merge hay chưa, ta dùng lệnh $ git branch -D <tên_branch>

Để xóa branch remote:

  • Ta có thể sử dụng lệnh: $ git push <tên_remote> --delete <tên_branch> hoặc $ git push --delete <tên_remote> <tên_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 (Ví dụ như ở local tên branch là task#1, và muốn push lên branch task#2 ở remote).

Để push một branch ở local lên reomte dưới một cái tên khác ta sử dụng lệnh $ git push <tên_remote> <tên_branch_local>:<tên_remote_branch>.

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

Rebase là một trong hai cách để tích hợp các thay đổi từ một nhánh này sang nhánh khác.

Cùng xem ví dụ:

$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command

Cách git rebase tích hợp nhánh bạn đang làm việc và nhánh bạn muốn rebase là đầu tiên nó đi tới commit gốc chung của cả hai nhánh, tìm sự khác biệt ở mỗi commit của nhánh mà đang làm việc, tạm thời lưu các thay đổi đó, khôi phục lại nhanh hiện tại về 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.

alt

Đến lúc này, bạn có thể quay lại nhánh master và thực hiện fast-forward merge (Xem hình dưới)

alt

Ví dụ trên cho thấy cách hoạt động của rebase khác với merge, ngoài ra rebase còn có 1 vài điểm khác so với merge:

  • Sau khi rebase các commit đã tồn tại bị bỏ đi và tái tạo lại các commit tương tự, điều này sẽ làm cho lịch sử commit ở remote branchlocal branch có sự khác biệt.
  • git rebase sẽ tạo ra lịch sử của nhánh là một đường thẳng, tạo cho ta cảm giác mọi thứ được thay đổi một cách tuần tự.
5. Thế nào là git fetch. Phân biệt fetch với pull.

Khi ta sử dụng lệnh $ git fetch, lệnh này sẽ truy cập vào remote project và kéo toàn bộ dữ liệu mà bạn chưa có từ remote project về. Sau đó bạn có thể tích hợp dữ liệu vào brach bất kỳ lúc nào.

git pull cũng sẽ kéo, truy suất toàn bộ các tham chiếu và tích hợp chúng vào remote branch.

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

Trong quá trình làm việc, chúng ta có thể rơi vào trường hợp khi đang thực hiện một công việc dang dở nhưng phải tạm dừng và chuyển qua một nhánh mới để thực hiện tiến trình khác. Nếu chúng ta chỉ muốn lưu lại các thay đổi mà chưa commit thì git stash sẽ giúp bạn.

Trong ví dụ:

$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   index.html

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   lib/simplegit.rb

Bạn đang có vài thay đổi và muốn chuyển qua branch khác, bạn chỉ cần chạy $ git stash hoặc git stash save

$ git stash
Saved working directory and index state \
  "WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")

Lúc này bạn đã có thể chuyển sang branch mới.

  • Để xem lại cách thay đổi đã được lưu lại, bạn dùng lệnh: $ git stash list
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
  • Xem lại lịch sử thay đổi cụ thể của lần 1: $ git stash show stash@{1}
  • Apply thay đổi của lần 1: $ git stash apply stash@{1}
  • Xoá thay đổi: $ git stash drop stash@{1}
  • Xoá toàn bộ: $ git stash clear
7. Làm thế nào xoá 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 <mã_hash_commit>: Lệnh này tạo commit đảo ngược commit có mã hash đã chọn, commit chỉ định bị xoá bỏ, các commit mới hơn vẫn được giữ nguyên.
  • Cách 2: Sử dụng $ git reset --hard <mã_hash_commit>: Lệnh này sẽ xoá toàn bộ các commit trước đó và đưa branch về trạng thái của commit có mã hash tương ứng.
8. Làm thế nào để gộp một vài commit thành một commit duy nhất.

Để gộp nhiều commit thành một commit duy nhất, ta sử dụng câu lệnh: $ git rebase -i HEAD~<index> với index là số commit cần gộp tính từ HEAD xuống.

9. Phân biệt git reset, git reset --hard, git reset --soft.
  • git reset : sẽ thay đổi HEAD (thay đổi mới nhất ở branch) về các commit khác.
// Lùi HEAD về 2 commit
$ git reset HEAD~2
  • git reset --hard: với option --hard, sau khi chuyển về các commit khác, các commit sau đó sẽ bị mất. Tuy nhiên có thể sử dụnggit reflog để khôi phục lại ại.
  • git reset --soft: tương tụ nó sẽ yêu cầu Git chuyển về các commit khác, nhưng trạng thái staged và tất cả sự thay đổi của file sẽ được giữ nguyên.
10. Thế nào là cherry-pick, khi nào thì dùng cherry-pick.

Cherry pick được dùng để lấy một commit từ branch này và áp những thay đổi lên trên branch khác.

Để sử dụng cherry pick, bạn git checkout qua branch cần apply commit vào và thực thi lệnh: $ git cherry-pick <mã_hash_của_commit>.

11. Git Flow

Mỗi tập tin trong Git được quản lý dự trên 3 trạng thái: committed, modified và staged.

  • Committed có nghĩa là dữ liệu đã được lưu trữ một cách an toàn trong cơ sở dữ liệu.
  • Modified có nghĩa là bạn đã thay đổi tập tin nhưng chưa commit vào cơ sở dữ liệu.
  • Staged là bạn đã đánh dấu sẽ commit phiên bản hiện tại của một tập tin đã chỉnh sửa trong lần commit sắp tới.

Điều này tạo ra ba phần riêng biệt của một dự án sử dụng Git: thư mục Git, thư mục làm việc, và khu vực tổ chức (staging area). alt

Tiến trình công việc (workflow) cơ bản của Git:

  • Bạn thay đổi các tập tin trong thư mục làm việc.
  • Bạn tổ chức các tập tin, tạo mới ảnh của các tập tin đó vào khu vực tổ chức.
  • Bạn commit, ảnh của các tập tin trong khu vực tổ chức sẽ được lưu trữ vĩnh viễn vào thư mục Git.

Kết bài

Cảm ơn bạn đã theo dõi toàn bộ nội dung bài viết. Hy vọng bài viết đã cung cấp thêm cho bạn chút kiến bổ ích về 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í