Tìm hiểu các kiểu merge pull request trên github

Tìm hiểu các kiểu merge pull request trên github

Giữ một lịch sử “git gọn gàng” có thể tiết kiệm rất nhiều thời gian cũng như nỗ lực cho lập trình viên khi tìm lại các commit liên quan đến bug hoặc issue. Giả sử ta đã có một nhánh (branch) và tạo một pull request.GitHub mang đến ba sự lựa chọn khi merge commits, đó là:

  • Create a Merge Commit
  • Squash and Merge
  • Rebase and Merge

Các bạn có thể xem hình bên dưới:



Các bạn hãy cùng theo dõi “ 3 kiểu merge “ để thấy được sự khác biệt giữa chúng và có sự lựa chọn hợp lý cho từng trường hợp cụ thể.
1.Create a Merge Commit

Hình bên dưới là tùy chọn “Create a merge commit”:


Merge all of the commits into the base branch (merge tất cả commit vào trong nhánh cơ sở)

Đây là lựa chọn mặc định khi Merge pull request trên Github.
Để bắt đầu, chúng ta có một nhánh base master với commit ban đầu (Initial Commit) và 2 commit mới, kí hiệu là commit 1,commit 2.
Sau đó chúng ta tạo một branch “feature-branch” , tiếp tục tạo 2 commit commit 3 và commit 4. Tiến hành push những thay đổi của chúng ta vào “feature-branch”.
Chúng ta vào Github mục Insights -> Network và quan sát:





Khi sử dụng “Merge pull request” (giả sử không có gì xung đột xảy ra trước đó), commits 3 và 4 sẽ được thêm vào nhánh chính như một commit, gọi là Merge branch feature-branch và trở thành một HEAD mới. Chúng ta cùng quan sát điều gì xảy ra trong Insights -> Network:

2. Squash and merge

Hình bên dưới là tùy chọn “Squash and merge”:

All commits from this branch will be combined into one commit in the base branch (gộp những commit vào trong một commit duy nhất)
Squashing làm việc giống với rebasing một nhánh, chúng ta có thể nhận nhiều commits, pull request và squash - nén chúng vào 1 commit duy nhất. Việc này khá giống với Merge pull request, nhưng tinh tế hơn.

Thay vì thêm commits 3 và 4 với commit “Merge branch feature-branch”, chúng ta gộp 3 và 4 và kết quả cho ra duy nhất commit gộp là 3**(squashed)**.

Chúng ta cùng quan sát điều gì xảy ra trong Insights -> Network:



Tùy chọn squash trên Github UI cho phép chúng ta thay đổi các thông điệp commit mặc định. Các commit dưới đây được “squash” dưới dạng thông điệp mặc định như sau:


Nếu bạn muốn sử dụng nó , đừng quên edit các thông điệp !

Chúng ta sử dụng tùy chọn merge này khi 1 feature branch có rất nhiều các commit nhỏ được add. Khi đó, chúng ta có thể nén chúng vào 1 commit. Commit nén có thể chứa một thông điệp với các thông tin mô tả về commit được nén dưới nó.

3. Rebase and Merge

Hình bên dưới là tùy chọn “Rebase and merge”:



Rebase the commits individual onto the base branch (tập hợp tất cả những commit riêng lẻ vào trong một branch cơ sở)
Trong trường hợp chỉ cần sửa đổi một số lượng nhỏ commit cũng như một đoạn code cụ thể thì rebase and merge sẽ là lựa chọn hàng đầu. Cách làm này sẽ làm cho quá trình merge được đơn giản cũng như giữ lịch sử Git gọn gàng hơn.
Ta cần tạo 2 commit trên nhánh “feature-branch” thêm commits 1 và 2. Rebase and Merge sẽ chuyển các commits lên đầu nhánh chính master branch - thay đổi HEAD của master branch mà không merge “feature-branch” như khi sử dụng Merge pull request:

Chúng ta cùng quan sát điều gì xảy ra trong Insights -> Network:



Kết Luận

Github cung cấp cho ta rất nhiều chức năng để quản lý dự án một cách hiệu quả. Do vậy bạn cần hiểu rõ bản chất của mỗi chức năng để có thể quản lý dự án của chúng ta được tốt hơn.

Nếu như bạn muốn quản lý được tất cả những commit ID trong những branch sau khi chúng đã được merge/xóa bản phải dùng Create a merge commit. Mặt khác bạn làm một dự án mã nguồn mở với những người đóng góp thì Squash and merge là tốt nhất. Còn bạn làm một private repo mà cần kiểm soát những nhân viên thì Rebase and merge là một lựa chọn tốt tuy nhiên Squash and merge vẫn hoạt động ổn.


Link tham khảo thêm :
< https://medium.com/@elliotchance/comparison-of-merging-strategies-in-github-2f948c3b8fdc https://rietta.com/blog/github-merge-types/