2011-10-12 59 views
9

Tôi có một nhánh chính và "PersonalSite" cho một codebase mà tôi đang làm việc. Tôi đã nhiều lần cố gắng hợp nhất tổng thể vào chi nhánh PersonalSite để không có kết quả.git merge không hợp nhất

Lần này, tôi nghĩ tôi đã có tất cả mọi thứ thẳng ra, vì vậy tôi đã làm:

git checkout master 
git pull 
git checkout PersonalSite 
git pull 
git merge master 

Nó trông giống như tất cả mọi thứ đang làm việc, và nó được liệt kê tập các tập tin tôi sẽ mong đợi, nhưng đã có một cuộc xung đột . Cuộc xung đột là chính xác và như mong đợi, vì vậy tôi đã sửa nó, "git add", "git commit", rồi "git push". Nhưng bây giờ, khi tôi nhìn vào nhật ký git của tôi, nó chỉ cho thấy một cam kết không có thay đổi mã nhưng chỉ có một xung đột.

Bây giờ, khi tôi chạy "git merge master" từ nhánh "PersonalSite", thông báo "Đã cập nhật". nhưng điều này rõ ràng không phải là trường hợp, vì không có thay đổi nào tôi đã cố gắng hợp nhất thực sự được hợp nhất. Chính xác tôi phải làm gì để làm chủ nhân thực sự hợp nhất vào thời điểm này?

Trả lời

5

Bằng cách sửa chữa xung đột và cam kết xung đột hợp nhất bạn đã hoàn thành việc hợp nhất. Git bổ sung thêm các cam kết hợp nhất khi cần thiết, nó là bình thường nhưng họ không ghi lại bất cứ điều gì ngoại trừ việc hợp nhất đã diễn ra và những tập tin nào được sáp nhập nếu có xung đột. Nếu bạn nhìn kỹ hơn vào nhật ký của mình, bạn sẽ thấy có thực tế là cam kết từ chủ.

EDIT: OK, hãy thử thử nghiệm này. Bạn không cần phải sử dụng lệnh merge, bạn có thể chỉ cần kéo master vào PersonalSite.

git checkout PersonalSite 
git pull origin master 

Xem điều gì mang lại cho bạn. Nếu nó được cập nhật thì bạn đã hợp nhất chính xác.

Nếu bạn hợp nhất nội dung cục bộ như bạn đã làm, thì bạn cần đảm bảo các chi nhánh theo dõi cục bộ được cập nhật. Luôn ghi rõ tên chi nhánh để kéo từ,

git pull origin master 
git pull origin PersonalSite 
+1

Lý do tôi nói nó không hợp nhất là có những thay đổi trong nhánh chính không được phản ánh trong chi nhánh PersonalSite ngay cả sau khi hợp nhất ... – LAW

+0

Cập nhật câu trả lời. – sciritai

+1

git pull origin [tên chi nhánh] đã làm thủ thuật – Bijan

0

hợp nhất sẽ không hiển thị bất kỳ thay đổi nào ngoại trừ các giải pháp xung đột của bạn.

Để thấy sự khác biệt ở hai bên của việc hợp nhất làm:

git diff head^.. 

git diff head^2.. 

cho phía bên kia.

Hy vọng điều này sẽ hữu ích.

3

Giả sử bạn đã thực sự sáp nhập những gì bạn có nghĩa là để hợp nhất (đó là có thể, nhưng khó có thể nói, với lời giải thích của bạn), bạn vẫn sẽ không thấy diffs trong đầu ra của git log, chỉ thông báo cam kết. Ngay cả khi bạn sử dụng -p để thông báo cho git log để hiển thị các khác biệt, thì khác biệt cho cam kết hợp nhất thường sẽ trống hoặc có thể hiển thị các giải pháp xung đột. Điều này là do ngữ nghĩa, chỉ có các giải pháp xung đột là một phần của cam kết hợp nhất; các thay đổi khác là một phần của các cam kết khác.

Nếu bạn muốn git log để hiển thị cho bạn những hiệu ứng đầy đủ của hợp nhất cam kết dù sao, bạn có thể sử dụng:

git log -p -m -c 

Chức năng của các tùy chọn:

  • -p đạo nó để hiển thị diffs, không chỉ cần cam kết tin nhắn;
  • -m yêu cầu nó hiển thị các khác biệt cho các cam kết hợp nhất; và
  • -c nói với nó để kết hợp hai diffs thành một cho merge cam

Quan điểm khác trong gitk sẽ làm điều tương tự.

4

Tôi nhận ra rằng đây là một câu hỏi cũ hơn bây giờ, nhưng tôi chỉ có những gì tôi tin là cùng một vấn đề. Tôi không thể làm cho nó giải quyết với bất kỳ sự kết hợp của các lệnh trong câu trả lời khác, nhưng tôi đã giải quyết nó bằng cách chạy tại các chi nhánh mà tôi muốn kết hợp thành:

git checkout <desired_branch_name> -- . 

Vì vậy, cho bạn:

git checkout master -- . 

Tôi tìm thấy câu trả lời ở đây: git: checkout files from another branch into current branch (don't switch HEAD to the other branch)

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