Apa perbedaan antara cabang lokal, cabang pelacakan lokal, cabang jarak jauh dan cabang pelacakan jarak jauh?

158

Saya baru saja mulai menggunakan Git dan saya benar-benar bingung antara cabang-cabang yang berbeda. Adakah yang bisa membantu saya untuk mencari tahu apa tipe cabang berikut ini?

  • cabang lokal
  • cabang pelacakan lokal
  • cabang terpencil
  • cabang pelacakan jarak jauh

Apa perbedaan di antara mereka? Dan bagaimana mereka bekerja satu sama lain?

Saya kira, kode demo cepat akan sangat membantu.

diedit
sumber

Jawaban:

123

Sebuah cabang lokal adalah cabang yang hanya Anda (pengguna lokal) bisa melihat. Itu hanya ada di mesin lokal Anda.

git branch myNewBranch        # Create local branch named "myNewBranch"

Sebuah cabang terpencil merupakan cabang pada lokasi yang jauh (dalam banyak kasus origin). Anda dapat mendorong cabang lokal yang baru dibuat myNewBranchke origin. Sekarang pengguna lain dapat melacaknya.

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"

Sebuah cabang pelacakan jarak jauh adalah salinan lokal dari cabang terpencil. Ketika myNewBranchdidorong untuk originmenggunakan perintah di atas, cabang pelacakan jarak jauh bernama origin/myNewBranchdibuat pada mesin Anda. Cabang pelacakan terpencil ini melacak cabang terpencil myNewBranchdi origin. Anda dapat memperbarui cabang pelacakan jarak jauh agar sinkron dengan cabang jarak jauh menggunakan git fetchatau git 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"

Sebuah cabang pelacakan lokal adalah cabang lokal yang melacak cabang lain. Ini agar Anda dapat menekan / menarik komit ke / dari cabang lain. Cabang pelacakan lokal dalam kebanyakan kasus melacak cabang pelacakan jarak jauh. Ketika Anda mendorong cabang lokal untuk originmenggunakan git push commanddengan -upilihan (seperti yang ditunjukkan di atas), Anda mengatur cabang lokal myNewBranchuntuk melacak cabang pelacakan terpencil origin/myNewBranch. Ini diperlukan untuk menggunakan git pushdan git pulltanpa menentukan hulu untuk mendorong atau menarik.

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.
SNce
sumber
Untuk definisi cabang pelacakan lokal, bukankah itu sama dengan cabang lokal setelah mendorongnya ke jarak jauh?
mskw
2
@mskw Tidak, cabang pelacakan lokal dan cabang lokal (non-pelacakan) berbeda dalam asosiasi. Cabang lokal TIDAK terkait dengan cabang apa pun. Ini hanyalah cabang yang ada di mesin lokal Anda secara terpisah. Cabang pelacakan lokal dikaitkan dengan cabang pelacakan jarak jauh. Jadi Anda dapat menekan / menarik komit ke / dari satu sama lain.
SNce
196

Inilah jawaban panjangnya.

Remote:

Jika Anda menggunakan Git secara kolaboratif, Anda mungkin perlu menyinkronkan komit Anda dengan mesin atau lokasi lain. Setiap mesin atau lokasi disebut remote , dalam terminologi Git, dan masing-masing mungkin memiliki satu atau lebih cabang. Paling sering, Anda hanya akan memilikinya, bernama origin. Untuk daftar semua remote, jalankan git remote:

$ git remote
bitbucket
origin

Anda dapat melihat lokasi mana nama-nama remote ini merupakan jalan pintas, dengan menjalankan git remote -v:

$ git remote -v
bitbucket [email protected]:flimm/example.git (fetch)
bitbucket [email protected]:flimm/example.git (push)
origin [email protected]:Flimm/example.git (fetch)
origin [email protected]:Flimm/example.git (push)

Setiap remote memiliki direktori di bawah git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

Cabang di mesin Anda:

TLDR: pada mesin lokal Anda, Anda memiliki tiga jenis cabang: cabang non-pelacakan lokal, cabang pelacakan lokal, dan cabang pelacakan jarak jauh. Pada mesin jarak jauh, Anda hanya punya satu jenis cabang.

1. Cabang lokal

Anda dapat melihat daftar semua cabang lokal di mesin Anda dengan menjalankan git branch:

$ git branch
master
new-feature

Setiap cabang lokal memiliki file di bawah .git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

Ada dua jenis cabang lokal pada mesin Anda: cabang lokal non-pelacakan, dan pelacakan cabang lokal.

1.1 Cabang lokal yang tidak terlacak

Cabang lokal yang tidak terlacak tidak terkait dengan cabang lainnya. Anda membuatnya dengan menjalankan git branch <branchname>.

1.2. Melacak cabang lokal

Pelacakan cabang lokal dikaitkan dengan cabang lain, biasanya cabang pelacakan jarak jauh. Anda membuatnya dengan menjalankan git branch --track <branchname> [<start-point>].

Anda dapat melihat mana salah satu cabang lokal Anda melacak cabang menggunakan git branch -vv:

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

Dari output perintah ini, Anda dapat melihat bahwa cabang lokal mastermelacak cabang pelacakan jarak jauh origin/master, dan cabang lokal new-featuretidak melacak apa pun.

Cara lain untuk melihat cabang mana yang melacak cabang adalah dengan melihat .git/config.

Melacak cabang lokal berguna. Mereka memungkinkan Anda untuk menjalankan git pulldan git push, tanpa menentukan cabang upstream mana yang akan digunakan. Jika cabang tidak diatur untuk melacak cabang lain, Anda akan mendapatkan kesalahan seperti ini:

$ 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. Cabang pelacak jarak jauh (masih di mesin Anda)

Anda dapat melihat daftar semua cabang pelacakan jarak jauh di mesin Anda dengan menjalankan git branch -r:

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

Setiap cabang pelacak jarak jauh memiliki file di bawah .git/refs/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

Pikirkan cabang pelacakan jarak jauh Anda sebagai cache lokal Anda untuk apa yang berisi mesin-mesin jarak jauh. Anda dapat memperbarui cabang pelacakan jarak jauh menggunakan git fetch, yang git pullmenggunakan di belakang layar.

Meskipun semua data untuk cabang pelacak jarak jauh disimpan secara lokal di mesin Anda (seperti cache), itu masih tidak pernah disebut cabang lokal. (Setidaknya, saya tidak akan menyebutnya begitu!) Itu hanya disebut cabang pelacakan jarak jauh.

Cabang-cabang pada mesin jarak jauh:

Anda dapat melihat semua cabang jarak jauh (yaitu cabang di mesin jarak jauh), dengan menjalankan git remote show <remote>:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:Flimm/example.git
  Push  URL: [email protected]: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 remotePerintah ini menanyakan mesin jarak jauh melalui jaringan tentang cabangnya. Itu tidak memperbarui cabang pelacakan jarak jauh pada mesin lokal Anda, gunakan git fetchatau git pulluntuk itu.

Dari output, Anda dapat melihat semua cabang yang ada di mesin jarak jauh dengan melihat di bawah judul "Cabang jarak jauh" (abaikan garis yang ditandai sebagai "basi").

Jika Anda bisa masuk ke mesin remote dan menemukan repositori di sistem file, Anda bisa melihat semua cabangnya di bawah refs/heads/.

Contekan:

  • Untuk menghapus cabang lokal, baik pelacakan atau non-pelacakan, dengan aman:

    git branch -d <branchname>
    
  • Untuk menghapus cabang lokal, baik pelacakan atau non-pelacakan, dengan paksa:

    git branch -D <branchname>
    
  • Untuk menghapus cabang pelacakan jarak jauh:

    git branch -rd <remote>/<branchname>
    
  • Untuk membuat cabang non-pelacakan lokal baru:

    git branch <branchname> [<start-point>]
    
  • Untuk membuat cabang pelacakan lokal baru: (Perhatikan bahwa jika <start-point>ditentukan dan merupakan cabang pelacakan jarak jauh seperti origin/foobar, maka --trackflag tersebut secara otomatis disertakan)

    git branch --track <branchname> [<start-point]
    

    Contoh:

    git branch --track hello-kitty origin/hello-kitty
    
  • Untuk menghapus cabang pada mesin jarak jauh:

    git push --delete <remote> <branchname>
    
  • Untuk menghapus semua cabang pelacakan jarak jauh yang sudah basi, yaitu cabang-cabang yang terkait pada mesin jarak jauh tidak ada lagi:

    git remote prune <remote>
    

Anda mungkin telah memperhatikan bahwa dalam beberapa perintah, Anda menggunakan <remote>/<branch>, dan perintah lain,<remote> <branch> ,. Contoh: git branch origin/hello-kittydan git push --delete origin hello-kitty.

Ini mungkin tampak sewenang-wenang, tetapi ada cara sederhana untuk mengingat kapan harus menggunakan garis miring dan kapan harus menggunakan spasi. Saat Anda menggunakan garis miring, Anda merujuk ke cabang pelacak jarak jauh pada mesin Anda sendiri, sedangkan saat Anda menggunakan spasi, Anda sebenarnya berurusan dengan cabang pada mesin jarak jauh melalui jaringan.

Flimm
sumber
Saya akan menggunakan untuk membuat cabang dan pergi ke cabang dalam satu cmd sebagai: git checkout -b mynewbranch
Zeta
Saya menyukai poin terakhir tentang perbedaan antara ruang dan garis miring!
aderchox
12

Cabang lokal:

Cabang di mesin Anda yang dapat Anda gunakan untuk bekerja dan menambahkan komit. Anda dapat mendaftar cabang-cabang ini dengan git branch.

Cabang Lokal (Dengan Pelacakan):

Cabang lokal biasa yang dikonfigurasi untuk berhubungan dengan cabang jarak jauh. Ini memiliki manfaat seperti kemampuan untuk git pulldan git pushtanpa harus menentukan repositori dan nama cabang. Pelacakan juga menyebabkan git statusAnda mengetahui kapan cabang Anda berada di depan atau di belakang kendali jarak jauh.

Cabang Terpencil:

Cukup cabang di repositori jarak jauh — biasanya di server seperti GitHub dll.

Cabang Pelacakan Jarak Jauh:

Salinan lokal cabang terpencil. Cabang ini tidak boleh diedit. Tujuannya adalah untuk melacak keadaan cabang terpencil saat ini. Cabang pelacakan jarak jauh dapat dilihat dengan git branch -rdan biasanya terlihat seperti origin/master(nama repo diikuti dengan garis miring diikuti dengan nama cabang). Menjalankan git fetchakan memperbarui cabang pelacakan jarak jauh untuk mencerminkan keadaan cabang jarak jauh yang sesuai.

git branch -avvadalah favorit pribadi saya untuk menampilkan ikhtisar cepat cabang mana yang ada di komputer saya, cabang mana yang ada di remote, dan komit terbaru di masing-masing. Bagian ini -amenetapkan bahwa semua cabang harus ditampilkan (jarak jauh dan lokal). Yang ada vdi ujung berdiri untuk verbose (itu menunjukkan hash dan pesan komit terakhir). Terima kasih kepada @Flimm untuk menunjukkan bahwa yang kedua vmenambahkan info tentang cabang lokal mana yang melacak jarak jauh mana.

Eric Mathison
sumber
1
saya tidak mengerti perbedaan antara pelacakan lokal dan cabang pelacakan jarak jauh - yang pertama sesuai dengan asal dan yang terakhir ke mesin jarak jauh. tetapi bukankah itu hal yang sama? bukankah itu hanya repo yang biasanya ada di github?
akantoword
1
@akantoword Saya memperbarui jawaban untuk mencoba sedikit memperjelas. Pada dasarnya cabang pelacakan jarak jauh hanyalah salinan lokal dari cabang jarak jauh yang tidak dimaksudkan untuk bekerja. Cabang lokal dengan pelacakan untuk bekerja.
Eric Mathison