Giữ cho lịch sử kho lưu trữ Git của bạn sạch sẽ bằng cách thực hiện các cam kết

Tác giả sysadmin, T.Bảy 18, 2023, 01:14:40 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 2 Khách đang xem chủ đề.

Giữ cho lịch sử kho lưu trữ Git của bạn sạch sẽ bằng cách thực hiện các cam kết


Mệt mỏi với lịch sử cam kết lộn xộn làm lộn xộn kho Git của bạn và các yêu cầu kéo? May mắn thay, Git có khả năng "xóa các cam kết", hợp nhất nhiều cam kết nhỏ thành một. Điều này giúp giữ cho lịch sử mã của bạn sạch sẽ và có tổ chức, đồng thời dễ dàng thực hiện với một vài lệnh.


1. Tại sao Squash cam kết?

Một trong những quy tắc vàng của nghi thức Git tốt là cam kết thường xuyên với những thông điệp tốt giải thích những gì cam kết làm. Tuy nhiên, điều này có thể nhanh chóng trở thành một vấn đề nếu có quá nhiều cam kết được đẩy. Xét cho cùng, không ai muốn xem xét một yêu cầu kéo với 40 cam kết khác nhau, tất cả đã sẵn sàng để hợp nhất thành chủ---đơn giản là nó quá lộn xộn.

Vì vậy, trước khi bạn chuyển sang một kho lưu trữ từ xa như GitHub, bạn nên xóa các cam kết đó, điều này sẽ hợp nhất tất cả chúng thành một cam kết lớn. Tất cả các thông báo cam kết từ các cam kết đó sẽ được thêm vào "cam kết bí mật" để chúng vẫn hiển thị khi bạn đẩy chúng lên GitHub hoặc gửi yêu cầu kéo của bạn.

Cũng không phải lúc nào cũng cần phải loại bỏ mọi cam kết, vì đôi khi việc chia nhỏ mọi thứ sẽ rất tốt nếu bạn đang làm việc trên nhiều tệp hoặc nhiều phần khác nhau của kho lưu trữ. Tuy nhiên, nếu bạn chỉ thực hiện nhiều thay đổi đối với một tệp theo thời gian, có lẽ bạn nên loại bỏ các cam kết đó.

Điều quan trọng cần lưu ý là bạn không thể xóa các cam kết đã được đẩy lên GitHub mà không đẩy mạnh, đây là một hoạt động phá hoại. Squashing cam kết ghi đè lên lịch sử Git, điều này tốt nếu bạn chỉ thực hiện nó trên máy cục bộ của mình. Nếu bạn đang làm điều đó trên GitHub, nó yêu cầu một lực đẩy, có nghĩa là tất cả các thành viên trong nhóm của bạn phải sao chép lại kho lưu trữ để tránh xung đột.

Để tránh những sự cố này, tốt nhất là xóa các cam kết trước khi đẩy vào kho lưu trữ từ xa. Vì đây thường là khi bạn muốn làm điều này, nên nó thường không phải là vấn đề.

2. Squashing Git cam kết với git merge

Có một số cách khác nhau để loại bỏ các cam kết, vì không có cách nào chính thức.

Mã nguồn [Chọn]
git squash
Một trong những cách dễ nhất là sử dụng git merge với --squash

Mã nguồn [Chọn]
git merge
Kỹ thuật này sẽ hợp nhất N lần xác nhận cuối cùng lại với nhau thành một.

Trước tiên, bạn sẽ muốn đảm bảo rằng kho lưu trữ của mình hoàn toàn sạch sẽ, không có thay đổi đang hoạt động nào. Bạn có thể kiểm tra git status để xác minh rằng bạn không có thay đổi cục bộ nào có thể bị loại bỏ khi đặt lại.

Mã nguồn [Chọn]
git status
Tiếp theo, bạn sẽ muốn đặt lại nhánh về vị trí trước bất kỳ cam kết nào mà bạn muốn gộp lại với nhau. Ví dụ: để xóa ba lần xác nhận cuối cùng, bạn sẽ sử dụng HEAD~3, về mặt kỹ thuật, đây là lần xác nhận thứ tư trong lịch sử, nhưng sẽ xóa cả ba lần xác nhận có thể xóa khỏi lịch sử của bạn.

Mã nguồn [Chọn]
HEAD~3
Mã nguồn [Chọn]
git reset --hard HEAD~3
Bạn cũng có thể sử dụng hàm băm SHA-1 cam kết để tham chiếu trực tiếp một cam kết. Tiếp theo, chúng tôi chạy git merge --squash, với mục tiêu hợp nhất là HEAD@{1}, là vị trí của HEAD trước lệnh cuối cùng.

Mã nguồn [Chọn]
git merge --squash 'HEAD@{1}'
Git đã dàn dựng tất cả các thay đổi với thông báo cam kết thích hợp vào thời điểm này, nhưng nó cần phải được cam kết:

Mã nguồn [Chọn]
git commit

Khi đã xong, bạn có thể thoải mái đẩy tất cả các cam kết vào kho lưu trữ nguồn ngược dòng của mình.

3. Kiểm soát nhiều hơn đối với Squash với Rebase tương tác

Nếu bạn không muốn nén mọi thứ thành một lần xác nhận bit, bạn có thể thực hiện một cuộc khởi động lại tương tác để chỉ chọn các xác nhận mà bạn muốn xóa. Việc khởi động lại có thể phức tạp, nhưng rất dễ thực hiện nếu thực hiện đúng các bước.

Đầu tiên, bắt đầu rebase tương tác bằng cách nhắm mục tiêu cam kết trước lần xác nhận có thể xóa cuối cùng:

Mã nguồn [Chọn]
git rebase -i HEAD~3
Điều này sẽ mở ra một trình soạn thảo văn bản, nơi bạn sẽ muốn thay đổi "pick" thành "squash" cho mỗi cam kết mà bạn muốn hợp nhất.


Git sau đó sẽ mở một trình soạn thảo khác, cho phép bạn tạo một thông báo cam kết mới cho cam kết kết hợp. Lưu cái này và quá trình rebase sẽ kết thúc.

Việc khởi động lại theo cách này sẽ hợp nhất tất cả các cam kết bị nén vào cam kết tiếp theo phía trên chúng. Trong trường hợp này, lần xác nhận thứ hai và thứ ba được hợp nhất thành lần xác nhận đầu tiên.

4. Squashing Git Cam kết với GUI Git

Giống như hầu hết các hành động trong Git, xóa các cam kết bằng giao diện dễ dàng hơn nhiều so với việc ghi nhớ và nhập lệnh mỗi lần. Trên thực tế, trong GitKraken, bạn có thể chỉ cần Control-Click vào các lần xác nhận bạn muốn xóa và nhấp chuột phải để nhấn "Squash 2 lần xác nhận":


Bạn có thể đọc hướng dẫn của chúng tôi về ứng dụng khách GUI Git để tìm hiểu thêm.