อะไรคือความแตกต่างระหว่างสาขาในพื้นที่สาขาติดตามท้องถิ่นสาขาระยะไกลและสาขาติดตามระยะไกล


158

ฉันเพิ่งเริ่มใช้ Git และฉันสับสนระหว่างสาขาที่แตกต่างกัน ใครสามารถช่วยฉันคิดออกว่าสาขาประเภทต่อไปนี้คืออะไร?

  • สาขาท้องถิ่น
  • สาขาติดตามท้องถิ่น
  • สาขาระยะไกล
  • สาขาติดตามระยะไกล

ความแตกต่างระหว่างพวกเขาคืออะไร? และพวกเขาทำงานร่วมกันได้อย่างไร

รหัสสาธิตอย่างรวดเร็วจะเป็นประโยชน์จริง ๆ ฉันเดา

คำตอบ:


123

สาขาเป็นสาขาที่เดียวที่คุณ (ผู้ใช้ท้องถิ่น) สามารถมองเห็น มีอยู่ในเครื่องของคุณเท่านั้น

git branch myNewBranch        # Create local branch named "myNewBranch"

สาขาที่ห่างไกลเป็นสาขาในสถานที่ห่างไกล (ในกรณีส่วนใหญ่origin) คุณสามารถผลักดันที่สร้างขึ้นใหม่สาขาในประเทศเพื่อmyNewBranch originขณะนี้ผู้ใช้รายอื่นสามารถติดตามได้

git push -u origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "origin"

สาขาที่ห่างไกลการติดตามเป็นสำเนาของสาขาที่ห่างไกล เมื่อmyNewBranchผลักไปที่การoriginใช้คำสั่งข้างต้นสาขาการติดตามระยะไกลชื่อorigin/myNewBranchถูกสร้างขึ้นบนเครื่องของคุณ นี้สาขาที่ห่างไกลติดตามติดตามสาขาที่ห่างไกลบนmyNewBranch originคุณสามารถอัปเดตสาขาการติดตามระยะไกลที่จะอยู่ในซิงค์กับสาขาที่ห่างไกลโดยใช้หรือgit fetchgit pull

git pull origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "origin" into remote tracking
                                 # branch on your machine "origin/myNewBranch".
                                 # Here "origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "origin"

สาขาติดตามท้องถิ่นเป็นสาขาในประเทศที่มีการติดตามสาขาอื่น นี่คือเพื่อให้คุณสามารถกด / ดึงคอมมิชชันไปยัง / จากสาขาอื่น สาขาติดตามในพื้นที่ส่วนใหญ่ติดตามสาขาติดตามระยะไกล เมื่อคุณกดสาขาในท้องถิ่นที่จะoriginใช้git push commandกับ-uตัวเลือก (ตามที่แสดงไว้ข้างต้น), คุณตั้งสาขาในท้องถิ่นเพื่อติดตามสาขาการติดตามระยะไกลmyNewBranch origin/myNewBranchสิ่งนี้จำเป็นสำหรับการใช้งานgit pushและgit pullไม่ต้องระบุต้นน้ำเพื่อดันหรือดึง

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "origin".
                              # Pulls these new commits from "origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.

สำหรับคำจำกัดความสาขาการติดตามในท้องถิ่นนั้นจะไม่เหมือนกับสาขาในพื้นที่หลังจากผลักไปที่รีโมตหรือไม่
mskw

2
@mskw ไม่สาขาการติดตามในพื้นที่และสาขา (ไม่ใช่การติดตาม) แตกต่างกันในการเชื่อมโยง สาขาท้องถิ่นไม่เกี่ยวข้องกับสาขาใด ๆ มันเป็นเพียงสาขาที่มีอยู่ในเครื่องในประเทศของคุณในการแยก สาขาการติดตามโลคัลเชื่อมโยงกับสาขาการติดตามระยะไกล ดังนั้นคุณสามารถผลัก / ดึงคอมมิชชันไปยัง / จากกันและกัน
SNce

196

นี่คือคำตอบที่ยาว

รีโมท:

หากคุณใช้ 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

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


ฉันจะใช้เพื่อสร้างสาขาและไปที่สาขาในหนึ่ง cmd เป็น: git checkout -b mynewbranch
Zeta

ฉันชอบจุดสุดท้ายของความแตกต่างระหว่างช่องว่างกับเครื่องหมายทับ!
aderchox

12

สาขาในพื้นที่:

สาขาในเครื่องของคุณที่คุณสามารถทำงานและเพิ่มความมุ่งมั่น git branchคุณสามารถแสดงรายการสาขาเหล่านี้ด้วย

สาขาในพื้นที่ (พร้อมการติดตาม):

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

สาขาระยะไกล:

เพียงสาขาในที่เก็บระยะไกล - โดยทั่วไปบนเซิร์ฟเวอร์เช่น GitHub เป็นต้น

สาขาการติดตามระยะไกล:

สำเนาโลคัลของรีโมตสาขา สาขานี้ไม่ควรแก้ไข โดยมีวัตถุประสงค์คือเพื่อติดตามสถานะปัจจุบันของสาขาระยะไกล การติดตามระยะไกลสามารถดูได้git branch -rและมักจะมีลักษณะคล้ายสาขาorigin/master(ชื่อ repo ตามด้วยสแลชตามด้วยชื่อสาขา) การรันgit fetchจะอัปเดตสาขาการติดตามระยะไกลเพื่อให้สอดคล้องกับสถานะของสาขาระยะไกลที่เกี่ยวข้อง

git branch -avvฉันชอบส่วนตัวในการแสดงภาพรวมอย่างรวดเร็วว่าสาขาใดอยู่บนเครื่องของฉันสาขาใดที่อยู่บนรีโมทและความมุ่งมั่นล่าสุดในแต่ละสาขา -aส่วนหนึ่งระบุว่าทุกสาขาควรจะแสดงอยู่ (ระยะไกลและท้องถิ่น) v's บนขาตั้งที่สิ้นสุดสำหรับ verbose (มันแสดงให้เห็นว่าที่ผ่านมากระทำกัญชาและข้อความ) ขอบคุณ @Flimm ที่ชี้ให้เห็นว่าส่วนที่สองvเพิ่มข้อมูลเกี่ยวกับสาขาท้องถิ่นที่กำลังติดตามระยะไกล


1
ฉันไม่เข้าใจความแตกต่างระหว่างการติดตามโลคัลและการติดตามระยะไกลสาขา - อดีตสอดคล้องกับที่มาและที่อยู่หลังไปยังเครื่องระยะไกล แต่นั่นไม่ใช่สิ่งเดียวกันหรือ นั่นไม่ใช่แค่ repo ที่มักจะเป็น github ใช่ไหม
akantoword

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