Nói một cách đơn giản, nếu bạn chuẩn bị lên máy bay mà không có kết nối Internet ... trước khi khởi hành, bạn có thể làm git fetch origin <master>
. Nó sẽ tìm nạp tất cả các thay đổi vào máy tính của bạn, nhưng tách biệt nó khỏi không gian làm việc / phát triển cục bộ của bạn.
Trên máy bay, bạn có thể thực hiện các thay đổi đối với không gian làm việc cục bộ của mình và sau đó hợp nhất nó với những gì bạn đã tìm nạp và giải quyết xung đột hợp nhất tiềm năng mà không cần kết nối với Internet. Và trừ khi ai đó đã thực hiện các thay đổi xung đột mới đối với kho lưu trữ từ xa thì một khi bạn đến đích bạn sẽ làm git push origin <branch>
và đi lấy cà phê.
Từ hướng dẫn tuyệt vời này của Atlassian :
Các git fetch
lệnh tải cam kết, tập tin, và refs từ một kho lưu trữ từ xa vào kho lưu trữ tại địa phương.
Tìm nạp là những gì bạn làm khi bạn muốn xem những gì mọi người đang làm việc. Nó tương tự như bản cập nhật SVN ở chỗ nó cho phép bạn xem lịch sử trung tâm đã tiến triển như thế nào, nhưng nó không buộc bạn phải thực sự hợp nhất các thay đổi vào kho lưu trữ của mình. Git cô lập nội dung được tìm nạp như một nội dung hiện có , nó hoàn toàn
không ảnh hưởng đến công việc phát triển địa phương của bạn . Nội dung tìm nạp phải được kiểm tra rõ ràng bằng cách sử dụnggit checkout
lệnh. Điều này làm cho việc tìm nạp một cách an toàn để xem xét các cam kết trước khi tích hợp chúng với kho lưu trữ cục bộ của bạn.
Khi tải xuống nội dung từ một kho lưu trữ từ xa git pull
và git fetch
các lệnh có sẵn để hoàn thành nhiệm vụ. Bạn có thể xem xét
git fetch
phiên bản 'an toàn' của hai lệnh. Nó sẽ tải xuống nội dung từ xa, nhưng không cập nhật trạng thái làm việc của kho lưu trữ cục bộ của bạn, giữ nguyên công việc hiện tại của bạn. git pull
là sự thay thế tích cực hơn, nó sẽ tải xuống nội dung từ xa cho nhánh cục bộ đang hoạt động và ngay lập tức thực thi git merge
để tạo một cam kết hợp nhất cho nội dung từ xa mới. Nếu bạn có các thay đổi đang chờ xử lý, điều này sẽ gây ra xung đột và khởi động luồng giải quyết xung đột hợp nhất.
Với git pull
:
- Bạn không nhận được bất kỳ sự cô lập.
- Nó ảnh hưởng đến sự phát triển địa phương của bạn.
- Nó không cần phải được kiểm tra rõ ràng. Bởi vì nó mặc nhiên làm một
git merge
.
- Về cơ bản nó KHÔNG an toàn. Nó hung hăng.
- Không giống như
git fetch
nơi nó chỉ ảnh hưởng đến bạn .git/refs/remotes
, git pull sẽ ảnh hưởng đến cả bạn .git/refs/remotes
và .git/refs/heads/
Hmmm ... vậy nếu tôi không cập nhật bản sao làm việc git fetch
, vậy tôi sẽ thay đổi ở đâu? Trường hợp Git tìm nạp các cam kết mới?
Câu hỏi tuyệt vời. Nó đặt nó ở một nơi nào đó tách biệt với bản sao làm việc của bạn. Nhưng lại ở đâu? Hãy cùng tìm hiểu.
Trong thư mục dự án của bạn (tức là nơi bạn thực hiện các git
lệnh của mình ) làm:
ls
. Điều này sẽ hiển thị các tập tin và thư mục. Không có gì mát mẻ, tôi biết.
Bây giờ làm ls -a
. Điều này sẽ hiển thị các tệp chấm , tức là các tệp bắt đầu bằng .
Bạn sau đó sẽ có thể thấy một thư mục có tên : .git
.
- Làm
cd .git
. Điều này rõ ràng sẽ thay đổi thư mục của bạn.
- Bây giờ đến phần thú vị; làm
ls
. Bạn sẽ thấy một danh sách các thư mục. Chúng tôi đang tìm kiếm refs
. Làm cd refs
.
- Thật thú vị khi xem những gì bên trong tất cả các thư mục, nhưng hãy tập trung vào hai trong số chúng.
heads
và remotes
. Sử dụng cd
để kiểm tra bên trong chúng quá.
- Bất cứ
git fetch
điều gì bạn làm sẽ cập nhật các mục trong /.git/refs/remotes
thư mục. Nó sẽ không cập nhật bất cứ điều gì trong /.git/refs/heads
thư mục.
- Bất kỳ
git pull
đầu tiên sẽ làm git fetch
, cập nhật các mục trong /.git/refs/remotes
thư mục, sau đó hợp nhất với cục bộ của bạn và sau đó thay đổi đầu trong /.git/refs/heads
thư mục.
Một câu trả lời liên quan rất tốt cũng có thể được tìm thấy ở đâu 'git fetch' tự đặt nó ở đâu? .
Ngoài ra, hãy tìm "Ký hiệu gạch chéo" từ bài đăng quy ước đặt tên nhánh Git . Nó giúp bạn hiểu rõ hơn về cách Git đặt mọi thứ trong các thư mục khác nhau.
Để thấy sự khác biệt thực tế
Cứ làm đi:
git fetch origin master
git checkout master
Nếu chủ từ xa được cập nhật, bạn sẽ nhận được một tin nhắn như thế này:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Nếu bạn không fetch
và chỉ cần làm git checkout master
thì git địa phương của bạn sẽ không biết rằng có 2 cam kết được thêm vào. Và nó sẽ chỉ nói:
Already on 'master'
Your branch is up to date with 'origin/master'.
Nhưng điều đó đã lỗi thời và không chính xác. Đó là bởi vì git sẽ cung cấp cho bạn thông tin phản hồi chỉ dựa trên những gì nó biết. Nó không biết gì về những cam kết mới mà nó chưa bị kéo xuống ...
Có cách nào để xem những thay đổi mới được thực hiện từ xa trong khi làm việc trên nhánh cục bộ không?
Một số IDE (ví dụ Xcode) siêu thông minh và sử dụng kết quả của a git fetch
và có thể chú thích các dòng mã đã được thay đổi trong nhánh từ xa của nhánh làm việc hiện tại của bạn. Nếu dòng đó đã được thay đổi bởi cả thay đổi cục bộ và nhánh từ xa, thì dòng đó sẽ được chú thích bằng màu đỏ. Đây không phải là một cuộc xung đột hợp nhất. Đó là một xung đột hợp nhất tiềm năng . Đó là một headup mà bạn có thể sử dụng để giải quyết xung đột hợp nhất trong tương lai trước khi thực hiện git pull
từ chi nhánh từ xa.
Mẹo thú vị:
Nếu bạn đã tìm nạp một nhánh từ xa, ví dụ:
git fetch origin feature/123
Sau đó, điều này sẽ đi vào thư mục điều khiển từ xa của bạn. Nó vẫn không có sẵn cho thư mục địa phương của bạn. Tuy nhiên, nó đơn giản hóa việc thanh toán của bạn đến chi nhánh từ xa đó bằng DWIM (Làm theo ý tôi):
git checkout feature/123
bạn không còn cần phải làm:
git checkout -b feature/123 origin/feature/123
Để biết thêm về điều đó đọc ở đây