Trong khi mã nguồn tái cấu trúc, đôi khi bạn cần di chuyển khối văn bản lớn bên trong một tệp hoặc thậm chí vào tệp mới. Bạn tạo một chi nhánh refactored
và cam kết đi:Đọc git để theo dõi nội dung đã di chuyển (không chỉ đơn giản là di chuyển tệp)
$git checkout master
$git branch refactored
$git checkout refactored
<move code around>
$git commit -m "refactored code"
Tuy nhiên, người ta có thể cam kết trên đầu trang của các chi nhánh trước Refactor cũ, thay đổi mã đã được chuyển:
$git checkout master
<change code that was moved elsewhere on branch refactored>
$git commit -m "bugfix"
Mở chi nhánh refactored
, bạn sau đó muốn kết hợp các thay đổi được thực hiện trong master
:
$git checkout refactored
$git merge master
<giant merge conflict>
Điều này dẫn đến xung đột hợp nhất lớn. Nếu có một cách để nói với git rằng nội dung chỉ đơn giản là di chuyển, nó sẽ có thể hợp nhất tự động.
Phần tồi tệ hơn là, ngay cả sau khi giải quyết các xung đột và commiting nó, git vẫn không thể sử dụng độ phân giải để tìm ra hòa trộn thêm:
<fix conflicts>
$git commit -m "merge master into refactored"
$git checkout master
<change more code>
$git commit -m "bugfix2"
$git checkout refactored
$git merge master
<another giant merge conflict>
Đây có phải là có thể tránh được ở tất cả? Tôi đã thử git rerere
và không thể giải quyết xung đột ở đây. Có cách nào git có thể thấy di chuyển một khối văn bản như một động thái thực tế, thay vì xóa và chèn? Nếu nó không thể, cách tiếp cận tốt nhất để giảm thiểu xung đột hợp nhất là gì, nếu bạn cần giữ hai nhánh song song trong một thời gian?
Trong khi điều này đủ dễ dàng cho moving the contents of a complete file, tôi không thể tìm thấy thông tin về việc di chuyển chỉ phần của nó hoặc di chuyển bên trong cùng một tệp.
Ngoài ra, nếu có giải pháp cho việc này, hành vi của git blame
trên mã số được cấu trúc lại là gì? Nó sẽ trỏ đến cam kết tái cấu trúc, hoặc bỏ qua nó? Có cách nào để đạt được sau này không?
Trong trường hợp có ai quan tâm, tôi đã đặt một mã hóa base64 tar.gz của (rất ít) kho Tôi đang sử dụng để thử nghiệm on pastebin
Giải pháp tiềm năng
Một giải pháp tiềm năng có thể được thực hiện hợp nhất bằng cách áp dụng một bản vá được sửa đổi (tự động) với những thay đổi trong nhánh được tái cấu trúc trước. Có phần mềm nào được phát triển để làm điều này không? Sử dụng phương pháp này, tôi đoán rằng, vì đây là minh bạch để git, git blame
sẽ trỏ đến cam kết tái cấu trúc.
Tôi đã tìm thấy the same question, applied to diff. Không có đề cập đến bất kỳ triển khai không độc quyền hiện có, nhưng có đề cập đến một thuật toán theo dõi chuyển động khối
Tôi đề nghị bạn thực hiện nhiều cam kết. Khi bạn thay đổi nhiều dữ liệu, bạn càng có nhiều cam kết, ít gặp vấn đề khi hợp nhất mã. – sensorario
@sensorario, đó là một gợi ý hay nói chung. Tôi không chắc chắn cách bạn áp dụng nó để tái cấu trúc, mặc dù - di chuyển một chức năng/khối nhỏ tại một thời điểm sẽ không giúp đỡ – goncalopp
Nếu bạn thay đổi tệp bạn có hai nội dung khác nhau. Có, cũng nếu bạn di chuyển một chức năng từ một tập tin khác. Nếu bạn muốn giảm thiểu xung đột, hãy thực hiện nhiều cam kết hơn. Vui lòng thử. – sensorario