2015-05-16 16 views
17

Nếu anh ở dưới tình huống sau đây,Làm thế nào để sử dụng tương tác rebase trên đầu tiên (root) cam kết của một chi nhánh?

$ git log --oneline 
* abcdef commit #b 
* 123456 commit #a 

Tôi biết tôi luôn có thể chạy

$ git reset HEAD~ 
$ git commit --amend 

Tuy nhiên, tôi đã cố gắng để chạy

$ git rebase -i HEAD~2 

nhưng tôi đã nhận

fatal: Needed a single revision 
invalid upstream HEAD~2 

Do đó câu hỏi của tôi: có cách nào để sử dụng git rebase để đè bẹp hai cam kết này hay không?

Trả lời

23

Bạn muốn rebase vào thư mục gốc cam kết của chi nhánh master của bạn. Cụ thể hơn, dẹp hai cam kết, bạn cần phải chạy

git rebase -i --root 

và sau đó thay thế squash cho pick trên dòng thứ hai trong bộ đệm của trình biên tập bật lên:

pick 123456 a               
squash abcdef b 

Tôi giới thiệu bạn đến git-rebase man page để biết thêm chi tiết về cờ rằng:

--root

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) cam kết gốc trên một chi nhánh. [...]

Ví dụ về một rebase tương tác của các gốc

# Set things up 
$ mkdir testgit 
$ cd testgit 
$ git init 

# Make two commits 
$ touch README 
$ git add README 
$ git commit -m "add README" 
$ printf "foo\n" > README 
$ git commit -am "write 'foo' in README" 

# Inspect the log 
$ git log --oneline --decorate --graph 
* 815b6ca (HEAD -> master) write 'foo' in README 
* 630ede6 add README 

# Rebase (interactively) the root of the current branch: 
# - Substitute 'squash' for 'pick' on the second line; save and quit the editor. 
# - Then write the commit message of the resulting commit; save and quit the editor. 
$ git rebase -i --root 
[detached HEAD c9003cd] add README; write 'foo' in README 
Date: Sat May 16 17:38:43 2015 +0100 
1 file changed, 1 insertion(+) 
create mode 100644 README 
Successfully rebased and updated refs/heads/master. 

# Inspect the log again 
$ git log --oneline --decorate --graph 
* c9003cd (HEAD -> master) add README; write 'foo' in README 
8

Dường như tham số này có thể giúp:

--root 

rebase tất cả các cam kết truy cập từ < chi nhánh >, thay vì hạn chế chúng với một < thượng nguồn >. Điều này cho phép bạn để rebase gốc cam kết (s) trên một chi nhánh.

này nên cho phép bạn bí (Tôi đoán bạn thực sự muốn fixup) thứ hai của bạn cam kết vào đầu tiên:

git rebase --root -i 

Chăm sóc trong việc tìm hiểu những gì các tùy chọn --root không, bởi vì trong trường hợp của bạn nó đáp ứng nhu cầu của bạn, nhưng có thể khó khăn ví dụ khi được sử dụng trong các chi nhánh, bởi vì nó sẽ rebase lên tổ tiên xa nhất trong lịch sử có thể truy cập (tức là gốc của cây); nên rebase --root sẽ rebase z trên a-A-B-D-E-X-Y-Z:

master  A-B-C 
       \ 
upstream  D-E 
        \  
current branch  X-Y-Z 
+0

tôi đã gõ câu trả lời của tôi cùng lúc :) – Jubobs

+1

vâng; tôi đã nhấp vào "đăng câu trả lời của bạn" và tải lại trang đã mang cả hai câu trả lời trở lại :) nhưng bạn đã gặp khó khăn thứ hai;) –

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