2010-07-28 35 views
257

Another question cho biết git pull giống như một git fetch + git merge.git pull VS git tìm nạp git rebase

Nhưng điểm khác biệt giữa git pull VS git fetch + git rebase là gì?

+2

một người nào đó nên dọn dẹp liên kết ... và tôi ngạc nhiên trước số phiếu bầu mà một câu hỏi khác nhận được. – xenoterracide

+11

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

+34

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

Trả lời

292

Điều này khá rõ ràng từ câu hỏi của bạn rằng bạn thực sự chỉ 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 kéo từ nguồn gốc, cũng đã thực hiện một số công việc. Sau khi lấy, 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 vào thời điểm này (hành vi mặc định của git pull), giả sử không có bất kỳ mâu thuẫn, bạn kết thúc với điều này:

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

Nếu mặt khác bạn đã làm rebase thích hợp, bạn muốn 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 nên kết thúc như nhau trong cả hai trường hợp; bạn vừa tạo một lịch sử khác dẫn đến nó. Việc rebase ghi 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ủ mới của nguồn gốc hàng đầu (R), thay vì nơi bạn đã cam kết ban đầu (H). Bạn không bao giờ nên sử dụng cách tiếp cận rebase nếu ai đó đã kéo từ nhánh master của bạn.

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

+37

Wha t sẽ xảy ra nếu bạn đã rebase sau khi ai đó đã kéo từ chi nhánh chủ của bạn? Điều đó sẽ phá vỡ repo? –

+11

Làm thế nào để bạn biết nếu ai đó đã kéo từ chi nhánh chính của bạn? – Frank

+27

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

0

Trả lời câu lệnh đầu tiên của bạn 'git pull giống như git fetch + git merge.',

"Trong chế độ mặc định của nó, git pull là viết tắt cho git fetch tiếp theo git merge FETCH_HEAD" Chính xác hơn, git pull chạy git fetch với thông số nhất định và gọi git merge để hợp nhất lấy ra chi nhánh đầu vào chi nhánh hiện tại"

(Ref: https://git-scm.com/docs/git-pull)


Đối với tuyên bố thứ hai/câu hỏi của bạn: 'Nhưng sự khác biệt giữa git pull VS git là gì lấy + rebase git' Một lần nữa, từ cùng một nguồn:

"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 lấy và hợp nhất, đó là trả lời ở đây quá: https://git-scm.com/book/en/v2/Git-Branching-Rebasing (chênh lệch giữa thay đổi lịch sử phiên bản cách được ghi lại và những gì không)