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
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:
Câu trả lời:
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.
pull
sẽ thực hiện fetch
và bổ sung merge
các thay đổi vào chi nhánh địa phương của bạn.
Có gì khác biệt? pull
cậ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 fetch
không tiến chi nhánh địa phương của bạn.
Cho lịch sử sau:
C --- D --- E địa phương / A --- B --- F --- G từ xa
merge
tham 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 merge
sẽ là:
C --- D --- E địa phương / \ A --- B --- F --- G --- H từ xa
rebase
sẽ 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 rebase
sẽ là:
C '- D' - E 'cục bộ / A --- B --- F --- G từ xa
Có gì khác biệt? A merge
khô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 rebase
là 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à merge
các thay đổi vào nhánh hiện tại .
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.
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
.
kéo vs tìm nạp :
Cách tôi hiểu điều này, git pull
chỉ đơn giản là git fetch
theo 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_branch
sẽ hợp nhất another_branch
và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.
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 merge
khi 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 rebase
rõ 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 .