Sự khác biệt giữa kéo và nhân bản trong git là gì?


237

Sự khác biệt giữa làm (sau mkdir repocd repo) là gì:

git init
git remote add origin git://github.com/cmcculloh/repo.git
git fetch --all
git pull origin master

git clone git://github.com/cmcculloh/repo.git

Ý tôi là, rõ ràng là một cái ngắn hơn, nhưng khác hơn là về cơ bản họ đang làm điều tương tự?

Câu trả lời:


122

Về cơ bản chúng giống nhau, ngoại trừ bản sao sẽ thiết lập các nhánh theo dõi từ xa bổ sung, không chỉ là chủ. Kiểm tra trang người đàn ông :

Nhân bản một kho lưu trữ vào một thư mục mới được tạo, tạo các nhánh theo dõi từ xa cho mỗi nhánh trong kho lưu trữ được nhân bản (hiển thị bằng git Branch -r), và tạo và kiểm tra một nhánh ban đầu được rẽ nhánh từ nhánh đang hoạt động của kho lưu trữ được sao chép.


10
git fetch --all thiết lập các nhánh theo dõi từ xa bổ sung, vì vậy về cơ bản chúng giống nhau.
cmcculloh

251

git clonelà cách bạn có được một bản sao cục bộ của một kho lưu trữ hiện có để làm việc. Nó thường chỉ được sử dụng một lần cho một kho lưu trữ nhất định, trừ khi bạn muốn có nhiều bản sao hoạt động của nó xung quanh. (Hoặc muốn có một bản sao sạch sau khi làm hỏng bản địa phương của bạn ...)

git pull(hoặc git fetch+ git merge) là cách bạn cập nhật bản sao cục bộ đó với các xác nhận mới từ kho lưu trữ từ xa. Nếu bạn đang cộng tác với người khác, đó là một lệnh mà bạn sẽ chạy thường xuyên.

Như ví dụ đầu tiên của bạn cho thấy, có thể mô phỏng git clonevới một loại lệnh git khác, nhưng thực sự không phải là trường hợp git pullthực hiện "về cơ bản giống như vậy" như git clone(hoặc ngược lại).


4
Cụ thể là git clone đang làm gì mà không được thực hiện bằng chuỗi các lệnh liên quan đến "git pull"?
cmcculloh

21
@cmcculloh: Không có gì - trình tự bạn mô tả có hiệu quả thực hiện những gì "git clone" làm. Vấn đề là "git pull" được sử dụng để làm nhiều việc khác ngoài những gì bạn đã làm ở đó - chưa kể rằng "git pull" thực sự là sự kết hợp chính xác của "git fetch; git merge <nhánh hiện tại> <origin / chi nhánh hiện tại> ". IOW, bạn có thể sống mà không cần nhân bản kéo nếu bạn thực sự muốn. Hơn nữa, bạn có thể lấy từ các kho lưu trữ khác với kho mà bạn đã nhân bản. Tôi thích nghĩ về 'bản sao' là "làm cho tôi một bản sao cục bộ của repo đó" và 'pull' là "giúp tôi cập nhật từ một số điều khiển từ xa được chỉ định."
ebneter

120

Trong ngôn ngữ giáo dân chúng ta có thể nói:

  • Clone : Nhận một bản sao làm việc của kho lưu trữ từ xa.
  • Pull : Tôi đang làm việc này, xin vui lòng cho tôi những thay đổi mới có thể được cập nhật bởi những người khác.

3
Tôi nghĩ định nghĩa Pull của bạn cũng có thể được nói cho Clone
henrywright

10
Làm thế nào bạn có thể làm việc trên một cái gì đó mà bạn chưa nhân bản?
Jyoti Prakash

Tôi không hiểu ý bạn là gì?
henrywright

@henrywright hy vọng, câu trả lời của ebnet sẽ giải quyết câu hỏi của bạn
Mrk

41

git clone có nghĩa là bạn đang tạo một bản sao của kho lưu trữ trong hệ thống của bạn.

git fork có nghĩa là bạn đang sao chép kho lưu trữ vào tài khoản Github của bạn.

git pull có nghĩa là bạn đang tìm nạp kho lưu trữ sửa đổi cuối cùng.

git push có nghĩa là bạn đang trả lại kho lưu trữ sau khi sửa đổi nó.

Trong nhiệm kỳ của giáo dân:

git cloneđang tải xuống và git pullđang làm mới.


9

clone : sao chép kho lưu trữ máy chủ từ xa vào máy cục bộ của bạn.

kéo : nhận các thay đổi mới khác đã thêm vào máy cục bộ của bạn.

Đây là sự khác biệt.

Clone thường được sử dụng để có được bản sao repo từ xa.

Pull được sử dụng để xem các nhóm khác được thêm mã, nếu bạn đang làm việc theo nhóm.


5

git clone được sử dụng để chỉ tải xuống chính xác những gì hiện đang hoạt động trên kho lưu trữ máy chủ từ xa và lưu nó vào thư mục của máy nơi dự án đó được đặt. Chủ yếu là nó chỉ được sử dụng khi chúng ta sẽ tải lên dự án lần đầu tiên. Sau đó kéo là lựa chọn tốt hơn.

git pull về cơ bản là một hoạt động (clone (tải xuống) + merge) và chủ yếu được sử dụng khi bạn làm việc theo nhóm. Nói cách khác, khi bạn muốn những thay đổi gần đây trong dự án đó, bạn có thể kéo.


3

Miss Clone: ​​Tôi nhận được một bản sao mới cho địa phương.

Mr Pull: Tôi đã có nó tại địa phương, tôi chỉ cập nhật nó.


Miss Clone: ​​Tôi có thể làm những gì bạn làm! Bạn chỉ là tập hợp con của tôi.

Mr Kéo: Ditto!


Miss Clone: ​​Không, bạn không tạo. Đây là những gì tôi làm:

  1. Tạo kho trống
  2. Dân trí các chi nhánh theo dõi từ xa
  3. Chạy git fetch mà không cần đối số

Bạn chỉ làm số 3, và sau đó bạn hợp nhất, điều mà tôi không cần làm (của tôi là mới).

Mr Pull: Quần thông minh, không có vấn đề gì lớn, tôi sẽ làm "git init" trước! Rồi chúng ta cũng vậy. Thêm vào đó tôi có khả năng 'hợp nhất' thêm trên repo hiện có! Điều này làm cho tôi lệnh được sử dụng nhiều nhất trong Git;)


Người tạo Git: Giữ ngựa của bạn Mr Pull, nếu --bare hoặc --mirror được sử dụng với bản sao hoặc init, việc hợp nhất của bạn sẽ không xảy ra. Nó vẫn chỉ đọc.


Câu trả lời không nản lòng.
sinekonata

2

Hmm, thiếu gì khi thấy nhánh từ xa "4.2" khi tôi kéo, như tôi làm khi tôi nhân bản? Một cái gì đó rõ ràng không giống nhau.

tmp$  mkdir some_repo

tmp$  cd some_repo

some_repo$  git init
Initialized empty Git repository in /tmp/some_repo/.git/

some_repo$  git pull https://github.ourplace.net/babelfish/some_repo.git
  :
From https://github.ourplace.net/babelfish/some_repo
 * branch            HEAD       -> FETCH_HEAD

some_repo$  git branch
* master

đấu với

tmp$  rm -rf some_repo

tmp$  git clone https://github.ourplace.net/babelfish/some_repo.git
Cloning into 'some_repo'...
  :
Checking connectivity... done.

tmp$  cd some_repo

some_repo$  git branch
* 4.2

Tôi cũng nhận thấy điều này và tôi nghi ngờ rằng những thay đổi trong mặc định git theo thời gian là vấn đề. Tôi có 1.9.5.msysgit trên windows và 2.3.2-applegit-55 trên máy mac.
AnneTheAgile

2

git clone URL ---> Toàn bộ dự án hoặc kho lưu trữ sẽ được tải xuống dưới dạng thư mục riêng biệt. và không chỉ các thay đổi git pull URL ---> fetch + merge -> Nó sẽ chỉ tìm nạp các thay đổi đã được thực hiện chứ không phải toàn bộ dự án


1

Mặc dù git fetchlệnh sẽ tìm nạp tất cả các thay đổi trên máy chủ mà bạn chưa có, nhưng nó sẽ không sửa đổi thư mục làm việc của bạn. Nó chỉ đơn giản là lấy dữ liệu cho bạn và cho phép bạn tự hợp nhất nó. Tuy nhiên, có một lệnh được gọi git pulllà về cơ bản là git fetchngay lập tức theo sau git mergetrong hầu hết các trường hợp.

Đọc thêm: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Pulling


1
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
ekad

0

Clone -: Nó sẽ tạo bản sao chính xác của dự án kho lưu trữ từ xa trong máy cục bộ của bạn.

Kéo -: Giả sử hai hoặc nhiều hơn hai người đang chia sẻ cùng một kho lưu trữ. (Giả sử tên người khác là Syam) (Kho lưu trữ là nơi dự án của bạn tồn tại trong Github) Vì vậy, nếu Syam thực hiện một số thay đổi trong cùng một dự án tại địa phương của mình và đẩy nó vào kho lưu trữ từ xa. không phản ánh tại địa phương của bạn. Vì vậy, để phản ánh những thay đổi mới trong địa phương của bạn, bạn phải sử dụng git pull. Nhìn chung, chúng tôi sử dụng git pull để cập nhật dự án.

Vì vậy, về cơ bản chúng tôi chỉ sử dụng git clone một lần trong khi chúng tôi sử dụng git pull nhiều lần.

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.