2013-09-02 20 views
6

Tôi có hai cam kết hậu quả, một nơi nào đó trong lịch sử cục bộ và một tệp bị thêm nhầm vào thứ hai. Tôi muốn sửa chữa tình hình.Di chuyển các tệp giữa các cam kết

Tôi không hiểu cách tôi nên sử dụng tính năng rebase tương tác. Tôi đã làm git rebase -i HEAD~10 và được chọn để chỉnh sửa cam kết với tệp để kiểm tra nó từ đó. Tôi sử dụng git guit nhưng, không thấy tệp nào trong khu vực cam kết. Tôi có thể chọn để sửa đổi các cam kết trước đó sau đó tôi thấy các tập tin. Tuy nhiên, tôi không thể thêm tệp bị đặt sai vào cam kết trước đó vì tôi không thấy tệp trong cam kết hiện tại để bắt đầu.

+0

Hãy nhớ rằng việc thay đổi bất kỳ cam kết trước đây đã ghi lại lịch sử và bạn sẽ nhận được băm hoàn toàn mới kể từ lần commit đó.Đừng làm điều đó nếu cam kết đã được xuất bản. – aragaer

+0

@aragaer Tôi đã cố tình quy định rằng tôi viết lại lịch sử _LOCAL_. – Val

Trả lời

8

Nếu tôi không nhận được nó sai, những gì bạn muốn là di chuyển một số sự thay đổi đó đã được bao gồm cam 2 cam kết 1.

tôi thấy cách dễ nhất để làm điều đó đang làm hai rebases tương tác liên tục.

Trong trường hợp đầu tiên, bạn chia cam kết 2 thành hai cam kết: lần đầu tiên bao gồm thay đổi bạn muốn di chuyển và thứ hai bao gồm tất cả phần còn lại. Chúng tôi hiện cam kết 1, 2.1 và 2.2.

Sau đó, bạn rebase một lần nữa, và lần này chọn bí cam kết 2.1 vào 1.

16

Vì vậy, khi rebasing, hãy chọn chỉnh sửa cả cam kết mà bạn đã thêm tệp nhầm lẫn và tệp bạn muốn thêm vào theo thứ tự đó. Nếu tập tin là trong một cam kết sau đó, nhưng phải ở trong một trước đó, bạn sẽ phải sắp xếp lại các dòng. Ví dụ, tôi bắt đầu với

pick 8de731b Commit with missing file. 
pick bbef925 Commit with too many files. 
pick 52490ce More history. 

tôi cần phải thay đổi nó để

edit bbef925 Commit with too many files. 
edit 8de731b Commit with missing file. 
pick 52490ce More history. 

Sau đó,

# In the commit containing an extra file 
git reset HEAD^ badfile.c 
git commit --amend 
git rebase --continue 

# Now in the commit to add it to 
git add badfile.c 
git commit --amend 
git rebase --continue 

Thật không may, khi chỉnh sửa lịch sử trong một chi nhánh, tôi không biết bất kỳ cách nào để tránh chỉnh sửa lịch sử trong tất cả các nhánh. Rebasing nên được thực hiện càng sớm càng tốt để tránh các vấn đề như thế này. Trong trường hợp đơn giản của tôi ở đây, tôi có thể kết hợp tổng thể và chi nhánh khác, nhưng cam kết không hợp nhất, sau đó tôi phải rebase trong tổng thể, và sắp xếp lại và dẹp cam kết, như thế này:

pick 7cd915f Commit with missing file. 
fixup 8de731b Commit with missing file. #This was the higher of the two entries 
pick 8b92c5a Commit with too many files. 
fixup bbef925 Commit with too many files. #This was the higher of the two entries 
pick 94c3f7f More history. 
fixup 52490ce More history. #This was the higher of the two entries 

Cuối chỉnh sửa: Tôi chỉ nhận thấy tôi đã vô tình sắp xếp lại lịch sử cam kết như một sự chuyển giao từ câu trả lời ban đầu của tôi. Trao đổi các dòng trong rebase thay đổi thứ tự bạn cam kết; sau khi chỉnh sửa, bạn có thể rebase lại và hoán đổi lại để quay lại lệnh commit ban đầu.

+0

Các badfile đã được thêm vào sau này chứ không phải là quá sớm. Bạn có nói rằng tôi nên tạo một chi nhánh mới tại thời điểm lịch sử? – Val

+0

Tôi đã quản lý để di chuyển tệp trong nhánh mới, đã có cam kết thứ hai ở trên cùng. Nhưng, tôi có một vấn đề bây giờ rebasing toàn bộ lịch sử trên đầu của chi nhánh này. Có vẻ như hai cam kết của cuộc xung đột chính với hai cam kết của chi nhánh mới. – Val

+0

Tôi đã cập nhật câu trả lời, nhưng tiếc là cách duy nhất tôi biết để sửa lỗi này là chỉnh sửa lịch sử trong tất cả các nhánh, theo cách này hay cách khác. – dwarduk

5

Như tôi thường vấp ngã khi vấn đề này, tôi đã viết một kịch bản cho việc này. Nó hoạt động hoàn toàn tự động. Bạn có thể tìm thấy nó trên Github. Sao chép nó vào hệ thống tệp cục bộ, thêm nó vào PATH và bạn sẽ có thể chạy nó như là:

mv-changes <source-commit> <destination-commit> <path>... 

Bạn cũng có thể chạy tập lệnh trong vỏ Git-Bash trên Windows.

Lưu ý rằng, nếu có thay đổi <path> trong các cam kết trung gian giữa source-commitdestination-commit, nó sẽ không hoạt động.

Chi tiết khác được cung cấp here.

+0

Nó không thực sự hoạt động hoàn toàn tự động vì nó bật lên trình soạn thảo nhưng nó rất tuyệt. Cảm ơn.. – Hunsu

Các vấn đề liên quan