Tôi đã có một vấn đề tương tự, và tôi đã giải quyết nó bằng cách khởi động lại công việc của mình để phù hợp với tổ chức tệp mục tiêu.
Giả sử bạn đã sửa đổi original.txttrên nhánh của mình ( localnhánh), nhưng trên nhánh chính, original.txtđã được sao chép sang một nhánh khác, nói copy.txt. Bản sao này đã được thực hiện trong một cam kết mà chúng tôi đặt tên là cam kết CP.
Bạn muốn áp dụng tất cả các thay đổi cục bộ, cam kết Avà Bbên dưới, được thực hiện trên original.txttệp mới copy.txt.
---- X -----CP------ (master)
\
\--A---B--- (local)
Tạo một nhánh ném movetại điểm bắt đầu của những thay đổi của bạn với git branch move X. Có nghĩa là, đặt movechi nhánh tại cam kết X, một chi nhánh trước các cam kết bạn muốn hợp nhất; rất có thể, đây là cam kết mà bạn đã phân nhánh để thực hiện các thay đổi của mình. Như người dùng @digory doo đã viết dưới đây, bạn có thể làm git merge-base master localđể tìm X.
---- X (move)-----CP----- (master)
\
\--A---B--- (local)
Trên nhánh này, ban hành lệnh đổi tên sau:
git mv original.txt copy.txt
Điều này đổi tên tập tin. Lưu ý rằng copy.txtchưa tồn tại trong cây của bạn tại thời điểm này.
Cam kết thay đổi của bạn (chúng tôi đặt tên cho cam kết này MV).
/--MV (move)
/
---- X -----CP----- (master)
\
\--A---B--- (local)
Bây giờ bạn có thể khởi động lại công việc của bạn trên đầu trang move:
git rebase move local
Điều này sẽ hoạt động mà không có vấn đề, và những thay đổi của bạn được áp dụng cho copy.txtchi nhánh địa phương của bạn.
/--MV (move)---A'---B'--- (local)
/
---- X -----CP----- (master)
Bây giờ, bạn không nhất thiết muốn hoặc cần phải có cam kết MVtrong lịch sử của chi nhánh chính của mình, bởi vì hoạt động di chuyển có thể dẫn đến xung đột với hoạt động sao chép tại cam kết CPtrong chi nhánh chính.
Bạn chỉ phải khởi động lại công việc của mình một lần nữa, loại bỏ thao tác di chuyển, như sau:
git rebase move local --onto CP
... nơi CPcam kết copy.txtđược giới thiệu ở chi nhánh khác. Điều này phản hồi tất cả các thay đổi copy.txttrên đầu trang của CPcam kết. Bây giờ, localchi nhánh của bạn chính xác như thể bạn luôn sửa đổi copy.txtvà không original.txt, và bạn có thể tiếp tục hợp nhất với những người khác.
/--A''---B''-- (local)
/
-----X-------CP----- (master)
Điều quan trọng là những thay đổi được áp dụng trên CPhoặc nếu không copy.txtsẽ không tồn tại và những thay đổi sẽ được áp dụng trở lại original.txt.
Hy vọng điều này là rõ ràng. Câu trả lời này đến muộn, nhưng điều này có thể hữu ích cho người khác.