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.cc
và bye.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.
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