Câu trả lời này đã được sửa đổi, vì sự hiểu biết, sơ đồ và kết luận của tôi không chính xác.
git pull
gây ra các cam kết hợp nhất vì git đang hợp nhất. Điều này có thể được thay đổi bằng cách đặt các nhánh của bạn sử dụng rebase thay vì hợp nhất. Sử dụng rebase thay vì hợp nhất trên một pull cung cấp lịch sử tuyến tính hơn cho kho lưu trữ được chia sẻ. Mặt khác, cam kết hợp nhất thể hiện nỗ lực phát triển song song của chi nhánh.
Ví dụ, hai người đang làm việc trên cùng một chi nhánh. Chi nhánh bắt đầu là:
...->C1
Người đầu tiên hoàn thành công việc của họ và đẩy đến nhánh:
...->C1->C2
Người thứ hai hoàn thành công việc của họ và muốn thúc đẩy, nhưng không thể vì họ cần cập nhật. Kho lưu trữ cục bộ cho người thứ hai trông giống như sau:
...->C1->C3
Nếu kéo được đặt để hợp nhất, kho lưu trữ ngôi thứ hai sẽ trông như thế nào.
...->C1->C3->M1
\ /
->C2->
Trong đó M1 là một cam kết hợp nhất. Lịch sử nhánh mới này sẽ được đẩy lên repo. Nếu thay vào đó, pull được đặt để rebase repo cục bộ sẽ trông giống như sau:
...->C1->C2->C3
Không có cam kết hợp nhất. Lịch sử đã được thực hiện tuyến tính hơn.
Cả hai lựa chọn đều phản ánh lịch sử của chi nhánh. git cho phép bạn chọn lịch sử nào bạn thích.
Thực sự có những nơi mà rebase có thể gây ra sự cố với các nhánh từ xa. Đây không phải là một trong những trường hợp đó. Chúng tôi thích sử dụng rebase vì nó đơn giản hóa lịch sử nhánh vốn đã phức tạp cũng như hiển thị phiên bản lịch sử liên quan đến kho lưu trữ được chia sẻ.
Bạn có thể đặt branch.autosetuprebase = luôn để git tự động thiết lập các nhánh từ xa của bạn dưới dạng rebase thay vì master.
git config --global branch.autosetuprebase always
Cài đặt này khiến git tự động tạo cài đặt cấu hình cho từng nhánh từ xa:
branch.<branchname>.rebase=true
Bạn có thể tự thiết lập điều này cho các chi nhánh từ xa đã được thiết lập.
git config branch.<branchname>.rebase true
Tôi muốn cảm ơn @LaurensHolst đã đặt câu hỏi và theo đuổi những phát biểu trước đây của tôi. Tôi chắc chắn đã tìm hiểu thêm về cách git hoạt động với các cam kết kéo và hợp nhất.
Để biết thêm thông tin về các cam kết hợp nhất, bạn có thể đọc Đóng góp cho một dự án trong ProGit-Book . Phần Nhóm nhỏ Riêng tư hiển thị các cam kết hợp nhất.
git log --no-merges