นี่คือคำตอบที่ยาว
รีโมท:
หากคุณใช้ Git ร่วมกันคุณอาจต้องซิงค์การกระทำของคุณกับเครื่องหรือสถานที่อื่น ๆ เครื่องหรือสถานที่แต่ละแห่งเรียกว่ารีโมทในคำศัพท์ของ Git และแต่ละเครื่องอาจมีสาขาอย่างน้อยหนึ่งสาขา ส่วนใหญ่แล้วคุณจะมีเพียงชื่อorigin
เดียว หากต้องการแสดงรายการรีโมตทั้งหมดให้รันgit remote
:
$ git remote
bitbucket
origin
คุณสามารถดูได้ว่าชื่อทางลัดเหล่านี้เป็นตำแหน่งทางลัดใดสำหรับสถานที่โดยเรียกใช้git remote -v
:
$ git remote -v
bitbucket git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com:Flimm/example.git (push)
แต่ละรีโมตมีไดเร็กทอรีภายใต้git/refs/remotes/
:
$ ls -F .git/refs/remotes/
bitbucket/ origin/
สาขาในเครื่องของคุณ:
TLDR: บนเครื่องท้องถิ่นของคุณคุณมีสาขาสามประเภท: สาขาที่ไม่ได้ติดตามในท้องถิ่นสาขาการติดตามในท้องถิ่นและสาขาที่ติดตามระยะไกล บนเครื่องระยะไกลคุณมีสาขาเพียงประเภทเดียว
1. สาขาท้องถิ่น
คุณสามารถดูรายการสาขาท้องถิ่นทั้งหมดในเครื่องของคุณโดยเรียกใช้git branch
:
$ git branch
master
new-feature
แต่ละสาขาในท้องถิ่นมีไฟล์ภายใต้.git/refs/heads/
:
$ ls -F .git/refs/heads/
master new-feature
เครื่องของคุณมีสาขาในท้องถิ่นสองประเภท: การไม่ติดตามสาขาในท้องถิ่นและการติดตามสาขาในท้องถิ่น
1.1 สาขาที่ไม่ได้ติดตามในท้องถิ่น
สาขาที่ไม่ได้ติดตามในท้องถิ่นจะไม่เชื่อมโยงกับสาขาอื่น ๆ git branch <branchname>
คุณสร้างโดยการทำงาน
1.2 ติดตามสาขาท้องถิ่น
การติดตามสาขาในท้องถิ่นนั้นเชื่อมโยงกับสาขาอื่นซึ่งมักเป็นสาขาที่ติดตามระยะไกล git branch --track <branchname> [<start-point>]
คุณสร้างโดยการทำงาน
คุณสามารถดูว่าสาขาใดสาขาหนึ่งในประเทศของคุณกำลังติดตามสาขาโดยใช้git branch -vv
:
$ git branch -vv
master b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message
จากเอาต์พุตของคำสั่งนี้คุณจะเห็นว่าสาขาโลคัลmaster
กำลังติดตามสาขาการติดตามรีโมตorigin/master
และสาขาโลคัลnew-feature
ไม่ได้ติดตามอะไร
.git/config
วิธีดูว่าสาขากำลังติดตามสาขาก็คือโดยมีลักษณะที่
การติดตามสาขาในพื้นที่นั้นมีประโยชน์ ช่วยให้คุณสามารถรันgit pull
และgit push
โดยไม่ต้องระบุสาขาต้นน้ำที่จะใช้ หากสาขาไม่ได้ตั้งค่าให้ติดตามสาขาอื่นคุณจะได้รับข้อผิดพลาดดังนี้:
$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream new-feature <remote>/<branch>
2. การติดตามระยะไกลสาขา (ยังอยู่ในเครื่องของคุณ)
คุณสามารถดูรายการสาขาติดตามระยะไกลทั้งหมดในเครื่องของคุณโดยเรียกใช้git branch -r
:
$ git branch -r
bitbucket/master
origin/master
origin/new-branch
แต่ละสาขาการติดตามระยะไกลมีไฟล์ใต้.git/refs/<remote>/
:
$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│ └── master
└── origin/
├── master
└── new-branch
คิดว่าสาขาการติดตามระยะไกลของคุณเป็นแคชในเครื่องของคุณสำหรับสิ่งที่มีเครื่องระยะไกล คุณสามารถอัปเดตสาขาการติดตามระยะไกลโดยใช้git fetch
ซึ่งgit pull
ใช้หลังฉาก
แม้ว่าข้อมูลทั้งหมดสำหรับสาขาการติดตามระยะไกลจะถูกเก็บไว้ในเครื่องของคุณ (เช่นแคช) แต่ก็ยังไม่เคยเรียกว่าสาขาในพื้นที่ (อย่างน้อยฉันจะไม่เรียกมันว่า!) มันเพิ่งเรียกว่าสาขาการติดตามระยะไกล
สาขาในเครื่องระยะไกล:
คุณสามารถดูสาขาระยะไกลทั้งหมด (นั่นคือสาขาในเครื่องระยะไกล) โดยเรียกใช้git remote show <remote>
:
$ git remote show origin
* remote origin
Fetch URL: git@github.com:Flimm/example.git
Push URL: git@github.com:Flimm/example.git
HEAD branch: master
Remote branches:
io-socket-ip new (next fetch will store in remotes/origin)
master tracked
new-branch tracked
Local ref configured for 'git pull':
master merges with remote master
new-branch merges with remote new-branch
Local ref configured for 'git push':
master pushes to master (up to date)
new-branch pushes to new-branch (fast-forwardable)
git remote
คำสั่งนี้เคียวรีเครื่องรีโมตผ่านเครือข่ายเกี่ยวกับสาขาของมัน มันไม่ได้อัพเดตสาขาการติดตามระยะไกลบนเครื่องท้องถิ่นของคุณใช้งานgit fetch
หรือgit pull
เพื่อสิ่งนั้น
จากเอาต์พุตคุณสามารถดูกิ่งทั้งหมดที่มีอยู่ในเครื่องระยะไกลได้โดยดูที่หัวข้อ "Remote branch" (ละเว้นบรรทัดที่ทำเครื่องหมายว่า "ค้าง")
refs/heads/
หากคุณสามารถล็อกอินเข้าสู่เครื่องระยะไกลและหาพื้นที่เก็บข้อมูลในระบบแฟ้มที่คุณสามารถดูได้ที่สาขาทั้งหมดภายใต้
แผ่นโกง:
หากต้องการลบสาขาท้องถิ่นไม่ว่าจะเป็นการติดตามหรือไม่ติดตามอย่างปลอดภัย:
git branch -d <branchname>
หากต้องการลบสาขาในพื้นที่ไม่ว่าจะเป็นการติดตามหรือไม่ติดตามก็ตาม:
git branch -D <branchname>
หากต้องการลบสาขาติดตามระยะไกล:
git branch -rd <remote>/<branchname>
หากต้องการสร้างสาขาที่ไม่ได้ติดตามในท้องถิ่นใหม่:
git branch <branchname> [<start-point>]
หากต้องการสร้างสาขาการติดตามในพื้นที่ใหม่: (โปรดทราบว่าหาก<start-point>
ระบุและเป็นสาขาการติดตามระยะไกลเช่นorigin/foobar
นั้น--track
จะมีการรวมสถานะไว้โดยอัตโนมัติ)
git branch --track <branchname> [<start-point]
ตัวอย่าง:
git branch --track hello-kitty origin/hello-kitty
วิธีลบสาขาในเครื่องระยะไกล:
git push --delete <remote> <branchname>
หากต้องการลบสาขาการติดตามระยะไกลทั้งหมดที่ไม่มีกลิ่นนั่นคือที่ไม่มีสาขาที่เกี่ยวข้องในเครื่องระยะไกล:
git remote prune <remote>
คุณอาจสังเกตเห็นว่าในคำสั่งบางอย่างที่คุณใช้และคำสั่งอื่น<remote>/<branch>
ๆ <remote> <branch>
ตัวอย่าง: และgit branch origin/hello-kitty
git push --delete origin hello-kitty
อาจดูเป็นเรื่องง่าย แต่มีวิธีง่าย ๆ ในการจดจำว่าเมื่อใดควรใช้เครื่องหมายทับและเมื่อต้องใช้ช่องว่าง เมื่อคุณใช้สแลชคุณหมายถึงสาขาการติดตามระยะไกลบนเครื่องของคุณในขณะที่เมื่อคุณใช้พื้นที่คุณกำลังติดต่อกับสาขาในเครื่องระยะไกลผ่านเครือข่าย