Git Confession
Quy ước sử dụng git
1. Branch cố định
Mỗi dự án có 3 branch cố định như sau:
Stt | Branch | Description |
---|---|---|
1 | Master | Là branch phát triển chung của team. Các dev sẽ checkout dev branch từ nhánh này. Các tester sẽ thực hiện việc test trên nhánh này. |
2 | Staging | Branch trung gian có code gần giống với bản production nhất, nơi để tester và khách hàng test trước khi đẩy code vào bản production. |
3 | Production | Branch cho bản production( bản golive chính thức cho khách hàng sử dụng). |
2. Branch feature
Là branch chức năng tạo ra để thực hiện task
. Được checkout từ nhánh master
. Dev thực hiện việc coding và unit test
tại nhánh này trước khi pull request
lên nhánh master
.
Sau khi hoàn thành task thì có thể remove nhánh này đi.
Quy ước đặt tên: {mã-định-danh} - {tên-branch-phân-cách-bằng-dấu-gạch-ngang}
Trong đó:
Mã định danh: Viết thường, có thể là
Task ID
,User Story ID
hoặcIssue ID
.Tên branch: Viết thường, không dấu, là tên tóm tắt của
Task
,User story
,issue
, nên viết bằng tiếng anh.
3. Thao tác trong quá trình thực hiện task
- Checkout branch feature từ branch master
git checkout master # Chuyển branch hiện tại sang branch master
git pull origin master # Update code mới nhất từ branch master ở server về local
git checkout -b {tên-branch} # Checkout branch feature mới từ
master và chuyển tới branch vừa tạo.
- Sau khi thực hiện xong
git status # Kiểm tra các file thay đổi so với ban đầu.
git add {tên-file }| git add . # Để add file, nếu add toàn bộ thì thêm dấu.
git commit -m "Nội dung commit" # Nội dung commit theo quy ước commit mesage.
git push origin {tên-branch} # để đẩy code từ nhánh local lên remote.
# Tạo merge request chờ team leader review và murge sang nhánh master.
4. Deployment actions
Tùy theo từng dự án cụ thể mà quy trình sẽ khác nhau, nhưng nên tuân thủ các rule sau:
- Dev checkout code từ nhánh
master
để thực hiện task. - Sau khi thực hiện xong thực hiện gộp commit và push lên nhánh feature ở remote và
merge request
. - Team lead sẽ review code và accept
pull request
,deploy
và thông báo cho developer upgrade module và kiểm tra tính năng đã được deploy thành công chưa. - Developer thông báo cho tester để test tính năng.
- Tùy theo từng sprint cụ thể, team sẽ chốt nhưng tính năng được
release
. - Team lead merge những feature branch tương ứng với các ticket sang branch staging.
git checkout staging
git pull
git merge <feature-branch>
Team lead tạo 1 branch production được fork từ branch staging
git checkout staging
git pull
git checkout -b production-<new_version_number>
git push origin production-<new_version_number>
5. Quy ước commit message
- Mỗi task, mỗi merge rquest nên chỉ có 1 commit để dễ review, dễ trace, dễ revert.
- Nội dung commit phải có ý nghĩa, tránh commit chung chung như :
Fix bug
,update code
... - Khuyến khích viết bằng tiếng anh.
- Nội dung bắt buộc có mã issue.
Trường hợp commit message ngắn gọn (<50 ký tự).
git commit -m "Nội dung message" # Chữ cái đầu của nội
dung message viết hoa đúng chính tả
Trường hợp commit mesage dài
git commit # Dùng trình editor để viết nội dung commit
message( thường là vi).
Tóm tắt, có 7 quy tắc sau:
- Separate subject from body with a blank line - Tách chủ đề khỏi nội dung bằng một dòng trống.
- Limit the subject line to 50 characters - Giới hạn dòng chủ đề trong 50 ký tự.
- Capitalize the subject line - Viết hoa dòng chủ đề.
- Do not end the subject line with a - Không kết thúc dòng chủ đề bằng dấu chấm.
- Use the imperative mood in the subject line - Sử dụng câu lệnh lệnh trong dòng chủ đề.
- Wrap the body at 72 characters - Phần nội dung mỗi cụm nên chỉ có 72 ký tự và cách nhau bằng 1 dòng trống.
- Use the body to explain what and why vs. how - Sử dụng phần thân để giải thích cái gì và tại sao so với như thế nào.

Ví dụ:

Summarize changes in around 50 characters or less
More detailed explanatory text, if necessary. Wrap it to about 72
characters or so. In some contexts, the first line is treated as the
subject of the commit and the rest of the text as the body. The
blank line separating the summary from the body is critical (unless
you omit the body entirely); various tools like `log`, `shortlog`
and `rebase` can get confused if you run the two together.
Explain the problem that this commit is solving. Focus on why you
are making this change as opposed to how (the code explains that).
Are there side effects or other unintuitive consequences of this
change? Here's the place to explain them.
Further paragraphs come after blank lines.
- Bullet points are okay, too
- Typically a hyphen or asterisk is used for the bullet, preceded
by a single space, with blank lines in between, but conventions
vary here
If you use an issue tracker, put references to them at the bottom,
like this:
Resolves: #123
See also: #456, #789
6. Mã issue
Nội dung commit message bắt bụôc có từ khóa
+ Mã issue.
Trong đó:
- Từ khóa: chỉ quan hệ giữa
commit
vàissue,
có thể là những từ khóa sau:- Resolves: Commit sẽ resolves issue.
- Closes: Commit sẽ close issue.
- Relates: Commit có liên quan đến issue.
- Mã issue: mã issue gitlab hoặc redmine, jira... bắt đầu bằng dấu #.
git commit -m "Fix bug user cannot login. Resolves #35"
git commit -m "Admin can block user. Resolves #35, #36"
Cho trường hợp commit mesage dài:
git commit
Fix bug user cannot login
Causes: config wrong guard
Solution: config guard using model users
Resolves #35
Relates #37
7. Gộp commit
Trước khi thực hiện việc merge request
cần phải gộp thành 1 commit trước khi kết thúc task.
Cách 1: Reset + Commit
Tại branch feature
git log --oneline -10 #Xem 10 commit gần nhất, xem có bao nhiêu commit tạm.
# Giả sử có 3 commit tạm.
git reset HEAD~3 # Reset 3 commit gần đây, các file đã thay đổi trong 3
commit gần đây nhất được giữ nguyên và chuyển về trạng thái unstage
git add # Add các file cần commit
git commit # Theo quy ước commit message. Nhập và message commit hoàn thành.
git log --oneline -10 # Xem 10 commit gần nhất, dùng để kiểm tra lại việc gộp commit
git push -f origin {tên-branch} # Force push lên branch feature remote
Cách 2: rebase commit
Đầu tiên bạn xem các commit bằng git log
git log --oneline
#Kết quả
22cd1f4 Make grunt task clear
778e7be Edit jst grunts config
4b0db4a Update grunt task, jst per line
6349fc3 Update model, need to do is user can delete there own comments
0aa5434 Fix Sumo code duplicate
134a970 Merge branch feedback-member
3a8544a Facebook login, draft version
....
Nếu bạn muốn gộp 2 commit 22cd1f4
và 778e7be
thành một. Ta có lệnh:
git rebase -i HEAD~2
# Nếu N commit thì đổi thành git rebase -i HEAD~N
#Kết quả
pick 778e7be Edit jst grunts config
pick 22cd1f4 Make grunt task clear @$
# Rebase 4b0db4a..22cd1f4 onto 4b0db4a
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Dòng thứ 2, bạn thay từ pick thành f
để xóa commit đó.
Nếu như bạn chọn là s
thì sẽ hiện ra 1 trình soạn thảo nữa để sửa nội dung commit, (Thêm dấu #
phía trước để xóa nhanh)
Lưu lại và push trở lên server. Nhớ thêm -f để git ghi đè lên các commit cũ trên server.
git log --oneline # Kiểm tra lại commit sau khi gộp.
git push origin user-system -f
Thuật ngữ trong Git
Stt | Terms | Description |
---|---|---|
1 | Repository |
là kho lưu trữ chứa tất cả các tệp dự án của bạn bao gồm các branch , tags và commits . |
2 | Branch | Các Branch đại diện cho các phiên bản cụ thể của một kho lưu trữ(repository) chương trình chính của bạn. Branch cho phép bạn theo dõi các thay đổi bạn thực hiện đối với kho lưu trữ và hoàn tác về các phiên bản cũ hơn |
3 | Commit | Một commit đại diện cho một điểm cụ thể trong lịch sử dự án của bạn. Sử dụng lệnh commit kết hợp với lệnh git add để cho git biết những thay đổi bạn muốn lưu vào kho lưu trữ cục bộ. Và hành động này không được tự động gửi đến máy chủ từ xa. |
4 | Checkout | Sử dụng lệnh git checkout để chuyển giữa các branch. Chỉ cần nhập git checkout theo sau là tên của branch bạn muốn chuyển đến. Hãy nhớ các commit của bạn khi bạn chuyển đổi giữa các branch |
5 | Fetch | Lệnh git fetch sao chép và tải xuống tất cả các tệp của nhánh vào thiết bị của bạn. Sử dụng nó để lưu các thay đổi mới nhất vào kho của bạn. Nó có thể fetch nhiều nhánh cùng một lúc. |
6 | Fork | Fork là một bản copy của kho lưu trữ chính dự án của bạn. Những thay đổi của bản trên bản Fork sẽ không ảnh hưởng đến dự án chính của bạn |
7 | Head | Các commit ở đầu của một nhánh được gọi là HEAD. Nó đại diện cho commit mới nhất của kho lưu trữ mà bạn hiện đang làm việc. |
8 | Index | Bất cứ khi nào bạn thêm, xóa hoặc thay đổi một tập tin, nó vẫn nằm trong index cho đến khi bạn sẵn sàng commit các thay đổi. Nó như khu vực tổ chức cho Git. Sử dụng lệnh git status để xem nội dung của index của bạn. Những thay đổi được tô sáng bằng màu xanh lá cây đã sẵn sàng để được commit trong khi những thay đổi màu đỏ vẫn cần được thêm vào staging. |
9 | Master | Master là nhánh chính của tất cả các kho lưu trữ của bạn. Nó nên bao gồm những thay đổi và commit gần đây nhất. |
10 | Merge | Sử dụng lệnh git merge để thêm các thay đổi từ nhánh này sang nhánh khác. |
11 | Pull | Lệnh git pull được sử dụng để thêm các thay đổi vào nhánh chính. |
11 | Push | Lệnh git push được sử dụng để cập nhật các nhánh từ xa với những thay đổi mới nhất mà bạn đã commit. |
12 | Rebase | Lệnh git rebase cho phép bạn tách, di chuyển hoặc thoát khỏi các commit. Nó cũng có thể được sử dụng để kết hợp hai nhánh khác nhau. |
13 | Stash | Lệnh git stash sẽ loại bỏ các thay đổi khỏi index của bạn và xóa stash chúng sau đó. Nó có ích nếu bạn muốn tạm dừng những gì bạn đang làm và làm việc khác trong một thời gian. Bạn có thể đặt stash nhiều hơn một bộ thay đổi cùng một lúc. |
14 | Tags | Tags cung cấp một cách để theo dõi các commit quan trọng. |
Các lệnh git
1. Tạo branch mới
# Tạo repository local
git init
# Copy remote repo tới local
git clone REPOSITORY_PATH
# Tạo branch mới
git checkout -b BRANCH_NAME
2. Xóa branch
# Xóa branch đã tồn tại
git branch -d BRANCH_NAME
# Xóa branch có commit nhưng chưa được merge
git branch -D BRANCH_NAME
3. Lỡ xóa mất commit quan trọng
# Đầu tiên là xem lại toàn bộ lịch sử commit
$ git reflog
# Từ đó chọn commit muốn phục hồi và khôi phục lại
$ git reset --hard <commit>
4. Lỡ xóa mất branch
# Đầu tiên là xem lại toàn bộ lịch sử commit
$ git reflog
# Từ các commit này, chọn rồi tạo branch mới
$ git branch <tên branch> <commit ID>
# ví dụ: git branch new-branch abc123f
5. Lỡ tay commit và muốn xóa commit
# 1. Chỉ đưa HEAD về như cũ
$ git reset --soft HEAD~
# 2. Đưa HEAD và index về như cũ
$ git reset HEAD~
# 3. Đưa cả index, working tree về 1 commit trước đó
$ git reset --hard HEAD~
# 4. Xóa luôn commit, về lại trước đó
$ git revert <commit>
6. Commit nhầm sang một branch khác
# Đầu tiên là tạo một branch khác chứa trạng thái mà ta đã commit
$ git branch <other branch>
# Đưa HEAD, index của master về 1 commit trước đó
$ git reset --hard HEAD~
#Hoặc đưa index của branch về commit cụ thể dựa vào ID commit
(có thể xem log để biết được ID)
$ git reset --hard <ID commit>
# Check out sang branch có commit trước đó
$ git checkout <other branch>
7. Đã merge nhưng muốn trở lại như trước
# tiến hành merge
$ git checkout <tên branch nguồn>
$ git merge <tên branch muốn merge>
# Sau khi merge, nhưng lại muốn trở lại như trước thì làm như sau
$ git reset --hard ORIG_HEAD
8. Khi pull từ remote về thì có quá nhiều conflict nên tạm thời muốn trở lại như cũ
# Lấy từ code mới remote
$ git pull origin master
# Phát sinh conflict
# Suy nghĩ lại thì trong pull(fetch + merge) muốn bỏ phần merge đi
$ git reset --hard ORIG_HEAD
9. Khi muốn xoá hoàn toàn các file không cần thiết
# Đầu tiên là add & commit tất cả những thứ cần thiết lại
# Nếu không làm như thế này thì những file này cũng bị xoá mất đó
$ git add <file cần commit>
$ git commit -m "commit message"
# Dùng git stash để sơ tán cả những file untracked
$ git stash -u
#or
git stash save --include-untracked
# drop các thứ đã stash để xoá đi
$ git stash drop
10. Xử lí conflict trong quá trình rebase
# Khi đang ở branch1 rồi rebase từ branch2 vào
$ git rebase branch2
~~ Phát sinh conflict ~~
# Sẽ trở thành branch không tên nền cần phải chú ý
$ git branch
* (no branch, rebasing branch2)
branch1
branch2
master
# Hãy cố gắng giải quyết các conflict
# Sau khi hoàn thành, ta add rồi tiến hành rebase
$ git add <tên file>
# Thay đổi commit
$ git commit --amend
$ git rebase --continue
11. Đang làm dở dang và chuyển branch khác
# Tạm thời lưu lại các phần công việc còn đang làm dở
$ git stash
#Hoặc
$ git stash -u
# Chuyển sang một branch khác và làm việc
$ git checkout -b <other branch>
# làm gì đó mà các bạn muốn ở nhánh này
$ git add <các file cần thiết>
$ git commit -m <Nội dung commit>
# Trở về branch cũ
$ git checkout <branch name>
# Lấy lại các nội dung công việc đang làm dở trước đó
$ git stash pop
#Trường hợp stash nhiều lần thì kiểm tra log stash rồi lấy ra stash
mong muốn theo id:
$ git stash list
$ git stash pop <stash ID>
12. Git stash nâng cao
Trong một số trường hợp dev có thể code nhầm nhánh, hoặc cần lưu lại code để chuyển sang nhánh phát triển khác hoặc lưu lại code của nhánh hiện tại và chuyển sang code nhánh khác.
Một số tính năng của git hash
- git stash save Câu lệnh này tương đương với
git stash
nhưng bạn có thể thêm nhiều tùy chọn đi cùng nó.
git stash save "Your stash mesage"
Câu lệnh này sẽ đưa các file trong thư mục làm việc của bạn về commit gần nhất và đưa nhưng thay đổi hiện tại vào stash.
- Stashing untracked files
Bạn cũng có thể stash(đưa thư mục làm việc về trạng thái ban đầu) với untracked files, nhưng file được tạo mới, chưa được add.
git stash save -u
#or
git stash save --include-untracked
Ví dụ khi bạn thay đổi code so với commit cuối cùng, tuy nhiên sau đó muốn xóa bỏ hết nhưng dòng code mới tạo và đưa code của mình về commit gần nhất.
Chúng ta có thể sử dụng git checkout
, tuy nhiên câu lệnh này lại không có tác dụng đối với nhưng file được tạo mới(untracked file
), do đó sử dụng git stash save -u
cho thấy dự tiện dụng.
- Git stash list
git stash list
Trước khi nói về câu lệnh này, chúng ta hãy nhìn cách mà stash hoạt động. Khi bạn chạy lệnh git stash
hoặc git stash save
Git sẽ tạo mới một commit object
với một tên nào đó và lưu lại trong repo
của bạn, các commit object này sẽ được lưu trữ dưới dạng stack, đó là một thùng có đáy và thằng nào được lưu lại trước sẽ gần với đáy thùng hơn.
Điều đó có nghĩa là bạn cũng sẽ cem được danh sách các commit đó giống như việc bạn xem log các commit thông thường vậy.
- Git stash apply | Lấy lại thay đổi đã stash
Lấy lại nhưng thay đổi gần nhất mà mình đã đưa vào stash mặc định sẽ là stash@{0}
. Nếu bạn muốn lấy lại thay đổi từ một stash khác bạn có thể sử dụng stash id
.
git stash apply stash@{id}
- Git stash pop
Câu lệnh này tương tự stash apply
nhưng nó xóa stash khỏi list stask sau khi được apply các thay đổi.
git stash pop stash@{1}
- Git stash show - Nội dung thay đổi
git stash show stash@{id}
#Hoặc nếu muốn xem toàn bộ
git stash show -p
- Git stash branch
Tạo một branch mới với stash mới nhất và sau đó xóa stash mới nhất khỏi stask. Nó sẽ rất hữu ích nếu bạn bị conflict code sau khi applied stash vào version code mới nhất trên branch hiện tại.
git stash branch <name> stash@{id}
- Git stash clear
xóa toàn bộ stash đã được lưu
- Git stash drop
Xóa stash mới nhất khỏi stash
git stash drop stash@{1}
13. Phân biệt git fetch với pull
Khi muốn cập nhật những thay đổi từ trên remote server ta cũng có 2 cách để thực hiện điều này
$ git pull <tên remote> <tên remote-branch>
Lệnh này sẽ tiến hành kéo các thay đổi từ trên remote server về local đồng thời merge các thay đổi đó ngay
$ git fetch <tên remote> <tên remote-branch>
Lệnh này sẽ tiến hành kéo các thay đổi từ trên remote server về nhưng không merge ngay mà thực hiện việc này sau khi đã review lại các thay đổi trước khi tiến hành merge.
Có thể hiểu đơn giản là:
git pull = git fetch + git merge
14. Sửa commit
Cách 1: Muốn thêm những thay đổi nhỏ không đáng kể và tránh bị lắt nhắt, dùng
git commit --amend
# Sửa mesage commit
git commit --amend
# Sửa commit mesage
git commit --amend -m "Commit message mới"
#Thêm file và không sửa commit
git add file6
git commit --amend --no-edit #--no-edit nghĩa là không thay đổi commit
message.
Cách 2: Muốn bỏ hoàn toàn một commit sai, dùng
git reset
git reset --hard HEAD^
HEAD^
có ý nghĩa giống với HEAD~
hay @^
, nghĩa là quay về trước 1 commit. Muốn quay về trước n commit, VD 5 commit thì có thể thay bằng HEAD~5
.
--hard
có nghĩa là bỏ commit đi và bỏ cả những thay đổi chưa được commit trong working space. Khi này môi trường sẽ hoàn toàn "sạch sẽ" như thời điểm trước khi commit.
--soft
có nghĩa là bỏ commit đi nhưng giữ nguyên những thay đổi chưa được commit trong working space. --soft
hữu dụng khi bạn muốn giữ lại những thay đổi chưa commit cho lần commit tiếp theo
Cách 3: Muốn undo một merge commit và để lại lịch sử, dùng
git revert
# `git revert` có thể tạo một commmit với với nội dung đảo ngược lại một
commit cũ. Giả sử commit cũ có hash là (commit_hash) thì câu lệnh sẽ là
git revert (commit_hash)
# Git revert hay được sử dụng để đảo ngược một merge commit. Nếu sau khi
git revert bạn lại muốn quay lại trạng thái trước khi đảo ngược thì sao?
Câu trả lời là git revert lại chính revert commit vừa mới tạo.
15. Sử dụng eamil khác khi commit
git config user.email "email của bạn"
# Hoặc trường hợp bạn đã commit mà quên thay đổi email
git commit --amend --author "AuthorName <Author Email>"
16. Xóa nhanh nhiều branch
for /F "delims=" %l in ('git branch') do (git branch -D %l)
17. Phân biệt git reset, git reset --hard, git reset --soft
Trong git, có 3 nơi ta cần nhớ:
- Working directory: Chính là project bạn đang code
- Staging area: Chính là nơi lưu trữ các thay đổi trước khi commit. Khi bạn gõ
git add
thì các thay đổi sẽ được lưu tại đây. - Repository: chính là project khi đã commit. Khi bạn gõ git commit thì các thay đổi sẽ được lưu tại đây.
$ git reset <commit_id>
# Lệnh này sẽ di chuyển con trỏ HEAD về commit có commit_id
#và giữ lại trạng thái thay đổi của file và loại bỏ file ra khỏi stage
$ git reset --hard <commit_id>
# Lệnh này chuyển con trỏ HEAD về commit có commit_id và
#loại bỏ hoàn toàn các thay đổi của file cũng như thay đổi trong stage
$ git reset --soft <commit_id>
# Lệnh này sẽ chuyển con trỏ về commit có commit_id
#và giữ lại các thay đổi của file và trạng thái của stage
# A - B - C (HEAD -> master)
git reset --soft B
#Sẽ đưa HEAD về vị trí commit B, giữ nguyên các thay đổi đã được git add
tại B trong Staging Area.
#Tương ứng với tại B ta vừa git add xong, khi này chỉ việc git commit là
ta lại có commit như C bên trên.
git reset B
#Sẽ đưa HEAD về vị trí commit B, đồng thời đưa các thay đổi về Working
directory.
#Tương ứng với tại B ta vừa cột xong, chưa git add.
git reset --hard B
#Sẽ đưa HEAD về vị trí commit B, đồng thời loại bỏ tất cả các thay đổi
tại B.
#Tương ứng với tại B ta chưa cột gì cả, xong phim.
18. Sự khác nhau giữa merge
và rebase
Cả hai lệnh rebase
và merge
đều dùng để giải quyết cùng một vấn đề: tích hợp những thay đổi từ một nhánh vào một nhánh khác. Tuy nhiên chúng thực hiện điều này theo những cách rất khác nhau.
Merge
git checkout feature
git merge master
#Hoặc có thể dùng
git merge master feature
Câu lệnh trên sẽ tạo ra một merge commit mới trên branch Feature bao gồm lịch sử của cả 2 branch.
Ưu điêm: Merging không làm thay đổi hệ thống. Những nhánh đang tồn tại sẽ không bị ảnh hưởng gì cả.
Nhược điểm: Branch Feature sẽ có thêm 1 commit merge mỗi lần bạn cần tích hợp những thay đổi từ các nhánh khác vào nó.
Nếu branch master liên tục bị thay đổi thì lịch sử commit của branch Feature sẽ rất khó nhìn. Nó sẽ gây rất nhiều khó khăn trong việc xem lại lịch sử commit của dự án.
Rebase
git checkout feature
git rebase master
Câu lệnh trên sẽ bê toàn bộ branch feature lên đầu của branch master.
Nhưng thay vì dùng một commit merge, nó sẽ viết lại lịch sử của project bằng cách tạo các commit hoàn toàn mới cho mỗi commit ở nhánh ban đầu.
Lợi ích chính của việc rebasing này là lịch sử project sẽ gọn gàng & sạch sẽ hơn.
Đầu tiên, nó sẽ loại bỏ những commit merge không cần thiết mà được sinh ra bởi git merge.
Sau đó, như bạn đã thấy trên biểu đồ phía trên, rebasing sẽ tạo ra một đường thẳng commit trong lịch sử commit
Interactive Rebasing
Interactive rebasing cho bạn cơ hội để thay đổi những commit khi mà chúng được chuyển đến nhánh mới. Điều này thậm chí còn mạnh hơn cả một automated rebase vì nó cho phép điều khiển hoàn toàn lịch sử commit của nhánh đó.
Điển hình là việc sử dụng để xóa 1 commit trước khi merge nó vào master Để bắt đầu một Interactive rebasing, ta truyển option i
vào trong câu lệnh rebase
git checkout feature
git rebase -i master
Một danh sách các commit sẽ được hiển thị ra, những commit mà sẽ được move sang master
pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
Danh sách này hiển thị chính xác nhánh của bạn sau khi được rebase. Nếu bạn muốn xóa 1 commit nào đó,
VD: nếu như commit thứ 2 chỉ fix 1 lỗi nhỏ trong commit đầu tiên, bạn sẽ cần gộp chúng lại với nhau, hay nói cách khác là xóa cái commit thứ 2 đi
pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
Khi bạn lưu và đóng file, Git sẽ thực hiện việc rebase dựa vào những gì bạn đã chỉ định, lịch sử commit trong project của bạn sẽ giống như sau

No comments: