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.txt
trên nhánh của mình ( local
nhá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 A
và B
bên dưới, được thực hiện trên original.txt
tệp mới copy.txt
.
---- X -----CP------ (master)
\
\--A---B--- (local)
Tạo một nhánh ném move
tạ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 move
chi 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.txt
chư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.txt
chi 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 MV
trong 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 CP
trong 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 CP
cam 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.txt
trên đầu trang của CP
cam kết. Bây giờ, local
chi nhánh của bạn chính xác như thể bạn luôn sửa đổi copy.txt
và 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 CP
hoặc nếu không copy.txt
sẽ 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.