Apa itu cabang pelacakan?

173

Bisakah seseorang menjelaskan "cabang pelacakan" yang berlaku untuk git?

Berikut definisi dari git-scm.com :

'Cabang pelacakan' di Git adalah cabang lokal yang terhubung ke cabang jarak jauh. Saat Anda mendorong dan menarik cabang itu, cabang itu secara otomatis mendorong dan menarik ke cabang jarak jauh yang terhubung dengannya.

Gunakan ini jika Anda selalu menarik dari cabang hulu yang sama ke cabang baru, dan jika Anda tidak ingin menggunakan "git pull" secara eksplisit.

Sayangnya, karena baru git dan berasal dari SVN, definisi itu sama sekali tidak masuk akal bagi saya.

Saya membaca " Panduan Pragmatis untuk Git " (buku yang bagus, ngomong-ngomong), dan mereka tampaknya menyarankan bahwa melacak cabang adalah hal yang baik dan setelah membuat remote pertama Anda (asal, dalam kasus ini), Anda harus mengatur cabang master Anda menjadi cabang pelacakan, tetapi sayangnya tidak mencakup mengapa cabang pelacakan adalah hal yang baik atau manfaat apa yang Anda dapatkan dengan mengatur cabang master Anda untuk menjadi cabang pelacakan dari repositori asal Anda .

Bisakah seseorang tolong beri tahu saya (dalam bahasa Inggris)?

jerhinesmith
sumber
6
Satu catatan terminologi: trek kata , di Git, sangat kelebihan beban. Beberapa file dilacak dan beberapa tidak terlacak; beberapa nama cabang disebut cabang pelacakan jarak jauh; dan Anda dapat menggunakan --trackopsi untuk membuat cabang (lokal) yang memiliki salah satu cabang pelacakan jarak jauh ini ditetapkan sebagai hulu . Terminologi ini agak berkembang antara tahun 2006 dan 2019, jadi orang yang berbeda kadang-kadang dapat berarti sesuatu yang berbeda dengan masing-masing kata ini.
torek
Saya pribadi merekomendasikan menggunakan frase nama pelacak jarak jauh sebagai pengganti cabang pelacak jarak jauh , sebagian karena kata cabang juga agak kelebihan beban. Nama-nama pelacak jarak jauh adalah yang terlihat seperti origin/master: mereka ada di dalam repositori Anda, tetapi mereka adalah cara Git Anda untuk mengingat nama - nama cabang seperti yang terlihat pada beberapa repositori Git lain pada origin. Jika Anda kemudian menggunakan kata hulu , yang merupakan istilah yang lebih modern, untuk mengatakan bahwa Anda mastertelah origin/mastermenetapkannya sebagai hulu , Anda dapat menghindari semua kebingungan terminologi ini.
torek

Jawaban:

141

The book ProGit memiliki penjelasan yang sangat baik :

Cabang Pelacakan

Memeriksa cabang lokal dari cabang jarak jauh secara otomatis membuat apa yang disebut cabang pelacakan. Cabang pelacakan adalah cabang lokal yang memiliki hubungan langsung ke cabang terpencil. Jika Anda berada di cabang dan jenis pelacakan git push, Git secara otomatis mengetahui server dan cabang mana yang harus didorong. Selain itu, menjalankan git pullsementara di salah satu cabang ini mengambil semua referensi jarak jauh dan kemudian secara otomatis bergabung dalam cabang jarak jauh yang sesuai.

Ketika Anda mengkloning repositori, umumnya akan secara otomatis membuat cabang master yang melacak asal / master. Itu sebabnya git pushdan git pullbekerja di luar kotak tanpa argumen lain. Namun, Anda dapat mengatur cabang pelacakan lain jika diinginkan - cabang yang tidak melacak cabang pada asal dan tidak melacak cabang master. Kasus sederhana adalah contoh yang baru saja Anda lihat, berjalan git checkout -b [branch] [remotename]/[branch]. Jika Anda memiliki Git versi 1.6.2 atau lebih baru, Anda juga dapat menggunakan --tracksingkatan:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"

Untuk mengatur cabang lokal dengan nama yang berbeda dari cabang jarak jauh, Anda dapat dengan mudah menggunakan versi pertama dengan nama cabang lokal yang berbeda:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"

Sekarang, cabang lokal Anda sfakan secara otomatis mendorong ke dan menarik dari origin/serverfix.

BONUS: git statusinfo tambahan

Dengan cabang pelacakan, git statusakan memberi tahu Anda seberapa jauh Anda berada di belakang cabang pelacakan - berguna untuk mengingatkan Anda bahwa Anda belum mendorong perubahan Anda! Ini terlihat seperti ini:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

atau

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Assaf Lavie
sumber
21
Hanya ingin menjernihkan ini: "Memeriksa cabang lokal dari cabang jarak jauh secara otomatis membuat apa yang disebut cabang pelacakan." Itu menyesatkan. Tanpa opsi --track cabang apa pun yang Anda buat tidak akan dilacak.
JohnO
@JohnO, mungkin ingin membahasnya dengan pria Pro Git. Seluruh buku ini adalah hasil kolaborasi pengeditan besar-besaran IIRC.
Assaf Lavie
2
@ JohnO, menurut: sbf5.com/~cduan/technical/git/git-4.shtml --track diaktifkan secara default dan karenanya tidak perlu.
Hank Lin
50

Di bawah ini adalah catatan pembelajaran pribadi saya di cabang pelacakan GIT, semoga bermanfaat bagi pengunjung di masa mendatang:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini


Melacak cabang dan "git fetch":

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

hagrawal
sumber
Terima kasih atas catatannya! Maukah Anda berbagi semuanya jika mungkin? Terima kasih;
Aditya
@Aditya: Pertanyaan ini untuk melacak cabang dan saya telah memposting semua catatan saya pada topik ini. Jika saya menemukan beberapa pertanyaan lain yang relevan di mana saya dapat memposting catatan GIT saya yang lain, maka saya akan senang melakukannya.
hagrawal
Terima kasih! Yang saya maksud adalah mempostingnya di blog Anda atau apalah :). Sekali lagi terima kasih atas catatan yang bagus!
Aditya
@Aditya: Ah, begitu. Sekarang Anda jelas tentang apa yang Anda maksudkan. Saya berjalan di belakang di situs web saya, belum membuat satu untuk saya sendiri.
hagrawal
43

Buku Pro Git menyebutkan :

Cabang pelacakan adalah cabang lokal yang memiliki hubungan langsung ke cabang terpencil

Tidak persis. Pertanyaan SO " Memiliki pemahaman yang sulitgit-fetch " meliputi:

Tidak ada konsep cabang pelacakan lokal , hanya cabang pelacakan jarak jauh .
Begitu origin/masterjuga cabang pelacakan jarak jauh untuk masterdi originrepo.

Namun sebenarnya, begitu Anda membangun hubungan cabang hulu antara:

  • cabang lokal seperti master
  • dan cabang pelacakan jarak jauh suka origin/master

Kemudian Anda dapat mempertimbangkan mastersebagai cabang pelacakan lokal : Ini melacak cabang pelacakan jarak jauh origin/master yang, pada gilirannya, melacak cabang master dari repo hulu origin .

teks alternatif

VONC
sumber
Klarifikasi gambar: My Computer adalah 2 komitmen di depan. Dari situlah kedua komit itu berasal. Gambar: progit.org/book/ch3-5.html
idbrii
Apakah saya menafsirkan dengan benar: Jika saya memiliki remote yang ditetapkan untuk asal dan upstream, maka cabang master lokal saya akan melacak asal secara langsung, dan upstream secara tidak langsung? misal: ketika saya git statussaya akan menerima pesan pelacakan komit dengan hormat dari repositori asal dan upstream? (Penyelesaian: Saya mengkloning repo seseorang secara lokal, mendorong klon saya ke repo baru di akun GitHub saya, dan mengatur secara lokal asal dan jarak jauh ke repo github saya dan repo kloning yang dikloning masing-masing).
SherylHohman
3
@SherylHohman No: cabang lokal tidak akan melacak apa pun "secara langsung" atau "secara tidak langsung". Ini akan melacak cabang pelacakan jarak jauh yang akan Anda tetapkan untuknya. Dalam hal garpu, praktik terbaik adalah melacak upstream (repo asli) untuk cabang umum (seperti master), dan melacak asal (garpu jauh Anda) untuk cabang baru (PR Anda atau cabang fitur): lihat stackoverflow.com/ a / 21847690/6309
VonC
2
@VonC - Pernyataan "Tidak ada konsep cabang pelacakan lokal, hanya cabang pelacakan jarak jauh." menarik b / c ada terminologi yang saling bertentangan di sekitar cabang. Tautan ini sering dirujuk web.archive.org/web/20130419172453/http://www.gitguys.com/... membedakan antara "cabang pelacakan" & "cabang pelacakan jarak jauh". Mereka menyebut asal / menguasai "cabang pelacakan jarak jauh" - Saya setuju - tetapi kemudian mereka menyebut "tuan" sebagai "cabang pelacakan" juga. Apa itu pelacakan master? Apakah mereka salah atau itu masalah terminologi?
Howiecamp
2
@Howiecamp apa yang mereka sebut "pelacakan cabang yang disebut master" hanyalah master cabang lokal dengan asal cabang / master pelacakan jarak jauh yang terkait, di sini untuk menghafal SHA1 terakhir yang diambil dari asal mengenai cabang master jarak jauh. Jadi ini adalah "jalan pintas" untuk menunjuk "cabang lokal dengan cabang hulu"
VonC
7

Ini adalah bagaimana saya menambahkan cabang pelacakan sehingga saya bisa menariknya ke cabang baru saya:

git branch --set-upstream-to origin/Development new-branch
agrublev
sumber