Git Confession

Quy ước sử dụng git



Sau khi đi làm ở môi trường làm việc nhóm thì mình có học được vài thứ hay ho về Git. Lưu lại đây để có thể lưu lại có khi cần dùng đến.

1. Branch cố định

Mỗi dự án có 3 branch cố định như sau:

Stt Branch Description
1MasterLà 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.
2StagingBranch 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.
3ProductionBranch 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 IDUser Story ID hoặc Issue ID.

  • Tên branch: Viết thường, không dấu, là tên tóm tắt của TaskUser storyissue, 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:

seedling Master:

  • 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 requestdeploy 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.

seedling Staging:

  • 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>

seedling Production:

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 bugupdate 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:

  1. Separate subject from body with a blank line - Tách chủ đề khỏi nội dung bằng một dòng trống.
  2. Limit the subject line to 50 characters - Giới hạn dòng chủ đề trong 50 ký tự.
  3. Capitalize the subject line - Viết hoa dòng chủ đề.
  4. Do not end the subject line with a - Không kết thúc dòng chủ đề bằng dấu chấm.
  5. Use the imperative mood in the subject line - Sử dụng câu lệnh lệnh trong dòng chủ đề.
  6. 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.
  7. 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.

bulb 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 #.

bulb Ví dụ:

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.

jack_o_lantern 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

jack_o_lantern 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 branchtags và commits.
2BranchCá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
3CommitMộ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.
4CheckoutSử 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
5FetchLệ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.
6ForkFork 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
7HeadCá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.
8IndexBấ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.
9MasterMaster 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.
10MergeSử dụng lệnh git merge để thêm các thay đổi từ nhánh này sang nhánh khác.
11PullLệnh git pull được sử dụng để thêm các thay đổi vào nhánh chính.
11PushLệ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.
12RebaseLệ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.
13StashLệ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.
14TagsTags 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

jack_o_lantern 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.

jack_o_lantern Cách 2: Muốn bỏ hoàn toàn một commit sai, dùng git reset

git reset --hard HEAD^

wave 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.

wave --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.

wave --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

jack_o_lantern  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

bulb Ví dụ:

# 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




Tag:
Git Confession Reviewed by Finn on March 25, 2021 Rating: 5

No comments:

Copyright © 0xpan's Blog 2018
Online:
Development by Nguyễn Nam Hồng + Finn