Git và những điều có thể bạn đã biết
Git
66
White

Banh Mii viết ngày 31/08/2021

Hiện nay, phần lớn các project đều dùng Git để quản lý, với các thao tác thông thường như pull, push, merge thì có lẽ đã quá quen thuộc với các bạn. Hôm nay mình sẽ trình bày một vài tình huống mà có thể xa lạ hơn một chút, cùng theo dõi nhé :D.

1. Sửa commit

Giả sử mình đã commit xong xuôi hết rồi thì chợt nhận ra cái commit message của mình sai chính tả, hoặc có một số file không mong muốn hay quên chưa xóa một số dòng không cần thiết, giờ muốn sửa lại?? Ở đây, mình sẽ chia làm 2 trường hợp:

1. Commit muốn sửa nằm ở trên cùng (commit cuối cùng):

Có nhiều cách, nhưng mình nghĩ cách phù hợp nhất là sử dụng câu lệnh:

                git commit --amend -m "New commit message."

Tại sao? Bởi vì câu lệnh này sinh ra để sửa commit message mà. :)). Ngoài ra bạn cũng có thể reset commit về commit trước đó, sau đó thực hiện commit lại, nhớ là đừng chọn reset "hard" nhé, việc này sẽ làm mất hết phần update code của chúng ta.

2. Commit muốn sửa không phải là commit cuối cùng

Tình huống này thì khoai hơn một chút, nhưng vẫn có thể với git rebase.
Giả sử mình muốn sửa message của commit thứ 5 từ trên xuống, trước hết, sử dụng:

                git rebase -i HEAD~5

Default editor sẽ hiển thị 5 commit gần nhất theo thứ tự từ DƯỚI LÊN - commit thứ 5 mà mình muốn sửa là commit trên cùng nhé. (nếu bạn chưa quen với việc thao tác trên vim thì nên chuyển default editor sang notepad++ nha)

            pick 43f8707f9 fix: update dependency json5 to ^2.1.1
            pick cea1fb88a fix: update dependency verdaccio to ^4.3.3
            pick aa540c364 fix: update dependency webpack-dev-server to ^3.8.2
            pick c5e078656 Add new feature
            pick 11ce0ab34 fix: Fix spelling.
            .... (Hướng dẫn sử dụng rebase)

Đọc theo hướng dẫn ở bên dưới, ở trường hợp này, mình muốn sửa message thứ 5, nên mình sửa "pick" thành "reword", sau đó save file lại và close:

            reword 43f8707f9 fix: update dependency json5 to ^2.1.1
            pick cea1fb88a fix: update dependency verdaccio to ^4.3.3
            pick aa540c364 fix: update dependency webpack-dev-server to ^3.8.2
            pick c5e078656 Add new feature
            pick 11ce0ab34 fix: Fix spelling.

Tiếp theo editor lại được mở ra cho cái commit muốn sửa, mình chỉ cần sửa lại message, rồi save, rồi close editor.
Sau tất cả thì kiểm tra lại và push force lên:

        git push -f branch-name

2. Squash commit (gộp các commit lại)

Đôi khi mình commit, xong thấy bị sót, xong lại commit thêm, vài ba lần như thế vô tình làm cho git của mình nhì xấu kinh dị, lúc này mình cần phải thực hiện squash commit. Tương tự như phần 1, mình cũng chia làm 2 trường hợp:

1. Gộp các commit trên cùng

Cách đơn giản nhất là dùng git reset. Mình chỉ cần reset về trước commit cuối cùng mà mình muốn gộp. Ví dụ mình muốn gộp 5 commit trên cùng, thì mình reset ở vị trí commit thứ 6. Toàn bộ phần code mà các mình đã update hiện giờ quay về vị trí modify như lúc chưa commit, và việc còn lại chỉ là commit lại để biến 5 commit này thành 1.

        git reset -s HEAD~5          -- to squash 5 commits into one
        git commit -m "new messgae for the combined commit"

Có một lưu ý nho nhỏ là tuyệt đối không chọn reset --hard nhé, sẽ làm mất hết code. Và sau khi reset thì kiểm tra toàn bộ lại code lần nữa, để ý phần untracked file vì một số file mà add mới sẽ chưa được stage ngay.

2. Gộp các commit ở giữa

Ở đây, chúng ta lại dùng git rebase. Tất nhiên rebase có thể dùng cho cả tình huống 1, mình thực sự rất thích dùng rebase vì rebase không chỉ làm cho git dễ nhìn và chuyên nghiệp hơn mà rebase còn có thể dùng được trong nhiều tình huống nữa.
Giả sử mình commit 3 lần, sau đó push code lên, member team mình pull code về và commit thêm 2 lần. Bây giờ mình pull code về và muốn gộp 3 commit của mình lại. (3 commit này không còn là những commit mới nhất nữa vì đã có 2 commit khác chồng lên trên).
Đầu tiên, dùng câu lệnh:

    $ git rebase -i HEAD~5

Default editor sẽ hiển thị 5 commit gần nhất:

    pick 43f8707f9 fix: update dependency json5 to ^2.1.1       --(3)
    pick cea1fb88a fix: update dependency verdaccio to ^4.3.3 --(2)
    pick aa540c364 fix: update dependency webpack-dev-server to ^3.8.2 --(1)
    pick c5e078656 Add new feature
    pick 11ce0ab34 fix: Fix spelling.               -- newest commit 

Để gộp các commit (1), (2), (3), mình sẽ sửa pick thành s (hoặc "squash") cho commit (1), (2). Sau đó save file và close editor:

    pick 43f8707f9 fix: update dependency json5 to ^2.1.1       --(3)
    s cea1fb88a fix: update dependency verdaccio to ^4.3.3 --(2)
    s aa540c364 fix: update dependency webpack-dev-server to ^3.8.2 --(1)
    pick c5e078656 Add new feature
    pick 11ce0ab34 fix: Fix spelling.               -- newest commit 

Editor sẽ mở ra nữa để bạn update commit message. Sau khi sửa xong thì lại save, close. Thế là xong :D.

Cuối cùng, kiểm tra lại và push force lên nhé.

Cảm ơn các bạn đã đọc bài viết ^^.

BanhMi 05-20-2021

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Banh Mii

4 bài viết.
17 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
5 0
Spring security là 1 framework thuộc hệ thống Spring, dành riêng cho việc thiết lập bảo mật của ứng dụng bao gồm authentication và authorization. M...
Banh Mii viết 5 tháng trước
5 0
White
2 0
Ở phần trước, chúng ta đã tìm hiểu cấu trúc bên trong và cách khởi tạo HashMap, ở phần này mình tiếp tục đi sâu hơn về cách HashMap hoạt động nhé. ...
Banh Mii viết 5 tháng trước
2 0
White
2 0
HashMap được coi là một trong những Java Collection phổ biến nhất, và cũng thường xuyên góp mặt trong list các câu hỏi phỏng vấn. Vậy bạn đã bao g...
Banh Mii viết 6 tháng trước
2 0
Bài viết liên quan
White
4 4
Xin chào mọi người, bài viết hôm nay sẽ liên quan đến một công cụ quản lý source code vô cùng quen thuộc đối với developer hiện nay đó chính là Git...
Julian Dong viết hơn 1 năm trước
4 4
White
3 1
Hôm nay group review một cái tài liệu về version control với mấy đồng nghiệp, một người bạn bảo: Cái đó có gì đâu mà ông viết có vẻ khó khăn vậy,...
Long Nguyễn Xuân viết 3 năm trước
3 1
White
12 0
Làm việc với git submodule (Ảnh) Đôi lúc ta cần phải sử dụng các repo khác như là một module của dự án hiện tại, nhưng ta lại muốn quản lý nó riê...
Tân Nguyễn viết 3 năm trước
12 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
4 bài viết.
17 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!