Một số định nghĩa thường gặp khi sử dụng Git.
Bài đăng này đã không được cập nhật trong 6 năm
Mục lục
- Thế nào là
repository
,branch
. - Làm thế nào để xoá một
branch
ở phíalocal
, làm thế nào để xoá mộtbranch 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ênbranch
là task#1, và muốn push lênbranch
task#2 ởremote
). - Thế nào là
git rebase
. Phân biệtrebase
vớimerge
. - Thế nào là
git fetch
. Phân biệtfetch
vớipull
. - 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ộtcommit
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ùngcherry-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 rabranch
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ệncheckout
quabranch
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.
Đế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)
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 branch
vàlocal 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).
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