2012-04-14 36 views
29

Tôi đang hợp tác làm việc với một dự án với một người nào đó, vì vậy chúng tôi quyết định sử dụng git. Thật không may, chúng tôi thường xuyên viết mã ở những nơi không có internet, vì vậy chúng tôi kết thúc với một cái gì đó như thế này:Tại sao Git tạo một cam kết hợp nhất mà không có thay đổi tập tin?

origin/master: A---B---C 
         \ 
mylocalmaster:   D---E---F 
         \ 
hismaster:    G---H---I 

Bây giờ, nói rằng ông đẩy cam kết của mình và nhận được này:

origin/master: A---B---C---G---H---I 
         \ 
master (local):   D---E---F 

Tất cả tôi muốn làm là đẩy cam kết của tôi để có được điều này trong cả hai repo địa phương của tôi và trực tuyến một:

A---B---C---D---E---F---G---H---I 

dường như với hoạt động khi tôi làm git push, nhưng những rắc rối nảy sinh khi tôi làm git fetch và sau đó git merge. Tất cả những gì tôi đang cố gắng làm là lấy của anh ấy cam kết vào repo địa phương của tôi, nhưng tôi kết thúc với một cam kết hợp nhất nói một cái gì đó như Merge remote-tracking branch 'origin/master' như thông điệp của nó.

Tôi không muốn có cam kết vô nghĩa này vì có không có mã xung đột trong cam kết của chúng tôi. Chúng tôi đang làm việc trên các tệp hoàn toàn khác nhau, vì vậy không có lý do gì để có cam kết này. Làm thế nào tôi có thể ngăn chặn git tạo ra cam kết hợp nhất này?

+1

Khi bạn thực hiện một cú đẩy git trong tình huống đó, bạn sẽ gặp phải lỗi. Nó dường như không hoạt động tốt. – bames53

+0

Vì tôi đến trang này cố gắng tìm hiểu cách * force * git tạo một commit hợp nhất mà không có bất kỳ thay đổi nào, tôi sẽ đề cập đến câu trả lời đó là lệnh 'git commit-tree'. Xem 'man git-commit-tree'. – Wildcard

+0

@Wildcard Ngoài sự tò mò, trong trường hợp nào bạn muốn tạo một cam kết hợp nhất rằng 'git merge --no-ff' sẽ không giải quyết được? –

Trả lời

29

Bạn có thể bỏ qua việc tạo ra merge cam, bằng cách sử dụng rebase thay vì hợp nhất.

Như @Dougal nói, nếu bạn làm git fetch, bạn có thể thực hiện git rebase sau đó để thay đổi cơ sở của sự thay đổi của mình vào lấy HEAD.

Thông thường bạn tạo những thông tin không mong muốn hợp nhất cam kết, bằng cách kéo từ kho lưu trữ từ xa. Trong trường hợp đó bạn có thể thêm --rebase tùy chọn:

git pull --rebase 

hoặc thêm tùy chọn thích hợp để Git tập tin cấu hình (địa phương):

git config branch.<branch-name-here>.rebase true 

hoặc cho tất cả các kho và chi nhánh mới:

git config branch.autosetuprebase always --global 

Tuy nhiên, việc rebasing tạo ra lịch sử rõ ràng hơn, tuyến tính hơn nó là tốt để tạo ra các cam kết hợp nhất, nơi có sự thay đổi lớn s trong cả hai chi nhánh (sử dụng git merge để làm như vậy).

+0

Và câu trả lời cho câu hỏi đầu tiên của bạn - tại sao? Hợp nhất các cam kết được tạo ra theo mặc định để tránh nhầm lẫn cho người mới đến Git, bởi vì đây là tình huống đơn giản về khái niệm và mọi người mong đợi có các cam kết hợp nhất khi họ hợp nhất. –

+2

Tôi không muốn tạo các cam kết này vì tôi không hợp nhất bất kỳ thứ gì. Nếu tôi để git tạo ra một triệu những cam kết không làm gì cả, nó sẽ chỉ làm tắc nghẽn lịch sử cam kết của tôi mà không có lý do gì cả. –

+5

Vâng, thực sự hợp nhất các cam kết được yêu cầu trong trường hợp này do mô hình dữ liệu của git. Băm cam kết bao gồm kiến ​​thức về tất cả các cam kết gốc của nó. Điều này, một khi bạn thay đổi một cam kết trong hàng cam kết, tất cả các cam kết sau sẽ nhận được một băm mới - chúng trở nên khác với những gì chúng ban đầu. Các cam kết hợp nhất có các cam kết không thay đổi và tham chiếu cả hai dòng (do đó nó có hai cha mẹ). Nếu bạn rebase, bạn thay đổi cam kết của bạn để trực tiếp tham khảo các cam kết từ xa như cha mẹ của họ. Điều này không liên quan gì đến các khác biệt thực tế, nhưng chỉ với theo dõi lịch sử. –

9

Sử dụng git rebase (sau git fetch) để thực hiện các cam kết của bạn áp dụng chống lại thay vì chống lại chủ trước đó. Tức là, để đi đến ABCGHIDEF trong ví dụ của bạn. (Bạn không thể làm ABCDEFGHI mà không cần phải làm một push -f, vì ABCGHI là đã có trong origin/master và bạn sẽ phải ghi đè lên đó.)

+0

Cảm ơn. Tôi biết đó là một thứ ngớ ngẩn như thế, nhưng tôi không biết gì hết. –

Các vấn đề liên quan