2010-09-12 28 views
13

Tôi muốn chia commit đầu tiên trong kho git của mình, nhưng tôi không thể sử dụng rebase để làm điều này bởi vì một nút cha là bắt buộc. Tôi đã tìm thấy Edit the root commit in Git? hữu ích để sửa đổi cam kết đầu tiên, nhưng không chia tách nó. Làm thế nào tôi có thể chia nó?Tách cam kết đầu tiên trong git

Trả lời

10

Bạn chỉ có thể làm theo chính xác quá trình tương tự trong câu hỏi bạn đã liên kết với, nhưng sau khi kiểm tra ra các gốc cam, bạn có thể sử dụng git commit --amend để sửa đổi bản gốc cam kết và sau đó git commit để làm cho thêm cam kết trước khi tiếp tục với lệnh rebase.

Tùy thuộc vào cách bạn muốn tách cam kết, bạn có thể sử dụng git rm --cached để xóa tệp mà bạn muốn thêm vào lần commit thứ hai trước git commit --amend và chỉnh sửa bất kỳ tệp nào bạn muốn khác trước khi gọi git add trên các tệp đó một lần nữa trước khi bạn gọi git commit --amend.

Sau khi gọi git commit --amend, để đảm bảo rằng bạn cam kết chính xác tình trạng của rễ gốc cam kết bạn có thể gọi:

git checkout <sha1-of-original-root> -- . 

trước khi gọi git commit để làm cam kết thứ hai của rễ chia cam kết.

+1

(được viết lại) Bạn không muốn 'git reset --hard' tại đây. Bạn có thể sử dụng 'git reset - .', nhưng điều đó sẽ không" khôi phục "cây đang hoạt động, chỉ có chỉ mục. Có lẽ ý tưởng tốt nhất là 'git checkout - .' sẽ cập nhật chỉ mục và cây làm việc chứ không phải HEAD (để lại cho bạn sẵn sàng cam kết phần thứ hai của việc chia tách gốc). . Ý tưởng chính ở đây là cả * reset * và * checkout * sẽ thay đổi HEAD trừ khi bạn cho chúng một đối số đường dẫn. –

+0

@ Chris Johnsen: Bạn hoàn toàn chính xác. Tôi đã nghĩ về một giai đoạn hai thiết lập lại, con đường sau đó '- hard' nhưng sau đó đã không thực sự viết đó. Giải pháp thanh toán tốt hơn. –

2

Bạn có thể sử dụng tùy chọn --root nói rebase mà bạn muốn viết lại root/đầu tiên cam kết:

$ git rebase --interactive --root 

Sau đó, rễ cam kết sẽ hiển thị trong danh sách rebase TODO, và bạn có thể chọn để chỉnh sửa nó:

edit <root commit sha> <original message> 
pick <other commit sha> <message> 
... 

Đây là lời giải thích của --root từ the Git rebase docs:

Khôi phục tất cả các cam kết có thể truy cập từ <branch>, thay vì giới hạn chúng bằng một số <upstream>. Điều này cho phép bạn rebase (các) commit gốc trên một nhánh.

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