ความแตกต่างระหว่าง pull และ clone ใน git คืออะไร?


237

อะไรคือความแตกต่างระหว่างการทำ (หลังจากmkdir repoและcd repo):

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

ฉันหมายความว่าอย่างใดอย่างหนึ่งสั้นกว่า แต่นอกเหนือจากนั้นพวกเขาโดยทั่วไปทำสิ่งเดียวกัน

คำตอบ:


122

โดยทั่วไปแล้วจะเป็นแบบเดียวกันยกเว้นโคลนจะตั้งค่าสาขาการติดตามระยะไกลเพิ่มเติมไม่ใช่เพียงต้นแบบ ตรวจสอบหน้าคน :

โคลนที่เก็บลงในไดเรกทอรีที่สร้างขึ้นใหม่สร้างสาขาการติดตามระยะไกลสำหรับแต่ละสาขาในที่เก็บโคลน (มองเห็นได้โดยใช้ git branch -r) และสร้างและตรวจสอบสาขาเริ่มต้นที่แยกจากสาขาที่ใช้งานอยู่ในปัจจุบันของที่เก็บโคลน


10
git fetch - ทั้งหมดตั้งค่าการติดตามระยะไกลเพิ่มเติมดังนั้นโดยพื้นฐานแล้วพวกมันเหมือนกัน
cmcculloh

251

git cloneคือวิธีที่คุณได้รับสำเนาของที่เก็บที่มีอยู่เพื่อทำงาน โดยปกติจะใช้เพียงครั้งเดียวสำหรับที่เก็บข้อมูลที่กำหนดเว้นแต่ว่าคุณต้องการมีสำเนาที่ใช้งานได้หลายชุด (หรือต้องการได้รับสำเนาที่สะอาดหลังจากเลอะค่าท้องถิ่นของคุณ ... )

git pull(หรือgit fetch+ git merge) คือวิธีที่คุณอัพเดตสำเนาโลคัลนั้นด้วยคอมมิตใหม่จากที่เก็บรีโมต หากคุณกำลังทำงานร่วมกับผู้อื่นมันเป็นคำสั่งที่คุณจะทำงานเป็นประจำ

ตัวอย่างเช่นการแสดงครั้งแรกของคุณก็เป็นไปได้ที่จะเลียนแบบgit cloneด้วยการแบ่งประเภทของคำสั่งคอมไพล์อื่น ๆ แต่มันไม่ได้จริงๆกรณีที่git pullจะทำ "พื้นเดียวกัน" เป็นgit clone(หรือกลับกัน)


4
อะไรคือการโคลนแบบคอมไพล์ที่ทำไม่สำเร็จตามลำดับคำสั่งที่เกี่ยวข้องกับ "git pull"?
cmcculloh

21
@cmcculloh: ไม่มี - ลำดับที่คุณอธิบายประสบความสำเร็จในสิ่งที่ "git clone" ทำ ประเด็นก็คือ "git pull" ใช้เพื่อทำสิ่งต่าง ๆ นอกเหนือจากที่คุณทำอยู่ - ไม่ต้องพูดถึงว่า "git pull" นั้นแท้จริงแล้วเป็นการรวมกันของ "git fetch; git merge <current branch> <origin / สาขาปัจจุบัน> " IOW คุณสามารถมีชีวิตอยู่ได้โดยไม่มีการโคลนนิ่งและดึงหากคุณต้องการ นอกจากนี้คุณสามารถดึงจากที่เก็บอื่นที่ไม่ใช่ที่คุณโคลน ฉันชอบคิดว่า 'clone' เป็น "ทำให้ฉันเป็นสำเนาของ repo นั้นในพื้นที่" และ 'pull' เป็น "รับการอัปเดตจากรีโมทที่ระบุ"
ebneter

120

ในภาษาฆราวาสเราสามารถพูดได้:

  • Clone : รับสำเนาการทำงานของที่เก็บระยะไกล
  • ดึง : ฉันกำลังดำเนินการอยู่กับสิ่งนี้โปรดรับการเปลี่ยนแปลงใหม่ที่อาจมีการปรับปรุงโดยผู้อื่น

3
ฉันคิดว่าคำจำกัดความดึงของคุณสามารถพูดได้สำหรับClone
henrywright

10
คุณจะทำงานกับสิ่งที่คุณไม่ได้ลอกแบบได้อย่างไร
Jyoti Prakash

ฉันไม่เข้าใจว่าคุณหมายถึงอะไร
henrywright

@henrywright หวังว่าคำตอบของ ebneter จะตอบคำถามของคุณ
Mrk

41

git clone หมายความว่าคุณกำลังสร้างสำเนาของที่เก็บในระบบของคุณ

git fork หมายความว่าคุณกำลังคัดลอกที่เก็บไปยังบัญชี Github ของคุณ

git pull หมายความว่าคุณกำลังดึงที่เก็บข้อมูลที่แก้ไขล่าสุด

git push หมายความว่าคุณกำลังส่งคืนพื้นที่เก็บข้อมูลหลังจากแก้ไข

ในระยะของคนธรรมดา:

git cloneกำลังดาวน์โหลดและgit pullกำลังรีเฟรช


9

โคลน : คัดลอกที่เก็บรีโมตเซิร์ฟเวอร์ไปยังเครื่องโลคัลของคุณ

pull : รับการเปลี่ยนแปลงใหม่ ๆ ที่เพิ่มเข้าไปในเครื่องของคุณ

นี่คือความแตกต่าง

โดยทั่วไปโคลนจะใช้เพื่อรับสำเนา repo ระยะไกล

การดึงใช้เพื่อดูรหัสเพื่อนร่วมทีมอื่น ๆ หากคุณกำลังทำงานเป็นทีม


5

git cloneใช้สำหรับการดาวน์โหลดเฉพาะสิ่งที่กำลังทำงานบนที่เก็บเซิร์ฟเวอร์ระยะไกลและบันทึกไว้ในโฟลเดอร์ของเครื่องที่วางโครงการนั้น ส่วนใหญ่จะใช้เฉพาะเมื่อเรากำลังจะอัปโหลดโครงการเป็นครั้งแรก หลังจากนั้นแรงดึงก็เป็นทางเลือกที่ดีกว่า

git pullนั้นเป็นการดำเนินการ (clone (download) + merge) และส่วนใหญ่จะใช้เมื่อคุณทำงานเป็นทีม กล่าวอีกนัยหนึ่งเมื่อคุณต้องการการเปลี่ยนแปลงล่าสุดในโครงการนั้นคุณสามารถดึง


3

Miss Clone: ​​ฉันได้รับสำเนาใหม่ไปยังท้องที่

Mr Pull: ฉันมีอยู่แล้วในเครื่องฉันเพิ่งอัพเดต


Miss Clone: ​​ฉันสามารถทำสิ่งที่คุณทำ! คุณเป็นเพียงส่วนย่อยของฉัน

Mr Pull: เหมือนกัน!


Miss Clone: ​​ไม่คุณไม่ได้สร้าง นี่คือสิ่งที่ฉันทำ:

  1. สร้างพื้นที่เก็บข้อมูลเปล่าที่ว่างเปล่า
  2. เติมสาขาการติดตามระยะไกล
  3. เรียกใช้ git fetch โดยไม่มีข้อโต้แย้ง

คุณทำได้แค่ # 3 จากนั้นคุณรวมซึ่งฉันไม่จำเป็นต้องทำ (ของฉันใหม่)

Mr Pull: กางเกงที่ฉลาดไม่เป็นไรฉันจะทำ "git init" ก่อน! ถ้าอย่างนั้นเราก็เหมือนกัน นอกจากนี้ฉันมีความสามารถพิเศษ 'ผสาน' ใน repo ที่มีอยู่! ซึ่งทำให้ฉันคำสั่งที่ใช้มากที่สุดใน Git;)


ผู้สร้าง Git: จับม้าของคุณ Mr Pull หาก --bare or --mirror ใช้กับ clone หรือ init การผสานของคุณจะไม่เกิดขึ้น มันยังคงเป็นแบบอ่านอย่างเดียว


คำตอบที่ไม่ถูกต้อง
sinekonata

2

อืมฉันจะเห็นอะไรในสาขาระยะไกล "4.2" เมื่อฉันดึงฉันจะทำอย่างไรเมื่อฉันโคลน บางสิ่งไม่ชัดเจนเหมือนกัน

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

VS

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

ฉันก็สังเกตเห็นเช่นนี้และฉันสงสัยว่าการเปลี่ยนแปลงค่าเริ่มต้นของ git เมื่อเวลาผ่านไปเป็นปัญหา ฉันมี 1.9.5.msysgit บน windows และ 2.3.2-applegit-55 สำหรับ mac
AnneTheAgile

2

git clone URL ---> โครงการหรือพื้นที่เก็บข้อมูลที่สมบูรณ์จะถูกดาวน์โหลดเป็นไดเรกทอรีแยก และไม่ใช่แค่การเปลี่ยนแปลง git pull URL ---> fetch + merge -> มันจะดึงเฉพาะการเปลี่ยนแปลงที่ทำไปแล้วและไม่ใช่โครงการทั้งหมด


1

ในขณะที่git fetchคำสั่งจะดึงการเปลี่ยนแปลงทั้งหมดบนเซิร์ฟเวอร์ที่คุณยังไม่ได้มันจะไม่แก้ไขไดเรกทอรีการทำงานของคุณเลย มันจะรับข้อมูลให้คุณและให้คุณรวมเข้าด้วยกัน อย่างไรก็ตามมีคำสั่งที่เรียกว่าgit pullซึ่งเป็นหลักgit fetchตามมาทันทีโดยgit mergeในกรณีส่วนใหญ่

อ่านเพิ่มเติม: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Pulling


1
แม้ว่าลิงก์นี้อาจตอบคำถามได้ดีกว่าหากรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงค์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
ekad

0

Clone -: มันจะสร้างสำเนาที่เหมือนกันของโปรเจ็กต์ repository ระยะไกลในเครื่องของคุณ

ดึง -: สมมติว่าคนสองคนหรือมากกว่าสองคนกำลังแชร์ที่เก็บเดียวกัน (สมมติว่าชื่อบุคคลอื่นคือ Syam) (A Repository เป็นสถานที่ที่โครงการของคุณมีอยู่ใน Github) ดังนั้นถ้า Syam ทำการเปลี่ยนแปลงบางอย่างในโครงการเดียวกันในท้องถิ่นของเขาและผลักดันมันไปยังพื้นที่เก็บข้อมูลระยะไกลดังนั้นสิ่งที่เปลี่ยนแปลง Syam ไม่สะท้อนในท้องถิ่นของคุณ ดังนั้นเพื่อสะท้อนถึงการเปลี่ยนแปลงใหม่เหล่านั้นในพื้นที่ของคุณคุณต้องใช้ git pull โดยรวมแล้วเราใช้ git pull เพื่ออัพเดทโครงการ

ดังนั้นโดยทั่วไปเราใช้ git clone เพียงครั้งเดียวในขณะที่เราใช้ git pull หลายครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.