Làm thế nào tôi có thể squash cam kết trong git?


6

Tôi muốn chỉ đơn giản là đè bẹp một loạt các cam kết git không còn cần thiết nữa. Tôi đã cố gắng làm theo tài liệu từ trang web này , nhưng tôi đã kết thúc với git nói rằng không có gì để đè bẹp. Tôi chỉ có một chi nhánh, vì vậy tôi đã theo dõi phần đó. Có ý kiến ​​gì không?

Câu trả lời:


8

Nếu tôi đang làm điều đó, tôi sẽ sử dụng "rebase". Giả sử bạn đã kiểm tra chi nhánh của mình và rằng nó được phân nhánh từ chủ, hãy làm

git rebase -i master

Điều này sẽ cho phép bạn sửa đổi các cam kết từ chủ thành chi nhánh hiện tại của bạn. Trong trường hợp của bạn, thay thế pickbằng s(for squash) hoặc f(for fixup, là một squash làm giảm thông điệp cam kết của cam kết bị đè bẹp). Lưu và thoát (ZZ trong Vim), và rebase sẽ làm điều kỳ diệu của nó. Rebase là một giải pháp tổng quát hơn vì trong cùng một hoạt động bạn có thể loại bỏ, sắp xếp lại và xác nhận lại cam kết.

Cài đặt rebase sẽ mở trong Vim hoặc bất kỳ trình chỉnh sửa nào bạn đặt trong EDITORbiến môi trường. Trong Vim, điều hướng để bắt đầu dòng với cam kết bạn muốn xóa (bằng phím mũi tên hoặc chuột), cwđể xóa pickvà nhập chế độ chèn, fđể sửa lỗi hoặc scho squash, sau đó ZZlưu và thoát.


Là một lưu ý phụ, liên kết bạn đưa ra gợi ý vỗ nhánh tính năng của bạn vào một cam kết duy nhất. Theo tôi đây là một ý tưởng khủng khiếp. Các cam kết nên thể hiện một tập hợp thay đổi có ý nghĩa. Một nhánh là tập hợp những thay đổi này đại diện cho một tính năng. Đập mọi thứ vào một cam kết lớn có nghĩa là các nhà phát triển khác sẽ khó theo dõi các thay đổi của bạn hơn.


Ok, tôi sẽ thử. Tôi thực sự không sử dụng nó để phát triển phần mềm, mà là để theo dõi các tệp cấu hình và các thứ khác trong Linux. Tôi muốn một bản sao lưu chỉ quay trở lại cho đến nay, vì vậy về bản chất, muốn xóa lịch sử lớn hơn 30 ngày. Đó là lý do tại sao tôi nghĩ rằng việc nghiền nát nó sẽ là lý tưởng cũng như loại bỏ không gian không cần thiết được đưa lên bởi các phiên bản.
Walter

Ok, tôi nghĩ rằng nó đã hoạt động lần này, khi tôi làm -i, tôi đã được nhắc chỉnh sửa các thông điệp cam kết và cuộc nổi loạn thực sự xuất hiện. Khi tôi không làm -i trước đó, không có bất kỳ cam kết nào thực sự bị nghiền nát.
Walter

@Walter nếu bạn không cần phải nén git, tôi nghĩ git gc làm điều đó, git nào cũng tự làm theo ý mình.
tobylane

@Walter, cam kết squash không chiếm ít không gian hơn (hoặc không gian lưu là không đáng kể). Git có thể không phải là công cụ phù hợp cho những gì bạn muốn làm.
Đánh dấu E. Haase

Vâng, nó không được thiết kế cho điều đó, nhưng tôi thích nó hơn các công cụ có sẵn khác.
Walter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.