2013-03-24 37 views

Trả lời

32

git pull --rebase sẽ fetch (git fetch) trước tiên, cập nhật upstream/master cam kết.

Nếu bạn chỉ rebase mà không cần cập nhật lần đầu upstream/master, bạn sẽ không nhận được kết quả tương tự.

tôi minh họa nó trong "master branch and 'origin/master' have diverged, how to 'undiverge' branches'?"


SnakE đề cập in the comments rằng git pull --rebase không phải là chính xác git fetch && git rebase origin/master.
Xem "what does "git pull --rebase" do?"

(origin/master) 
    | 
A--B--C (master) 
\ 
    B'--D (actual origin/master after changing B and force pushing) 

git pull --rebase không, trong trường hợp này, là:

git fetch origin 
git rebase --onto origin/master B master 

đây:

  • nguồn gốc/master là mới cập nhật origin/master (B')
  • B là 0 cũ(trước một Truy xuất cập nhật nó)
  • master là chi nhánh để phát lại trên đầu trang của origin/master

Điều này khác với git fetch + git rebase origin/master trong đó các lệnh pull --rebase cố gắng tìm ra các cam kết là thực sự địa phương của bạn những cái đã đến từ thượng lưu trong một lần tìm nạp trước đó.

Để thực hiện việc này, nó xem xét việc sửa lại nhánh theo dõi từ xa (origin/master, trong trường hợp này). Thông báo này thể hiện các mẹo về các hoạt động liên tiếp git fetch trên origin, theo thứ tự "gần đây nhất đầu tiên".

Đối với mỗi mục nhập lại, (origin/[email protected]{1}, sau đó ...{2}, v.v.) nó sẽ kiểm tra xem cam kết đó có phải là tổ tiên của đầu nhánh hiện tại master hay không. Ngay sau khi nó tìm thấy một, nó chọn nó như là điểm khởi đầu cho rebase (B trong ví dụ trên).

+10

Vì vậy, 'git pull --rebase upstream master' tương tự như' git fetch upstream && git rebase upstream/master'? – Dennis

+0

@Dennis khá nhiều, vâng. – VonC

+2

Thực tế là không. Hãy tưởng tượng bạn đã kéo lịch sử 'A-B' và thay đổi nó,' A-B-C'. Sau đó, một người khác sửa đổi 'B' thành' B'' và foce đẩy những thay đổi của họ để nguồn gốc bây giờ là 'A-B'-D'. Bây giờ nếu bạn làm 'git fetch && git rebase origin/master' thì rebase sẽ thất bại với các xung đột. Tuy nhiên 'git pull --rebase' sẽ tìm ra và kết thúc bằng' A-B'-D-C'. Một số phép thuật chắc chắn đang xảy ra dưới thảm trong 'pull --rebase'. Chỉnh sửa: [prooflink] (http://gitolite.com/git-pull--rebase.html) – SnakE