Apa perbedaan antara tarikan dan klon di git?


237

Apa perbedaan antara melakukan (setelah mkdir repodan cd repo):

git init
git remote add origin git://github.com/cmcculloh/repo.git
git fetch --all
git pull origin master

dan

git clone git://github.com/cmcculloh/repo.git

Maksud saya, jelas satu lebih pendek, tetapi selain itu pada dasarnya mereka melakukan hal yang sama?

Jawaban:


122

Mereka pada dasarnya sama, kecuali klon akan menyiapkan cabang pelacakan jarak jauh tambahan, bukan hanya master. Lihat halaman manual :

Mengkloning repositori ke direktori yang baru dibuat, membuat cabang pelacakan jarak jauh untuk setiap cabang dalam repositori yang dikloning (terlihat menggunakan git branch -r), dan membuat dan memeriksa cabang awal yang bercabang dari cabang repositori yang saat ini aktif di repositori.


10
git fetch --semua membuat cabang pelacakan jarak jauh tambahan, jadi pada dasarnya mereka sama.
cmcculloh

251

git cloneadalah cara Anda mendapatkan salinan lokal dari repositori yang ada untuk dikerjakan. Ini biasanya hanya digunakan sekali untuk repositori yang diberikan, kecuali jika Anda ingin memiliki beberapa salinan yang berfungsi. (Atau ingin mendapatkan salinan bersih setelah mengacaukan salinan lokal Anda ...)

git pull(atau git fetch+ git merge) adalah cara Anda memperbarui salinan lokal itu dengan komit baru dari repositori jarak jauh. Jika Anda berkolaborasi dengan orang lain, ini adalah perintah yang akan sering Anda jalankan.

Seperti contoh pertama Anda menunjukkan, adalah mungkin untuk meniru git clonedengan bermacam-macam perintah git lain, tetapi sebenarnya tidak demikian halnya dengan git pullmelakukan "pada dasarnya hal yang sama" seperti git clone(atau sebaliknya).


4
Apa khusus yang dilakukan klon git yang tidak dilakukan oleh urutan perintah yang melibatkan "git pull"?
cmcculloh

21
@cmcculloh: Tidak ada - urutan yang Anda gambarkan secara efektif memenuhi apa yang dilakukan "git clone". Intinya adalah bahwa "git pull" digunakan untuk melakukan berbagai hal di luar apa yang Anda lakukan di sana - belum lagi bahwa "git pull" sebenarnya kombinasi dari "git fetch; git merge <cabang sekarang> <origin / cabang saat ini> ". TKI, Anda bisa hidup tanpa tiruan dan tarik jika Anda benar-benar menginginkannya. Selanjutnya, Anda dapat menarik dari repositori selain dari yang Anda kloning. Saya suka menganggap 'clone' sebagai "buat saya salinan lokal dari repo itu" dan 'tarik' sebagai "dapatkan saya pembaruan dari beberapa remote yang ditentukan."
ebneter

120

Dalam bahasa awam kita dapat mengatakan:

  • Klon : Dapatkan salinan repositori jarak jauh yang berfungsi.
  • Tarik : Saya sedang mengerjakan ini, tolong beri saya perubahan baru yang dapat diperbarui oleh orang lain.

3
Saya pikir definisi Tarik Anda juga dapat dikatakan untuk Clone
henrywright

10
Bagaimana Anda bisa mengerjakan sesuatu yang belum Anda tiru?
Jyoti Prakash

Saya tidak mengerti apa yang Anda maksud?
henrywright

@henrywright berharap, jawaban ebneter akan menjawab pertanyaan Anda
Mrk

41

git clone berarti Anda membuat salinan repositori di sistem Anda.

git fork berarti Anda menyalin repositori ke akun Github Anda.

git pull berarti Anda mengambil repositori yang dimodifikasi terakhir.

git push berarti Anda mengembalikan repositori setelah memodifikasinya.

Dalam istilah awam:

git clonesedang mengunduh dan git pullmenyegarkan.


9

klon : menyalin repositori server jarak jauh ke mesin lokal Anda.

pull : dapatkan perubahan baru yang telah ditambahkan ke mesin lokal Anda.

Inilah bedanya.

Klon umumnya digunakan untuk mendapatkan salinan repo jarak jauh.

Tarik digunakan untuk melihat kode tim lain ditambahkan, jika Anda bekerja dalam tim.


5

git clone digunakan hanya untuk mengunduh apa yang saat ini bekerja pada repositori server jarak jauh dan menyimpannya di folder mesin Anda di mana proyek itu ditempatkan. Sebagian besar digunakan hanya ketika kami akan mengunggah proyek untuk pertama kalinya. Setelah itu tarik adalah pilihan yang lebih baik.

git pull pada dasarnya adalah operasi (klon (unduh) + gabungan) dan sebagian besar digunakan ketika Anda bekerja sebagai kerja tim. Dengan kata lain, ketika Anda menginginkan perubahan terbaru dalam proyek itu, Anda dapat menarik.


3

Miss Clone: ​​Saya mendapatkan salinan baru untuk lokal.

Mr Pull: Saya sudah memilikinya secara lokal, saya baru saja memperbaruinya.


Nona Clone: ​​Saya bisa melakukan apa yang Anda lakukan! Anda hanyalah himpunan bagian saya.

Tuan Tarik: Ditto!


Miss Clone: ​​Tidak, Anda tidak membuat. Inilah yang saya lakukan:

  1. Buat repositori kosong kosong
  2. Populasikan cabang pelacak jarak jauh
  3. Jalankan git fetch tanpa argumen

Anda hanya melakukan # 3, dan kemudian Anda bergabung, yang tidak perlu saya lakukan (milik saya masih baru).

Mr Pull: Celana cerdas, bukan masalah besar, saya akan melakukan "git init" pertama! Lalu kita sama. Ditambah lagi, saya memiliki kemampuan 'menggabungkan' ekstra pada repo yang ada! Yang membuat saya perintah yang paling banyak digunakan di Git;)


Pembuat git: Pegang kudamu Tuan Tarik, jika --bare atau --mirror digunakan dengan klon atau init, penggabunganmu tidak akan terjadi. Tetap hanya-baca.


Jawaban yang diremehkan.
sinekonata

2

Hmm, apa yang hilang untuk melihat cabang jarak jauh "4.2" ketika saya menarik, seperti yang saya lakukan ketika saya mengkloning? Sesuatu jelas tidak identik.

tmp$  mkdir some_repo

tmp$  cd some_repo

some_repo$  git init
Initialized empty Git repository in /tmp/some_repo/.git/

some_repo$  git pull https://github.ourplace.net/babelfish/some_repo.git
  :
From https://github.ourplace.net/babelfish/some_repo
 * branch            HEAD       -> FETCH_HEAD

some_repo$  git branch
* master

vs.

tmp$  rm -rf some_repo

tmp$  git clone https://github.ourplace.net/babelfish/some_repo.git
Cloning into 'some_repo'...
  :
Checking connectivity... done.

tmp$  cd some_repo

some_repo$  git branch
* 4.2

Saya perhatikan ini juga, dan saya curiga bahwa perubahan dalam standar git dari waktu ke waktu adalah masalahnya. Saya memiliki 1.9.5.msysgit di windows dan 2.3.2-applegit-55 di mac.
AnneTheAgile

2

URL git clone ---> Proyek lengkap atau repositori akan diunduh sebagai direktori terpisah. dan bukan hanya perubahan URL tarik git ---> fetch + merge -> Itu hanya akan mengambil perubahan yang telah dilakukan dan bukan keseluruhan proyek


1

Sementara git fetchperintah akan mencatat semua perubahan di server yang belum Anda miliki, itu tidak akan mengubah direktori kerja Anda sama sekali. Itu hanya akan mendapatkan data untuk Anda dan membiarkan Anda menggabungkannya sendiri. Namun, ada perintah yang disebut git pullyang pada dasarnya git fetchdiikuti oleh git mergedalam kebanyakan kasus.

Baca selengkapnya: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Pulling


1
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
ekad

0

Klon -: Ini akan membuat duplikat persis dari proyek repositori jarak jauh Anda di mesin lokal Anda.

Tarik -: Misalkan dua atau lebih dari dua orang berbagi repositori yang sama. (Misalkan nama orang lain adalah Syam) (Repositori adalah tempat di mana proyek Anda ada di Github) Jadi jika Syam melakukan beberapa perubahan dalam proyek yang sama di lokalnya dan mendorongnya ke repositori jarak jauh Jadi apa pun perubahan yang dilakukan Syam, perubahan-perubahan itu akan tidak mencerminkan di lokal Anda. Jadi untuk mencerminkan perubahan baru di lokal Anda, Anda harus menggunakan git pull. Secara keseluruhan kami menggunakan git pull untuk memperbarui proyek.

Jadi pada dasarnya kami menggunakan git clone hanya sekali, sedangkan kami menggunakan git pull berkali-kali.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.