2012-01-12 13 views
11

Tôi hiện đang xem rất nhiều tính năng theo dõi nội dung của git. Rất vui khi biết rằng git cho phép tôi tìm ra mã đã được chuyển từ tệp này sang tệp khác, nhưng tôi tự hỏi tính năng này có thể sử dụng được khi thực hiện giải quyết xung đột khi hợp nhất.Cách lấy git để hợp nhất chính xác nội dung đã di chuyển (không chỉ các tệp)

Dưới đây là kịch bản:

Tôi có hai tập tin hello.ccbye.cc tạo. Tôi bắt đầu một chi nhánh topic và di chuyển một số mã từ hello.cc đến bye.cc. Nếu bây giờ tôi làm một số git blame -C bye.cc Tôi có thể thấy rằng mã này ban đầu đến từ hello.cc, điều này rất hay. Tuy nhiên bây giờ tôi chuyển sang chi nhánh ban đầu mà không có nội dung được di chuyển và thay đổi một số mã trong phần trong hello.cc đã được di chuyển trong cam kết khác. Nếu bây giờ tôi làm một số git merge topic, tôi nhận được xung đột cho hello.cc. Tuy nhiên, trừ khi tôi sử dụng một kiểu diff3 (mà tôi sử dụng theo cách khác), tôi chỉ có thể thấy rằng phương thức này đã bị xóa khỏi hello.cc trong nhánh khác, nhưng không phải là nó đã bị thay đổi sau đó. Điều gì sẽ là tốt đẹp sẽ được cũng có được một cuộc xung đột trên bye.cc bởi vì nó sẽ là cần thiết để kiểm tra xem những thay đổi từ các chi nhánh khác sẽ phải được áp dụng lại cho mã. Điều này bằng cách nào đó có thể?

Tôi biết tôi có thể tự tìm ra, rằng mã đã được di chuyển bằng cách thực hiện git blame --reverse -C topic.... Tuy nhiên đối với một trong những nó đã cho tôi khá một thời gian để tìm ra khả năng này và hầu hết các khác có thể sẽ không biết về nó. Đối với thứ hai tôi lười biếng và có lẽ sẽ chỉ quên rằng mã có thể đã được di chuyển. Ngoài ra tôi không chắc chắn rằng điều này làm việc khi mã đã được chuyển đến nhiều hơn một tập tin.

Điều gì sẽ là cách để giữ tình huống này an toàn nhất có thể?

Sửa:

Tôi chỉ phát hiện ra rằng git blame --reverse -C hello.cc $(git merge-base HEAD topic)..topic cũng làm việc để tìm ra nơi mà nội dung chuyển. Và nếu tôi hiểu git một cách chính xác, điều này có lẽ nhanh hơn, bởi vì nó sẽ không thực hiện tìm kiếm đầy đủ nội dung trong kho lưu trữ đầy đủ.

Sửa:

Tôi đã tải lên kho lưu trữ Tôi đang sử dụng để chơi xung quanh để github vì vậy bạn có thể thử việc hợp nhất cho chính mình. Cam kết mà tôi đã di chuyển hàm nằm trong nhánh chủ đề. Cam kết có cùng chức năng được thay đổi trong master tại HEAD của chi nhánh merge_here. Có một cam kết bổ sung trong chủ, trong đó tôi đã chơi xung quanh với một số kỹ thuật hợp nhất khác, mà bạn nên bỏ qua cho câu hỏi này.

Trả lời

-4

Bạn có thể sử dụng git để đặt bất cứ điều gì vào cam kết của bạn nó sẽ hoạt động tốt.

+0

Có chắc chắn . Tôi biết điều đó. Nhưng cách tốt nhất để có được git để cho tôi gợi ý và cảnh báo về những gì để đưa vào cam kết, hoặc thông qua các công cụ sử dụng hoặc thông qua xung đột hợp nhất. – LiKao

0

Thật không may, đã đến cùng một cái bẫy với mã của tôi, sau khi di chuyển tệp trong git, nó không nhận ra sự thay đổi trong quá trình hợp nhất chi nhánh. Có vẻ như, các quy tắc vàng một phải hướng dẫn làm việc với thái này là:

giữ mã phong trào tách rời khỏi những thay đổi

GIT không thể theo dõi như các trường hợp, như bây giờ. Và có vẻ như không có giải pháp nhanh/tự động nào để tìm ra các vấn đề tiềm năng sau khi di chuyển tệp và sau đó hợp nhất.

Thậm chí nếu bạn sẽ biết cả hai cam kết nơi mà vấn đề xảy ra, và sẽ cố gắng áp dụng bản vá hoặc hoàn nguyên thay đổi mất sau khi di chuyển + hợp nhất, bạn vẫn sẽ nhận được từ chối từ git giống nhau:

'git apply' failed with code 1:'error: patch failed: filename.js:81'