Có sự khác biệt giữa git rebase upstream/master
và git pull --rebase upstream master
và nếu có thì sao? Điều khiển từ xa có thể là từ xa, không nhất thiết phải ngược dòng.git rebase upstream/master vs git pull --rebase ngược dòng master
Trả lời
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)
gì 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ủaorigin/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ếpgit fetch
trênorigin
, 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ạimaster
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).
Vì vậy, 'git pull --rebase upstream master' tương tự như' git fetch upstream && git rebase upstream/master'? – Dennis
@Dennis khá nhiều, vâng. – VonC
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