git kéo VS git lấy Vs git rebase


294

Một câu hỏi khác cho biết git pullcũng giống như một git fetch+ git merge.

Nhưng sự khác biệt giữa git pullVS git fetch+ là git rebasegì?


2
ai đó nên xóa liên kết ... và tôi ngạc nhiên về số phiếu mà câu hỏi khác nhận được.
xenoterracide

13
@xeno: Tôi nghĩ rằng đó chỉ là số lượng người đi "Tôi cũng có câu hỏi này"
bobobobo

45
Một ngày nào đó tôi sẽ có thời gian để thực sự đọc tài liệu git, nhưng cho đến lúc đó, tôi đang thêm phiếu bầu của mình vào các loại câu hỏi này
Eran Medan

Câu trả lời:


336

Có một điều khá rõ ràng từ câu hỏi của bạn rằng bạn thực sự chỉ đang hỏi về sự khác biệt giữa git mergegit rebase.

Vì vậy, giả sử bạn đang ở trong trường hợp phổ biến - bạn đã thực hiện một số công việc trên nhánh chính của mình và bạn lấy từ nguồn gốc, cũng đã thực hiện một số công việc. Sau khi tìm nạp, mọi thứ trông như thế này:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

Nếu bạn hợp nhất tại thời điểm này (hành vi mặc định của git pull), giả sử không có bất kỳ xung đột nào, bạn sẽ kết thúc với điều này:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

Mặt khác, nếu bạn thực hiện rebase thích hợp, bạn sẽ kết thúc với điều này:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

Nội dung của cây công việc của bạn sẽ kết thúc giống nhau trong cả hai trường hợp; bạn vừa tạo ra một lịch sử khác nhau dẫn đến nó . Rebase viết lại lịch sử của bạn, làm cho nó trông như thể bạn đã cam kết trên nhánh chính mới của nguồn gốc ( R), thay vì nơi bạn đã cam kết ban đầu ( H). Bạn không bao giờ nên sử dụng phương pháp rebase nếu người khác đã rút khỏi nhánh chính của bạn.

Cuối cùng, lưu ý rằng bạn thực sự có thể thiết lập git pullcho một nhánh nhất định để sử dụng rebase thay vì hợp nhất bằng cách đặt tham số cấu hình branch.<name>.rebasethành true. Bạn cũng có thể làm điều này cho một lần kéo bằng cách sử dụng git pull --rebase.


39
Điều gì xảy ra nếu bạn định đuổi theo sau khi ai đó đã rút khỏi nhánh chính của bạn? Điều đó sẽ phá vỡ repo?
Didier A.

12
Làm thế nào để bạn biết nếu ai đó đã rút từ chi nhánh chủ của bạn?
Frank

29
Nếu bạn không biết chắc chắn rằng ai đó không có , bạn nên cho rằng họ có.
Chris Xuống

4
Tôi chỉ nghĩ rằng trừ khi bạn cũng đang thay đổi ở đâu đó ngoài nguồn gốc / chủ, tôi không thấy có vấn đề gì về việc ai đó đã thay đổi câu hỏi, bởi vì nếu bạn đã đẩy những thay đổi này thành nguồn gốc / Chủ nhân, sẽ không có gì để nổi loạn ngay từ đầu. Dường như với tôi, cảnh báo thực sự chỉ quan trọng trong trường hợp bạn có thứ gì đó phức tạp hơn X -> origin / X, nhưng tôi có thể sai. Nếu ai đó biết về một kịch bản tôi đang xem, xin vui lòng chia sẻ.
neverfox

1
@SteveChambers Không, đó không phải là kết quả. Các dòng chỉ đơn giản đại diện cho tổ tiên cam kết, tức là A là cha mẹ của B. Không có bất kỳ hàm ý nào về việc Q hoặc B là lần đầu tiên. Tất cả các hoạt động này được dựa trên biểu đồ cam kết, không phải thời gian. Rebase chỉ đơn giản là cấy ghép một số cam kết, với kết quả như tôi đã chỉ ra cho dù dấu thời gian cam kết là gì.
Cascabel

9

TLDR:

git pullcũng giống như chạy git fetchsau đó git merge
git pull --rebaselà như git fetchsau đógit rebase

Trả lời câu nói đầu tiên của bạn,

git pullgiống như một git fetch+ git merge.

"Trong chế độ mặc định của nó, git pull là tốc ký được git fetchtheo sau bởi git mergeFETCH_HEAD" Chính xác hơn, git pullchạy git fetchvới các tham số đã cho và sau đó gọi git mergeđể hợp nhất các đầu nhánh được truy xuất vào nhánh hiện tại "

(Tham khảo: https://git-scm.com/docs/git-pull )


Đối với câu hỏi / câu hỏi thứ hai của bạn:

'Nhưng sự khác biệt giữa git pullVS git fetch+ git rebase' là gì?

Một lần nữa, từ cùng một nguồn:
git pull --rebase

"Với --rebase, nó chạy git rebase thay vì git merge."


Bây giờ, nếu bạn muốn hỏi

'sự khác biệt giữa mergerebase'

điều đó cũng được trả lời ở đây:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(sự khác biệt giữa việc thay đổi lịch sử phiên bản được ghi lại)


2
Tôi muốn đề cập rằng "git pull --rebase" giống như "git fetch then git rebase" hầu hết thời gian - nhưng không phải lúc nào cũng vậy. Trong một số tình huống, "git pull --rebase" làm được nhiều hơn một chút. Xem ví dụ này thường được tham khảo ở đây: gitolite.com/git-pull--rebase
Daniel K.

1
Cảm ơn bạn rất nhiều cho câu trả lời của bạn. Tôi thực sự hiểu cách git fetch + git rebaselàm việc của các lệnh từ bây giờ. Không có ít nhiều xung đột trên cây git của chúng tôi kể từ bây giờ :)
Travis Le
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.