1. Lý thuyết.
git merge
và git rebase
là hai phương pháp chính để kết hợp thay đổi từ một nhánh vào một nhánh khác trong Git.
Git Merge
git merge
sẽ tạo một commit mới, gọi là commit merge, có hai cha. Commit này bao gồm tất cả các thay đổi từ cả hai nhánh đã được merge.
Ưu điểm của git merge
là nó giữ nguyên lịch sử commit của cả hai nhánh. Nhược điểm là nó có thể tạo ra lịch sử commit phức tạp nếu có nhiều nhánh và merge.
Git Rebase
git rebase
sẽ lấy tất cả các commit từ nhánh hiện tại mà bạn đang làm việc, “loại bỏ” chúng tạm thời, sau đó áp dụng chúng lên nhánh mà bạn muốn rebase.
2. Sơ đồ commit cho gộp nhánh với git merge.
Chúng ta sẽ thiết kế dự án với sơ đồ commit như dưới để thực hành.
Giả sử có hai nhánh main và beta như sau:
Để gộp các commit trong nhánh beta vào nhánh main thì chuyển làm việc trên main và thực hiện lệnh:
git merge beta
Sơ đồ và kết quả của lệnh git merge
như hình sau:
3. Thực hành với git merge.
3.1. Tạo thư mục lưu Project.
mkdir project
cd project
3.2. Tạo git repository.
shell> git init
Initialized empty Git repository in /Users/hoanghd/My Drive/git/project/.git/
3.3. Tạo các commit.
Tạo commit đầu tiên (C1).
shell> echo 'Noi dung A' > a.txt
shell> git add .
shell> git commit -m"C1"
[main (root-commit) 6c188c3] C1
1 file changed, 1 insertion(+)
create mode 100644 a.txt
Xác nhận commit C1 đã được tạo.
shell> git status
On branch main
nothing to commit, working tree clean
shell> git log --oneline
6c188c3 (HEAD -> main) C1
Tạo commit C2.
shell> echo 'Noi dung B' > b.txt
shell> git add .
shell> git commit -m"C2"
[main 3ff078b] C2
1 file changed, 1 insertion(+)
create mode 100644 b.txt
Xác nhận commit C2 đã được tạo.
shell> git status
On branch main
nothing to commit, working tree clean
shell> git log --oneline
3ff078b (HEAD -> main) C2
6c188c3 C1
Tạo commit C3.
shell> echo 'Noi dung C' > c.txt
shell> git add .
shell> git commit -m"C3"
[main 590a2df] C3
1 file changed, 1 insertion(+)
create mode 100644 c.txt
Xác nhận commit C3 đã được tạo.
shell> git status
On branch main
nothing to commit, working tree clean
shell> git log --oneline
590a2df (HEAD -> main) C3
3ff078b C2
6c188c3 C1
Tạo nhánh beta.
shell> git branch beta
shell> git branch
beta
* main
Chuyển sang nhánh beta.
shell> git switch beta
Switched to branch 'beta'
Chỉnh sửa file a.txt và thêm một commit mới tên là B1.
shell> echo -e "\nSua boi Beta" >> a.txt
shell> git status
On branch beta
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
shell> git add .
shell> git commit -m"B1"
[beta 39790e0] B1
1 file changed, 2 insertions(+)
Xác nhận commit B1 đã được tạo.
shell> git status
On branch beta
nothing to commit, working tree clean
shell> git log --oneline
39790e0 (HEAD -> beta) B1
590a2df (main) C3
3ff078b C2
6c188c3 C1
Chuyển sang nhánh main.
shell> git checkout main
Switched to branch 'main'
Trên nhánh main hãy sửa đổi nội dung file a.txt và tiến hành thêm commit mới tên D1.
echo -e "\nSua doi boi main" >> a.txt
shell> git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
shell> git add .
shell> git commit -m"D1"
[main a18ec3c] D1
1 file changed, 2 insertions(+)
Xác nhận commit D1 đã được tạo.
shell> git status
On branch main
nothing to commit, working tree clean
shell> git log --oneline
a18ec3c (HEAD -> main) D1
590a2df C3
3ff078b C2
6c188c3 C1
Tiếp tục tại nhánh main chỉnh sửa file nào đó, ví dụ file b.txt và tiến hành thêm commit mới tên D2.
shell> echo -e "\nCap nhat boi main" >> b.txt
shell> git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
shell> git add .
shell> git commit -m"D2"
[main 233bfb3] D2
1 file changed, 2 insertions(+)
Xác nhận nhánh D2 đã được tạo.
shell> git status
On branch main
nothing to commit, working tree clean
shell> git log --oneline
233bfb3 (HEAD -> main) D2
a18ec3c D1
590a2df C3
3ff078b C2
6c188c3 C1
Chuyển sang nhánh beta.
shell> git checkout beta
Switched to branch 'beta'
Tại nhánh beta chỉnh sửa file c.txt và commit thành B2.
shell> echo -e "\nCap nhat boi beta" >> c.txt
shell> git status
On branch beta
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: c.txt
no changes added to commit (use "git add" and/or "git commit -a")
shell> git add .
shell> git commit -m"B2"
[beta 7a8a19b] B2
1 file changed, 2 insertions(+)
Xác nhận commit B2 đã tạo thành công.
shell> git status
On branch beta
nothing to commit, working tree clean
shell> git log --oneline
7a8a19b (HEAD -> beta) B2
39790e0 B1
590a2df C3
3ff078b C2
6c188c3 C1
3.4. Tạo bản sao của các nhánh.
Tạo bản sao cho nhanh beta bằng cách chuyển về nhánh beta (hiện tại đang đứng tại nhánh beta nên không cần lệnh chuyển) và tạo thêm 1 nhánh mới với tên bất kỳ, ví dụ là b.
shell> git branch
* beta
main
shell> git branch b
shell> git branch
b
* beta
main
Tạo bản sao cho nhanh main bằng cách chuyển về nhánh main và tạo thêm 1 nhánh mới với tên bất kỳ, ví dụ là m.
shell> git checkout main
Switched to branch 'main'
shell> git branch m
shell> git branch
b
beta
m
* main
3.5. Gộp nhánh beta vào main sử dụng git merge.
Chạy lệnh theo quy trình dưới.
shell> git branch
b
beta
m
* main
shell> git merge beta
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
git branch
: Lệnh này liệt kê tất cả các nhánh hiện có trong repository của bạn. Nhánh đang được chọn (nhánh hiện tại) được đánh dấu bằng dấu sao (*). Trong trường hợp này, nhánh hiện tại của chúng ta là main
.
git merge beta
: Lệnh này cố gắng merge nhánh beta
vào nhánh hiện tại (main
).
Auto-merging a.txt
: Git đang cố gắng tự động merge file a.txt
từ nhánh beta
vào nhánh main
.
CONFLICT (content): Merge conflict in a.txt
: Một xung đột merge đã xảy ra trong file a.txt
. Điều này thường xảy ra khi cùng một phần của file đã được thay đổi ở cả hai nhánh.
Automatic merge failed; fix conflicts and then commit the result.
: Do xung đột, quá trình merge tự động không thành công. Bạn cần phải giải quyết xung đột (thông thường bằng cách chỉnh sửa file a.txt
), sau đó commit kết quả.
Để giải quyết xung đột, bạn có thể mở file a.txt
và tìm kiếm các dấu đánh dấu xung đột (<<<<<<<
, =======
, >>>>>>>
). Bạn cần quyết định nên giữ lại phần nào của thay đổi.
Mình sẽ chọn Accept Both Changes để lựa chọn giữ lại cả 2 bản và sau đó tiến hành commit đặt tên là M (merge).
shell> git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Changes to be committed:
modified: c.txt
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: a.txt
On branch main
:Đang ở trên nhánh main
.
You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge)
: Chúng ta đang trong quá trình merge và có một hoặc nhiều file với xung đột chưa được giải quyết. Ta cần giải quyết những xung đột này và chạy git commit
để hoàn tất quá trình merge. Nếu bạn muốn hủy quá trình merge, bạn có thể sử dụng git merge --abort
.
Changes to be committed: modified: c.txt
: File c.txt
đã được thay đổi và thay đổi này đã được stage (đã chạy git add
), sẵn sàng để commit.
Unmerged paths: (use "git add <file>..." to mark resolution) both modified: a.txt
: File a.txt
đã được thay đổi ở cả hai nhánh mà bạn đang cố gắng merge và có xung đột. Bạn cần giải quyết xung đột này (thông thường bằng cách chỉnh sửa file), sau đó chạy git add a.txt
để đánh dấu rằng xung đột đã được giải quyết.
Tại nhánh main hay tạo commit mới tên là M sao khi lựa chọn được nội dung cần merge.
shell> git add .
shell> git commit -m"M"
[main 40e072f] M
Xác minh lại commit M đã được tạo.
shell> git status
On branch main
nothing to commit, working tree clean
shell> git log --oneline
40e072f (HEAD -> main) M
7a8a19b (beta, b) B2
233bfb3 (m) D2
a18ec3c D1
39790e0 B1
590a2df C3
3ff078b C2
6c188c3 C1
Xem danh sách commit bằng tùy chọn flash graph.
shell> git log --oneline --graph
* 40e072f (HEAD -> main) M
|\
| * 7a8a19b (beta, b) B2
| * 39790e0 B1
* | 233bfb3 (m) D2
* | a18ec3c D1
|/
* 590a2df C3
* 3ff078b C2
* 6c188c3 C1
git log --oneline --graph
hiển thị lịch sử commit dưới dạng một đồ thị. Mỗi dòng biểu diễn một commit, với hash commit rút gọn, tên nhánh (nếu có), và thông điệp commit.
* 40e072f (HEAD -> main) M
: Đây là commit mới nhất trên nhánhmain
, nơi con trỏ HEAD đang trỏ đến. Thông điệp commit là “M”.| * 7a8a19b (beta, b) B2
và| * 39790e0 B1
: Đây là hai commit trên nhánhbeta
(cũng được gọi là nhánhb
). “B2” và “B1” là thông điệp commit.* | 233bfb3 (m) D2
và* | a18ec3c D1
: Đây là hai commit trên nhánhm
. “D2” và “D1” là thông điệp commit.* 590a2df C3
,* 3ff078b C2
, và* 6c188c3 C1
: Đây là ba commit đầu tiên trên nhánhmain
. “C3”, “C2”, và “C1” là thông điệp commit.
Dấu |/
và |\
biểu diễn sự tách nhánh và hợp nhánh. Trong trường hợp này, nhánh m
và beta
đã được tách ra từ main
tại commit 590a2df
, và sau đó nhánh main
đã được hợp nhánh với cả m
và beta
tại commit 40e072f
.
3.6. Gộp nhánh beta vào main sử dụng git rebase.
Lệnh git rebase
cũng gộp các commit từ nhánh này vào nhánh khác, bằng cách xây dựng lại các commit base kế thừa từ nhánh khác và viết lại lịch sử commit sau các commit cơ sở mới.
Ví dụ, để gộp nhánh beta vào main, đứng ở main thực hiện lệnh
4. Sơ đồ commit cho gộp nhánh với git merge.
Lệnh git rebase
cũng gộp các commit từ nhánh này vào nhánh khác, bằng cách xây dựng lại các commit base kế thừa từ nhánh khác và viết lại lịch sử commit sau các commit cơ sở mới.
Ví dụ, để gộp nhánh beta vào main, đứng ở main thực hiện lệnh.
git rebase beta
Như trên hình trên, trước thời điểm rebase, nhánh main có các commit cơ sở giống với nhánh beta đó là: C1, C2, C2
Lệnh git rebase
sẽ đưa toàn bộ nhánh beta làm base của main, do vậy các commit tiếp theo sau commit cơ sở ban đầu của main sẽ được nối tiếp vào, trong đó có thay đổi lại lịch sử commit, cũng sử lý xung đột giữa commit B2 và D1 để viết lại commit D1 thành D1′.
Tương tự, nếu gộp main vào beta thì sơ đồ có thể là:
5. Thực hành với git rebase.
5.1. Gộp nhánh beta vào main.
Bây giờ chúng ta sẽ xóa nhánh main và phục hồi nhánh main từ nhánh m mà chúng ta đã backup lúc đầu, làm tương tự cho nhánh beta.
shell> git branch
b
beta
m
* main
Chuyển sang nhánh m và từ nhánh m chúng ta xóa nhánh main.
shell> git checkout m
Switched to branch 'm'
shell> git branch -D main
Deleted branch main (was 40e072f).
Từ nhánh m chúng ta tạo nhánh main và chúng ta có kết quả.
shell> git branch main
shell> git branch
b
beta
* m
main
Chuyển qua nhánh main.
shell> git checkout main
Switched to branch 'main'
shell> git branch
b
beta
m
* main
Tiến hành gộp nhánh beta vào main chúng ta nhận được lỗi conflict
như dưới.
shell> git rebase beta
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
error: could not apply a18ec3c... D1
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply a18ec3c... D1
git rebase beta
: Bạn đang cố gắng rebase nhánh hiện tại của mình (main
) lên nhánh beta
. Điều này có nghĩa là Git sẽ lấy tất cả các commit từ nhánh main
mà không có trong nhánh beta
và áp dụng (hoặc “chơi lại”) chúng lên nhánh beta
.
Auto-merging a.txt
: Git đang cố gắng tự động merge file a.txt
từ nhánh main
vào nhánh beta
.
CONFLICT (content): Merge conflict in a.txt
: Một xung đột merge đã xảy ra trong file a.txt
. Điều này thường xảy ra khi cùng một phần của file đã được thay đổi ở cả hai nhánh.
error: could not apply a18ec3c... D1
: Git không thể áp dụng commit a18ec3c
(với thông điệp commit “D1”) do xung đột.
hint: Resolve all conflicts manually, mark them as resolved with "git add/rm <conflicted_files>", then run "git rebase --continue".
: Git đang gợi ý bạn cách giải quyết xung đột. Bạn cần giải quyết xung đột (thông thường bằng cách chỉnh sửa file), sau đó chạy git add a.txt
để đánh dấu rằng xung đột đã được giải quyết, và cuối cùng chạy git rebase --continue
để tiếp tục quá trình rebase.
hint: You can instead skip this commit: run "git rebase --skip".
: Nếu bạn không muốn giải quyết xung đột và muốn bỏ qua commit gây ra xung đột, bạn có thể chạy git rebase --skip
.
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
: Nếu bạn muốn hủy quá trình rebase và quay lại trạng thái trước khi rebase, bạn có thể chạy git rebase --abort
.
Could not apply a18ec3c... D1
: Đây là thông báo lỗi cuối cùng, nói rằng Git không thể áp dụng commit a18ec3c
.
Mình sẽ lấy cả 2 nội dung nên mình sẽ chọn Accept Both Changes.
Kiểm tra trạng thái git status.
shell> git status
interactive rebase in progress; onto 7a8a19b
Last command done (1 command done):
pick a18ec3c D1
Next command to do (1 remaining command):
pick 233bfb3 D2
(use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'main' on '7a8a19b'.
(fix conflicts and then run "git rebase --continue")
(use "git rebase --skip" to skip this patch)
(use "git rebase --abort" to check out the original branch)
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
interactive rebase in progress; onto 7a8a19b
: Bạn đang trong quá trình rebase tương tác, với nhánh cơ sở là commit 7a8a19b
.
Last command done (1 command done): pick a18ec3c D1
: Lệnh rebase cuối cùng đã hoàn thành là pick a18ec3c D1
, nghĩa là commit a18ec3c
với thông điệp “D1” đã được chọn và áp dụng lên nhánh cơ sở.
Next command to do (1 remaining command): pick 233bfb3 D2
: Lệnh rebase tiếp theo cần thực hiện là pick 233bfb3 D2
, nghĩa là commit 233bfb3
với thông điệp “D2” sẽ được chọn và áp dụng tiếp theo.
You are currently rebasing branch 'main' on '7a8a19b'.
: Bạn đang rebase nhánh main
lên commit 7a8a19b
.
Unmerged paths: both modified: a.txt
: File a.txt
đã được sửa đổi ở cả hai nhánh và chưa được merge. Đây là nguyên nhân của xung đột.
no changes added to commit (use "git add" and/or "git commit -a")
: Hiện tại, không có thay đổi nào được thêm vào để commit. Bạn cần dùng git add a.txt
sau khi đã giải quyết xung đột, để đánh dấu rằng xung đột đã được giải quyết.
Các gợi ý khác như git rebase --continue
, git rebase --skip
, và git rebase --abort
là các lệnh bạn có thể sử dụng để tiếp tục, bỏ qua commit gây ra xung đột, hoặc hủy bỏ quá trình rebase.
Thêm các file vào vùng staged để được theo dõi.
git add .
Kiểm tra lại trạng thái git status.
shell> git status
interactive rebase in progress; onto 7a8a19b
Last command done (1 command done):
pick a18ec3c D1
Next command to do (1 remaining command):
pick 233bfb3 D2
(use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'main' on '7a8a19b'.
(all conflicts fixed: run "git rebase --continue")
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: a.txt
Chạy lại lệnh git rebase với tham số –continue để tiếp tục merge code bằng rebase.
git rebase --continue
Nếu bạn gặp lỗi dưới thì hãy tiếp tục đọc hướng dẫn để được giải quyết.
shell> git rebase --continue
hint: Waiting for your editor to close the file... Visual Studio Code: Visual: command not found
error: There was a problem with the editor 'Visual Studio Code'.
Please supply the message using either -m or -F option.
error: could not commit staged changes.
Lỗi này xảy ra do Git không thể mở trình soạn thảo mà nó được cấu hình để sử dụng, trong trường hợp này là ‘Visual Studio Code’.
Có thể bạn đã cấu hình Git để sử dụng ‘Visual Studio Code’ nhưng Git không thể tìm thấy hoặc chạy nó. Điều này có thể xảy ra nếu ‘Visual Studio Code’ không được cài đặt, không có trong PATH, hoặc nếu tên của nó không được chỉ định đúng.
Để giải quyết vấn đề này, bạn cần cấu hình Git để sử dụng ‘Visual Studio Code’ như trình soạn thảo mặc định. Bạn có thể làm điều này bằng cách chạy lệnh sau trong terminal:
git config --global core.editor "code --wait"
Lệnh trên sẽ cấu hình Git để sử dụng ‘Visual Studio Code’ (code
) như trình soạn thảo mặc định. Tùy chọn --wait
yêu cầu ‘Visual Studio Code’ chờ đợi cho đến khi cửa sổ editor được đóng lại (ví dụ: sau khi bạn đã hoàn thành việc soạn thảo commit message) trước khi tiếp tục thực hiện lệnh Git.
Sau khi chạy lệnh trên, bạn nên thử lại git rebase --continue
và xem nếu vấn đề đã được giải quyết.
shell> git rebase --continue
hint: Waiting for your editor to close the file...
Hãy thay đổi tên commit từ D1 sang D1′ và lưu lại và thoát file.
Sau khi thoát file thì trên terminal sẽ xuất hiện thông báo dưới cho biết bạn đã merge code thành công bằng git rebase.
shell> git rebase --continue
[detached HEAD 7f74b76] D1'
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/main.
Sử dụng lệnh git log --oneline
hiển thị lịch sử commit dưới dạng một danh sách ngắn gọn, mỗi dòng biểu diễn một commit, với hash commit rút gọn và thông điệp commit.
shell> git log --oneline
d1c5c03 (HEAD -> main) D2
7f74b76 D1'
7a8a19b (beta, b) B2
39790e0 B1
590a2df C3
3ff078b C2
6c188c3 C1
d1c5c03 (HEAD -> main) D2
: Đây là commit mới nhất trên nhánh main
, nơi con trỏ HEAD đang trỏ đến. Thông điệp commit là “D2”.
7f74b76 D1'
: Đây là commit trước đó trên nhánh main
với thông điệp commit là “D1'
“.
7a8a19b (beta, b) B2
và 39790e0 B1
: Đây là hai commit trên nhánh beta
(cũng được gọi là nhánh b
). “B2” và “B1” là thông điệp commit.
590a2df C3
, 3ff078b C2
, và 6c188c3 C1
: Đây là ba commit đầu tiên trên nhánh main
. “C3”, “C2”, và “C1” là thông điệp commit.
Như vậy, bạn đã hoàn thành quá trình rebase nhánh main
lên nhánh beta
, vì vậy các commit “D2” và “D1'
” giờ đây nằm trên cùng một nhánh với các commit “B2” và “B1”.
5.1. Gộp nhánh main vào beta.
Tiến hành xóa nhánh main và tạo lại nó từ nhánh m.
shell> git branch
b
beta
m
* main
shell> git checkout m
Switched to branch 'm'
shell> git branch -D main
Deleted branch main (was d1c5c03).
shell> git branch main
shell> git branch
b
beta
* m
main
Chuyển sang nhánh beta để chúng ta merge nhánh main vào và bạn sẽ gặp lỗi như trước là đang có xung đột file a.txt khi nó gộp với commit B1.
shell> git switch beta
Switched to branch 'beta'
shell> git rebase main
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
error: could not apply 39790e0... B1
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 39790e0... B1
Bây giờ mình sẽ lấy Sua boi Beta
.
Chạy lệnh git status và git add chúng ta có kết quả như sau:
shell> git status
interactive rebase in progress; onto 233bfb3
Last command done (1 command done):
pick 39790e0 B1
Next command to do (1 remaining command):
pick 7a8a19b B2
(use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'beta' on '233bfb3'.
(fix conflicts and then run "git rebase --continue")
(use "git rebase --skip" to skip this patch)
(use "git rebase --abort" to check out the original branch)
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
shell> git add .
shell> git status
interactive rebase in progress; onto 233bfb3
Last command done (1 command done):
pick 39790e0 B1
Next command to do (1 remaining command):
pick 7a8a19b B2
(use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'beta' on '233bfb3'.
(all conflicts fixed: run "git rebase --continue")
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: a.txt
interactive rebase in progress; onto 233bfb3
: Bạn đang trong quá trình rebase tương tác, với nhánh cơ sở là commit 233bfb3
.
Last command done (1 command done): pick 39790e0 B1
: Lệnh rebase cuối cùng đã hoàn thành là pick 39790e0 B1
, nghĩa là commit 39790e0
với thông điệp “B1” đã được chọn và áp dụng lên nhánh cơ sở.
Next command to do (1 remaining command): pick 7a8a19b B2
: Lệnh rebase tiếp theo cần thực hiện là pick 7a8a19b B2
, nghĩa là commit 7a8a19b
với thông điệp “B2” sẽ được chọn và áp dụng tiếp theo.
You are currently rebasing branch 'beta' on '233bfb3'.
: Bạn đang rebase nhánh beta
lên commit 233bfb3
.
both modified: a.txt
: File a.txt
đã được sửa đổi ở cả hai nhánh và chưa được merge. Đây là nguyên nhân của xung đột.
git add .
: Bạn đã thêm tất cả các thay đổi vào staging area, bao gồm cả việc giải quyết xung đột trong file a.txt
.
all conflicts fixed: run "git rebase --continue"
: Tất cả các xung đột đã được giải quyết. Bạn có thể tiếp tục quá trình rebase bằng cách chạy git rebase --continue
.
Changes to be committed: modified: a.txt
: Thay đổi trong file a.txt
đã được thêm vào staging area và sẵn sàng để commit.
Bây giờ tiến hành git rebase
lại với tham số --continue
và bạn hãy chỉnh sửa commit B1 thành B1′, lưu file và thoát bạn sẽ có kết quả như dưới.
shell> git rebase --continue
[detached HEAD 6eba747] B1'
1 file changed, 1 insertion(+), 1 deletion(-)
Successfully rebased and updated refs/heads/beta.
Kiểm tra lại lịch sử commit của nhánh beta chúng ta có kết quả.
shell> git log --oneline
30dfa7c (HEAD -> beta) B2
6eba747 B1'
233bfb3 (main, m) D2
a18ec3c D1
590a2df C3
3ff078b C2
6c188c3 C1
Chúc các bạn thành công.