นี่คือคำตอบที่ยาว
รีโมท:
หากคุณใช้ 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-kittygit push --delete origin hello-kitty
อาจดูเป็นเรื่องง่าย แต่มีวิธีง่าย ๆ ในการจดจำว่าเมื่อใดควรใช้เครื่องหมายทับและเมื่อต้องใช้ช่องว่าง เมื่อคุณใช้สแลชคุณหมายถึงสาขาการติดตามระยะไกลบนเครื่องของคุณในขณะที่เมื่อคุณใช้พื้นที่คุณกำลังติดต่อกับสาขาในเครื่องระยะไกลผ่านเครือข่าย