คู่มือ

git clone: วิธีโคลนรีโพซิทอรีจาก GitHub และที่อื่น

อัปเดต: · Skillaria.Top

git clone ดาวน์โหลดรีโพซิทอรีรีโมตทั้งหมด ได้แก่ ไฟล์ ประวัติคอมมิตทั้งหมด และบรานช์ สร้างสำเนาในเครื่องพร้อม remote ชื่อ origin ที่ตั้งค่าไว้แล้ว คำสั่งพื้นฐานคือ git clone ที่อยู่รีโพซิทอรี แฟล็กช่วยเลือกโฟลเดอร์ บรานช์ หรือดาวน์โหลดเฉพาะคอมมิตล่าสุดด้วย --depth 1

คำสั่ง git clone สร้างสำเนาในเครื่องของรีโพซิทอรีรีโมตทั้งชุด ได้แก่ ไฟล์ ประวัติคอมมิตทั้งหมด บรานช์ และแท็ก นี่คือวิธีมาตรฐานในการเริ่มทำงานกับโปรเจกต์ที่อยู่บน GitHub, GitLab หรือเซิร์ฟเวอร์ขององค์กร ต่างจากการดาวน์โหลดไฟล์ ZIP ตรงที่โคลนคือรีโพซิทอรีสมบูรณ์ที่คอมมิตและส่งการเปลี่ยนแปลงกลับได้

การใช้งาน git clone พื้นฐาน

คัดลอกที่อยู่ของรีโพซิทอรี (บน GitHub คือปุ่มสีเขียว "Code") แล้วรัน:

git clone https://github.com/username/project.git
Cloning into 'project'...
remote: Enumerating objects: 1532, done.
remote: Counting objects: 100% (1532/1532), done.
remote: Compressing objects: 100% (812/812), done.
Receiving objects: 100% (1532/1532), 2.41 MiB | 6.10 MiB/s, done.
Resolving deltas: 100% (701/701), done.

Git จะสร้างโฟลเดอร์ project ในไดเรกทอรีปัจจุบัน (ชื่อมาจากที่อยู่โดยไม่รวม .git) จากนั้นเข้าไปในโฟลเดอร์:

cd project
git status

git clone ทำอะไรเบื้องหลัง

การโคลนไม่ใช่แค่การดาวน์โหลดไฟล์ การเข้าใจขั้นตอนเหล่านี้อธิบายว่าทำไมหลังโคลนทุกอย่าง "ใช้งานได้เลย" และที่มาของบรานช์ที่มีคำนำหน้า origin/ โดยขั้นตอนคือ:

  1. สร้างโฟลเดอร์และทำงานคล้ายกับ git init ในนั้น
  2. เพิ่ม remote ชื่อ origin ที่ชี้ไปยังที่อยู่ต้นทาง
  3. ดาวน์โหลดอ็อบเจกต์และการอ้างอิงทั้งหมด เทียบเท่ากับ git fetch
  4. สร้างบรานช์รีโมต origin/main, origin/develop และอื่น ๆ
  5. สร้างบรานช์ท้องถิ่นเริ่มต้น (มักเป็น main) เชื่อมกับ origin/main และแตกไฟล์ออกมา

ดังนั้นหลังโคลนไม่ต้องตั้งค่า git remote เอง git push และ git pull ใช้งานได้ทันที

git remote -v
origin  https://github.com/username/project.git (fetch)
origin  https://github.com/username/project.git (push)

การโคลนผ่าน HTTPS และ SSH

HTTPSSSH
ที่อยู่https://github.com/user/repo.gitgit@github.com:user/repo.git
รีโพซิทอรีสาธารณะโคลนได้โดยไม่ต้องยืนยันตัวตนต้องมีคีย์ SSH ที่เพิ่มในบัญชี
รีโพซิทอรีส่วนตัว การ pushต้องใช้ Personal Access Token แทนรหัสผ่านทำงานด้วยคีย์ ไม่ต้องพิมพ์รหัสผ่าน
เครือข่ายขององค์กรพอร์ต 443 เปิดเกือบทุกที่พอร์ต 22 บางครั้งถูกปิด

สำหรับการอ่านโปรเจกต์สาธารณะของคนอื่น HTTPS เพียงพอ สำหรับรีโพซิทอรีของคุณเองที่ push บ่อย ๆ SSH สะดวกกว่า:

git clone git@github.com:username/project.git

หากโคลนผ่าน HTTPS ไปแล้วและต้องการเปลี่ยนเป็น SSH ไม่จำเป็นต้องดาวน์โหลดใหม่:

git remote set-url origin git@github.com:username/project.git

การโคลนไปยังโฟลเดอร์ที่กำหนด

อาร์กิวเมนต์ที่สองคือชื่อหรือพาธของไดเรกทอรีปลายทาง:

# ไปยังโฟลเดอร์ที่ชื่อต่างกัน
git clone https://github.com/username/project.git my-copy

# ไปยังโฟลเดอร์ปัจจุบัน (ต้องว่างเปล่า)
git clone https://github.com/username/project.git .

หากโฟลเดอร์ปลายทางมีอยู่และไม่ว่าง Git จะปฏิเสธ: fatal: destination path 'project' already exists and is not an empty directory

การโคลนบรานช์ที่ต้องการ

ค่าเริ่มต้นหลังโคลนคือบรานช์เริ่มต้นของรีโพซิทอรีรีโมต หากต้องการให้อยู่บรานช์อื่นทันที ใช้ -b (--branch):

git clone -b develop https://github.com/username/project.git

โปรดทราบ: วิธีนี้ยังดาวน์โหลดทุกบรานช์ เพียงแต่คุณจะอยู่ที่ develop หากต้องการเฉพาะบรานช์เดียวโดยไม่มีบรานช์อื่น เพิ่ม --single-branch:

git clone -b develop --single-branch https://github.com/username/project.git

แฟล็ก -b รับชื่อแท็กได้ด้วย ซึ่งจะได้สถานะของโปรเจกต์ ณ วันรีลีส (ในโหมด detached HEAD):

git clone -b v2.1.0 --depth 1 https://github.com/username/project.git

บรานช์อื่นอยู่ที่ไหนหลังโคลน

ผู้เริ่มต้นมักแปลกใจว่า git branch แสดงเฉพาะ main บรานช์อื่นถูกดาวน์โหลดมาในฐานะบรานช์รีโมต ดูได้ดังนี้:

git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/develop
  remotes/origin/feature/login

หากต้องการเริ่มทำงานในบรานช์หนึ่ง แค่สลับด้วยชื่อสั้น Git จะสร้างบรานช์ท้องถิ่นที่ติดตามบรานช์รีโมตให้เอง:

git switch develop

โคลนแบบตื้น: --depth สำหรับรีโพซิทอรีขนาดใหญ่

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

git clone --depth 1 https://github.com/username/big-project.git

แฟล็ก --depth หมายถึง --single-branch ด้วย จึงได้เฉพาะบรานช์เริ่มต้นและหนึ่งคอมมิต หากภายหลังต้องการประวัติเต็ม ดาวน์โหลดเพิ่มได้:

git fetch --unshallow

ระบุความลึกอื่นได้ เช่น --depth 50 หรือจำกัดประวัติด้วยวันที่ผ่าน --shallow-since=2025-01-01 สำหรับการพัฒนาที่ต้องใช้งานจริง โคลนแบบตื้นไม่สะดวก เพราะ git log, git blame และการค้นหาในประวัติจะไม่สมบูรณ์

โคลนบางส่วน: --filter

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

git clone --filter=blob:none https://github.com/username/monorepo.git

วิธีนี้ยังคงประวัติทั้งหมดสำหรับ log และการสลับบรานช์ แต่ประหยัดการใช้เครือข่ายและพื้นที่ ต้องได้รับการรองรับจากเซิร์ฟเวอร์ GitHub และ GitLab รองรับ

มิเรอร์โคลนและการย้ายรีโพซิทอรี

โคลนปกติดึงบรานช์มาเป็นบรานช์รีโมตและไม่คัดลอกการอ้างอิงภายในของเซิร์ฟเวอร์ สำหรับการย้ายโปรเจกต์ไปยังโฮสต์อื่นหรือสร้างสำเนาสำรองแบบเหมือนกันทุกประการ ใช้ --mirror:

git clone --mirror https://github.com/username/project.git
cd project.git
git push --mirror git@gitlab.com:username/project.git

มิเรอร์คือรีโพซิทอรีแบบ bare ที่ไม่มีไฟล์ทำงาน และทุกบรานช์กับแท็กถูกเก็บเป็นบรานช์ท้องถิ่น คำสั่ง git push --mirror จะส่งทุกอย่างไปยังเซิร์ฟเวอร์ใหม่ และประวัติย้ายโดยไม่สูญเสีย โปรดทราบว่างาน pull request และการตั้งค่าของโฮสต์จะไม่ถูกย้ายด้วยวิธีนี้ เพราะเป็นข้อมูลของบริการ ไม่ใช่ของ Git

แฟล็ก --bare ที่คล้ายกันก็สร้างรีโพซิทอรีที่ไม่มีไดเรกทอรีทำงานเช่นกัน แต่คัดลอกเฉพาะบรานช์และแท็ก เหมาะสำหรับการตั้งรีโพซิทอรีกลางบนเซิร์ฟเวอร์ของตัวเองจากโปรเจกต์ที่มีอยู่

การโคลนพร้อมซับโมดูล

หากโปรเจกต์ใช้ git submodules โฟลเดอร์ของซับโมดูลจะว่างตามค่าเริ่มต้น เพื่อดาวน์โหลดทั้งหมดในครั้งเดียว:

git clone --recurse-submodules https://github.com/username/project.git

หากโคลนไปแล้วโดยไม่มีแฟล็ก ให้ดึงซับโมดูลเพิ่ม:

git submodule update --init --recursive

git clone, fork และการดาวน์โหลด ZIP

วิธีได้อะไรใช้เมื่อไร
git cloneรีโพซิทอรีเต็มพร้อมประวัติและ remoteทำงานกับโปรเจกต์ที่คุณมีสิทธิ์หรือต้องการประวัติ
Fork บน GitHubสำเนารีโพซิทอรีในบัญชีของคุณบนเซิร์ฟเวอร์ร่วมพัฒนาโปรเจกต์ของคนอื่นผ่าน pull request
Download ZIPเฉพาะไฟล์ ไม่มี .gitดูโค้ดอย่างรวดเร็ว ไม่วางแผนจะคอมมิต

fork และ clone ไม่ได้แข่งกัน ในงาน open source มักทำ fork บนเว็บไซต์ก่อน แล้วโคลน fork ของตัวเอง และเพิ่มต้นฉบับเป็น remote ตัวที่สอง:

git clone git@github.com:me/project.git
cd project
git remote add upstream https://github.com/author/project.git
git fetch upstream

ข้อผิดพลาดที่พบบ่อยของ git clone

"Repository not found"

พิมพ์ที่อยู่ผิดหรือรีโพซิทอรีเป็นส่วนตัวและคุณไม่มีสิทธิ์เข้าถึง GitHub ตอบว่า "not found" สำหรับรีโพซิทอรีส่วนตัวโดยตั้งใจ แทนที่จะตอบว่า "ไม่มีสิทธิ์" ตรวจที่อยู่และว่าคุณล็อกอินด้วยบัญชีที่ถูกต้อง

"Permission denied (publickey)"

โคลนผ่าน SSH แต่ยังไม่ได้ตั้งค่าคีย์ ตรวจด้วย ssh -T git@github.com เพิ่มคีย์สาธารณะในการตั้งค่าบัญชี หรือชั่วคราวให้โคลนผ่าน HTTPS

"Authentication failed" ผ่าน HTTPS

คุณใส่รหัสผ่านของบัญชี GitHub นานแล้วไม่ได้ใช้รหัสผ่านสำหรับการดำเนินการ Git ผ่าน HTTPS อีกต่อไป ให้ใช้ Personal Access Token แทน หาก Git จำข้อมูลที่ไม่ถูกต้องไว้ ให้ลบในตัวจัดการข้อมูลรับรองของระบบ

การขาดตอนกับรีโพซิทอรีขนาดใหญ่

ข้อผิดพลาดเช่น early EOF หรือ RPC failed มักเกี่ยวกับเครือข่ายที่ไม่เสถียรและขนาดโปรเจกต์ วิธีแก้คือโคลนแบบตื้น --depth 1 แล้วตามด้วย git fetch --unshallow หรือโคลนผ่าน SSH

ปัญหาการขึ้นบรรทัดใหม่บน Windows

หลังโคลน ไฟล์ทั้งหมดแสดงว่า "ถูกแก้ไข" นั่นคือการแปลง CRLF/LF ตั้งค่า git config --global core.autocrlf true บน Windows (หรือ input บน Linux และ macOS) และควรกำหนดกฎในไฟล์ .gitattributes ของโปรเจกต์ด้วย

สิ่งที่ควรทำทันทีหลังโคลน

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

  1. อ่าน README และ CONTRIBUTING โดยปกติจะอธิบายวิธีติดตั้ง dependencies รันเทสต์ และข้อตกลงการตั้งชื่อบรานช์ของโปรเจกต์
  2. ตรวจบรานช์และสถานะ git status และ git log --oneline -5 จะบอกว่าคุณอยู่ที่ไหนและมีการเปลี่ยนแปลงล่าสุดอะไรบ้าง
  3. สร้างบรานช์ของคุณเอง อย่าทำงานตรงใน main: git switch -c feature/my-task
  4. ตรวจผู้เขียนคอมมิต หากคอมพิวเตอร์มีหลายบัญชี (ส่วนตัวและที่ทำงาน) ตั้งอีเมลสำหรับรีโพซิทอรีนี้เฉพาะโดยไม่ใช้ --global: git config user.email "you@company.com"
  5. ติดตั้ง dependencies โฟลเดอร์อย่าง node_modules หรือ venv ไม่ได้เก็บไว้ในรีโพซิทอรี แต่สร้างในเครื่อง: npm install, pip install -r requirements.txt และอื่น ๆ

วิธีอัปเดตโคลนให้ทันสมัย

การโคลนทำเพียงครั้งเดียว หลังจากนั้นคอมมิตใหม่ของเพื่อนร่วมทีมจะถูกดึงมาจาก origin เดิม:

# ดูว่ามีอะไรใหม่บนเซิร์ฟเวอร์ โดยไม่เปลี่ยนแปลงอะไร
git fetch
git log --oneline main..origin/main

# merge การเปลี่ยนแปลงเข้าบรานช์ปัจจุบัน
git pull

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

สรุปคำสั่ง git clone

งานคำสั่ง
โคลนปกติgit clone <url>
ไปยังโฟลเดอร์ของตัวเองgit clone <url> <โฟลเดอร์>
ไปยังบรานช์ที่ต้องการทันทีgit clone -b <บรานช์> <url>
เฉพาะหนึ่งบรานช์git clone -b <บรานช์> --single-branch <url>
ไม่มีประวัติgit clone --depth 1 <url>
ไม่มีเนื้อหาไฟล์เก่าgit clone --filter=blob:none <url>
พร้อมซับโมดูลgit clone --recurse-submodules <url>
สำเนา bare สำหรับเซิร์ฟเวอร์git clone --bare <url>

สรุป

git clone ดาวน์โหลดรีโพซิทอรีทั้งชุดและตั้งค่าการเชื่อมกับเซิร์ฟเวอร์ผ่าน origin ให้โดยอัตโนมัติ หลังจากนั้นจึงคอมมิต push และ pull ได้โดยไม่ต้องตั้งค่าเพิ่ม สำหรับโปรเจกต์ของตัวเองใช้ SSH สำหรับโปรเจกต์ขนาดใหญ่ใช้ --depth หรือ --filter และสำหรับบรานช์ที่ต้องการใช้ -b การทำงานกับรีโมตรีโพซิทอรี push pull และ fetch ถูกอธิบายและฝึกจริงในหลักสูตร Git

คำถามที่พบบ่อย

git clone ต่างจาก git pull อย่างไร?

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

โคลนเฉพาะโฟลเดอร์เดียวจากรีโพซิทอรีได้หรือไม่?

ไม่ได้โดยตรง วิธีที่ใกล้ที่สุดคือโคลนบางส่วนด้วย --filter=blob:none --sparse แล้วรัน git sparse-checkout set พาธ จากนั้นจะมีเฉพาะโฟลเดอร์ที่ต้องการในไดเรกทอรีทำงาน

การโคลนใช้พื้นที่เท่าไร?

ประมาณขนาดของประวัติทั้งหมดในรูปแบบบีบอัด บวกกับไฟล์ของเวอร์ชันปัจจุบันที่แตกออกมา ดูขนาดรีโพซิทอรีได้ด้วย git count-objects -vH

โคลนรีโพซิทอรีในเครื่องได้หรือไม่?

ได้ ระบุพาธแทนที่อยู่: git clone /path/to/repo copy เหมาะสำหรับทดลองโดยไม่เสี่ยงกับสำเนาหลัก

ต้องรัน git init ก่อน git clone หรือไม่?

ไม่ git clone สร้างโฟลเดอร์และเริ่มต้นรีโพซิทอรีในนั้นให้เอง

เรียนหัวข้อนี้ผ่านวิดีโอ

หัวข้อนี้สอนอย่างละเอียดพร้อมฝึกปฏิบัติในคอร์ส “Git с нуля до уверенного разработчика”

ไปที่คอร์ส