2014-04-10 16 views
17

tôi đã sử dụng git init để tạo ra một repo tươi, sau đó thực hiện ba cam kết. Bây giờ tôi muốn rebase để quay trở lại và sửa đổi cam kết đầu tiên của tôi, nhưng nếu tôi làm git rebase -i HEAD~3 nó than phiền! Nếu tôi thử cùng với HEAD~2 thì nó sẽ hoạt động nhưng chỉ cho phép tôi sắp xếp lại hai lần commit cuối cùng.Làm cách nào để git rebase commit đầu tiên?

Làm thế nào để đề cập đến 'cam kết trước khi có bất kỳ cam kết' hoặc quay trở lại và chèn một trống cam kết?

+0

Darnit, dup of http://stackoverflow.com/questions/11987914/how-do-i-reword-the-very-first-git-commit-message – lxs

Trả lời

28

Cách dễ dàng, với một git gần đây-đủ (điều này đã được ra trong một thời gian dài bây giờ vì vậy bạn nên có điều này):

git rebase -i --root 

Cách dễ dàng khác, là twalberg noted in a comment, là sử dụng git checkout --orphan để thiết lập để thực hiện cam kết gốc mới, bạn có thể sao chép các cam kết cũ ở trên cùng. (Đây là những gì rebase -i --root kết thúc bằng cách thực hiện nội bộ.)

0

Theo như tôi có thể nói, bạn không thể tham khảo các 'cam kết trước khi có bất kỳ cam kết'. Cũng không dễ để thêm cam kết mà không có cha mẹ. Tuy nhiên bạn có thể sửa đổi ban đầu cam kết sau đó chọn ban đầu trở lại vào lúc:

$ git log --pretty=oneline 
333333 commit three 
222222 commit two 
111111 commit one 
$ git reset --hard 111111 
$ rm -fr * 
$ git commit -a --amend --allow-empty -m "Initial commit" 
$ git cherry-pick 111111 222222 333333 
$ git log --pretty=oneline 
333333 commit three 
222222 commit two 
111111 commit one 
2c5e01 Initial commit 
+0

Trên thực tế, với các phiên bản mới đủ của 'git', bạn có thể 'git checkout newbranch' --orphan để tạo ra một chi nhánh mới có cam kết đầu tiên sẽ không có cha mẹ ... Từ đó, một' git rebase --onto' hoặc một loạt của 'git cherry-pick' (NB tôi không nghĩ rằng 'git pick' là một điều ...) có thể được sử dụng để sao chép các phi gốc khác cam kết trên ... – twalberg

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