Trong git, cách tìm nạp khác với pull và cách hợp nhất khác với rebase?


160

Tôi chỉ không thể hiểu điều này. Tôi đã đọc rất nhiều trên web và sách và một cái gì đó không ở trong đầu tôi. Ai đó có thể xin vui lòng cho tôi phiên bản giả như sau:

  • git tìm nạp vs kéo
  • hợp nhất git vs rebase

24
Tôi thông cảm với người hỏi. Các tài liệu và lời khuyên rất nặng nề và có thể hoán vị quy trình công việc lớn đến nỗi người ta vô cùng bối rối. Đầu người chỉ nổ tung và người ta không biết phải hỏi gì, điều đó không rõ ràng.
Ed Randall

3
Tại sao không chọn câu trả lời pestrella như được chấp nhận?
Arashsoft

@Arashsoft vì anh ta không được nhìn thấy kể từ năm 2013
VdeX

Câu trả lời:


415

tìm nạp vs kéo

fetch sẽ tải xuống bất kỳ thay đổi nào từ nhánh * từ xa, cập nhật dữ liệu kho lưu trữ của bạn, nhưng giữ nguyên nhánh * cục bộ của bạn.

pullsẽ thực hiện fetchvà bổ sung mergecác thay đổi vào chi nhánh địa phương của bạn.

Có gì khác biệt? pullcập nhật cho bạn chi nhánh địa phương với những thay đổi từ chi nhánh kéo. A fetchkhông tiến chi nhánh địa phương của bạn.

hợp nhất vs rebase

Cho lịch sử sau:

          C --- D --- E địa phương
         /
    A --- B --- F --- G từ xa

mergetham gia hai lịch sử phát triển với nhau. Nó thực hiện điều này bằng cách phát lại các thay đổi xảy ra trên nhánh cục bộ của bạn sau khi nó chuyển hướng trên đỉnh của nhánh từ xa và ghi lại kết quả vào một cam kết mới. Hoạt động này bảo tồn tổ tiên của mỗi cam kết.

Tác dụng của a mergesẽ là:

          C --- D --- E địa phương
         / \
    A --- B --- F --- G --- H từ xa

rebasesẽ thực hiện các cam kết tồn tại trong chi nhánh địa phương của bạn và áp dụng lại chúng trên đầu chi nhánh từ xa. Hoạt động này viết lại tổ tiên của các cam kết địa phương của bạn.

Tác dụng của a rebasesẽ là:

                  C '- D' - E 'cục bộ
                 /
    A --- B --- F --- G từ xa

Có gì khác biệt? A mergekhông thay đổi tổ tiên của các cam kết. A rebase viết lại tổ tiên của các cam kết địa phương của bạn.

*Cách giải thích này giả định rằng các chi nhánh hiện nay là một chi nhánh địa phương, và rằng các chi nhánh quy định như đối số tới fetch, pull, merge, hoặc rebaselà một chi nhánh từ xa. Đây là trường hợp thông thường. pull, ví dụ, sẽ tải xuống bất kỳ thay đổi nào từ nhánh được chỉ định , cập nhật kho lưu trữ của bạn và mergecác thay đổi vào nhánh hiện tại .


31
Điều này cho đến nay là giải thích đơn giản nhất và tốt nhất mà không đi vào cuộc tranh luận đằng sau mỗi thực hành. Cảm ơn bạn!
Jonathan S. Fisher

3
Câu trả lời hoàn toàn vàng
ChaseMoskal

5
Ước gì tôi có thể "yêu thích" câu trả lời này. Có lẽ tôi sẽ chỉ in nó và dán nó lên tường của tôi.
LarsH

2
Tôi muốn nói câu trả lời hay nhất mà tôi có trong stackoverflow, Cảm ơn bạn
Shahab J

1
Nếu chỉ tìm nạp các thay đổi từ nhánh từ xa và cập nhật dữ liệu kho lưu trữ, nhưng giữ cho nhánh cục bộ không thay đổi, thì điểm tìm nạp là gì nếu thư mục làm việc không hiển thị / phản ánh các thay đổi? Câu hỏi ban đầu của tôi là làm thế nào tôi có thể thấy những thay đổi mà người khác đã thực hiện và sau đó quyết định liệu tôi có muốn hợp nhất chúng vào thư mục làm việc của mình không (ví dụ: thử nghiệm với những thay đổi của người khác để đảm bảo nó không phá vỡ công việc của tôi) nhưng tôi vẫn bối rối làm thế nào để làm điều đó? Tôi có nên chỉ xung và thử nghiệm / khám phá, và nếu nó có vấn đề, hãy thực hiện thiết lập lại cứng?

28

Tìm nạp vs Kéo

Git fetch chỉ cập nhật dữ liệu repo của bạn, nhưng về cơ bản, git pull sẽ thực hiện tìm nạp và sau đó hợp nhất các nhánh được kéo

Sự khác biệt giữa 'git pull' và 'git fetch' là gì?


Hợp nhất vs Rebase

từ Blog của Atlassian SourceTree, Hợp nhất hoặc Rebase :

Sáp nhập mang lại hai dòng phát triển cùng nhau trong khi bảo tồn tổ tiên của mỗi lịch sử cam kết.

Ngược lại, rebasing thống nhất các dòng phát triển bằng cách viết lại các thay đổi từ nhánh nguồn để chúng xuất hiện như là con của nhánh đích - giả vờ hiệu quả rằng các cam kết đó được viết trên đỉnh của nhánh đích.

Ngoài ra, hãy xem Tìm hiểu Phân nhánh Git , một trò chơi hay vừa được đăng lên HackerNews ( liên kết đến bài đăng ) và dạy rất nhiều thủ thuật phân nhánh và hợp nhất. Tôi tin rằng nó sẽ rất hữu ích trong vấn đề này.


cảm ơn Felips .. vậy nếu tôi thực hiện tìm nạp từ xa, chi nhánh chính của tôi sẽ không có bản cập nhật? Ngoài ra, có vẻ như tôi nên thực hiện rebase nhiều hơn sau đó
sáp nhập

rebase vs merge phụ thuộc vào ý định của bạn là gì, trong tâm trí rằng rebase viết lại tất cả các cam kết lịch sử. Và vâng, nếu bạn chỉ tìm nạp, nhánh chính sẽ không bị thay đổi, bạn sẽ phải hợp nhất (hoặc kéo) để áp dụng các thay đổi từ xa
Felipe Sabino

git merge <remote>/<branch>. ví dụ: nếu bạn là nhánh chính và điều khiển từ xa của bạn được đặt tên gốc, bạn có thể làm git merge origin/master.
Felipe Sabino

vì vậy có vẻ như tôi nên luôn luôn thực hiện một kiểm tra git master git fetch git diff origin / master git rebase origin master
techsjs2013 15/2/13

8

kéo vs tìm nạp :

Cách tôi hiểu điều này, git pullchỉ đơn giản là git fetchtheo sau git merge. Tức là bạn tìm nạp các thay đổi từ một nhánh từ xa và sau đó hợp nhất nó vào nhánh hiện tại.


hợp nhất vs rebase :

Hợp nhất sẽ làm như lệnh nói; hợp nhất sự khác biệt giữa nhánh hiện tại và nhánh được chỉ định (vào nhánh hiện tại). Tức là lệnh git merge another_branchsẽ hợp nhất another_branchvào nhánh hiện tại.

Một rebase hoạt động một chút khác nhau và là loại mát mẻ. Giả sử bạn thực hiện lệnh git rebase another_branch. Đầu tiên Git sẽ tìm phiên bản chung mới nhất giữa chi nhánh hiện tại và another_branch. Tức là điểm trước khi các nhánh chuyển hướng. Sau đó, git sẽ di chuyển điểm phân kỳ này đến đầu của another_branch. Cuối cùng, tất cả các cam kết trong nhánh hiện tại kể từ điểm phân kỳ ban đầu được phát lại từ điểm phân kỳ mới. Điều này tạo ra một lịch sử rất sạch sẽ, với ít chi nhánh và hợp nhất.

Tuy nhiên, nó không phải là không có cạm bẫy! Vì lịch sử phiên bản là "viết lại", bạn chỉ nên làm điều này nếu các xác nhận chỉ tồn tại trong repo git cục bộ của bạn. Đó là: Không bao giờ làm điều này nếu bạn đã đẩy các cam kết đến một repo từ xa.

Lời giải thích trên rebasing đưa ra trong này cuốn sách trực tuyến là khá tốt, với dễ hiểu minh họa.


kéo với rebasing thay vì hợp nhất

Tôi thực sự đang sử dụng rebase khá nhiều, nhưng thường thì nó được kết hợp với pull:

git pull --rebase

sẽ tìm nạp các thay đổi từ xa và sau đó rebase thay vì hợp nhất. Tức là nó sẽ phát lại tất cả các cam kết cục bộ của bạn từ lần cuối cùng bạn thực hiện thao tác kéo. Tôi thấy điều này sạch sẽ hơn nhiều so với thực hiện một thao tác kéo thông thường với việc hợp nhất, điều này sẽ tạo ra một cam kết bổ sung với việc hợp nhất.


Vì vậy, nếu tôi đang làm việc và chi nhánh và tôi muốn hợp nhất nó trở lại chủ trước khi tôi thực hiện một cú đẩy. Tôi nên kiểm tra chủ, sau đó có được sửa chữa rebase không?
techsjs2013

Tôi vẫn không chịu hợp nhất với rebase
techsjs2013

Tôi nghĩ rằng các minh họa được cung cấp bởi câu trả lời từ pestrella cho thấy sự khác biệt khá rõ ràng. Ngoài ra, hãy xem: git-scm.com/book/en/Git-Branching-Rebasing - một công việc khá hay để giải thích nó (cùng liên kết với câu trả lời, nhưng được đưa ra một lần nữa cho những người lười biếng).
Steinar

0

Hợp nhất - Chi nhánh CHÍNH sẽ tạo ra một cam kết mới, bảo tồn tổ tiên của mỗi lịch sử cam kết. Lịch sử có thể trở nên ô nhiễm nếu các cam kết hợp nhất được thực hiện bởi nhiều người làm việc trên cùng một nhánh song song.

Rebase - Viết lại các thay đổi của một nhánh lên một nhánh khác mà không tạo ra một cam kết mới. Lịch sử mã được đơn giản hóa, tuyến tính và có thể đọc được nhưng nó không hoạt động với các yêu cầu kéo, bởi vì bạn không thể thấy những thay đổi nhỏ mà ai đó đã thực hiện.

Tôi sẽ sử dụng git mergekhi xử lý luồng công việc dựa trên tính năng hoặc nếu tôi không quen với rebase. Nhưng, nếu tôi muốn có một lịch sử tuyến tính git rebaserõ ràng hơn thì phù hợp hơn. Để biết thêm chi tiết, hãy chắc chắn kiểm tra bài viết hợp nhất hoặc rebase này .

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.