Saya adalah pengguna SVN dan sekarang saya belajar Git.
Di SVN saya biasanya checkout repo di komputer lokal saya, yang mencakup semua cabang di proyek saya dan saya biasa memilih folder untuk cabang saya yang saya minati dan bekerja di sana.
Saya melihat perbedaan menggunakan Git.
Saat ini saya sedang mengkloning repo dan mengkloning cabang tertentu menggunakan gitk.
Folder proyek hanya berisi konten untuk cabang itu dan saya tidak bisa melihat semua cabang seperti di SVN, yang sedikit membingungkan bagi saya.
Saya tidak dapat menemukan cara mudah untuk melihat semua cabang di repositori lokal saya menggunakan Git.
Saya ingin tahu apakah proses Git yang saya jelaskan adalah "standar" dan beberapa seberapa benar atau saya kehilangan sesuatu.
Saya juga ingin tahu bagaimana menangani proses di mana saya perlu bekerja pada dua cabang pada saat yang sama, misalnya, saya perlu membuat perbaikan terbaru pada master tetapi tetap menyimpan konten dari cabang lain juga.
Apa yang dimaksud dengan konvensi nama rekomendasi untuk membuat folder yang menyertakan cabang yang diklon dari repo di Git, misalnya
myproject-branchname
?
git clone
lebih sepertisvnadmin hotcopy
atausvnrdump
+svnadmin load
daripada itusvn checkout
. Dengangit
, Anda tidak meminta sedikit demi sedikit dari repositori; Anda menyalin seluruh repositori dan bekerja dengannya secara lokal, mendorong perubahan kembali ke repositori "sumber" kapan dan jika Anda menginginkannya. Git dan Subversion menggunakan dua model yang sama sekali berbeda untuk kontrol sumber.git-flow
Jawaban:
Selamat datang di geng!
Pendidikan Kembali SVN
Tunggu sebentar. Sementara CVS dan SVN dan sistem kontrol versi tradisional (mis. Terpusat) memenuhi (sebagian besar) tujuan yang sama dengan sistem kontrol versi modern (yaitu didistribusikan) seperti mercurial dan Git, Anda akan jauh lebih baik belajar Git dari bawah daripada mencoba mentransfer alur kerja SVN Anda ke Git.
http://hginit.com ( lihat di archive.org ) oleh Joel Spolsky (salah satu pendiri Stack Exchange) adalah tutorial untuk lincah, bukan Git, tetapi bab ke-0, "Pendidikan Ulang Subversion" adalah bermanfaat bagi orang beralih dari SVN untuk setiap sistem kontrol versi didistribusikan, karena memberitahu Anda apa konsep SVN Anda harus (sementara) un -Pelajari (atau untuk
stash
pergi , karena pengguna Git mungkin mengatakan) dapat membungkus kepala Anda sekitar didistribusikan konsep sistem kontrol versi dan alur kerja idiomatik yang dibuat untuk bekerja dengannya.Jadi, Anda dapat membaca bab ke-nol dan kebanyakan hanya mengganti kata "lincah" dengan "Git" dan dengan demikian mempersiapkan diri dan pikiran Anda untuk Git.
Cetak halus
(Anda mungkin melewatkan ini untuk saat ini.) Sementara lincah dan Git jauh lebih mirip satu sama lain daripada SVN, ada yang beberapa perbedaan konseptual antara mereka, sehingga beberapa pernyataan dan saran dalam "Subversion Re-pendidikan" akan menjadi salah teknis saat mengganti "mercurial" dengan "Git":
Di SVN, semuanya adalah direktori (tetapi Anda tidak perlu memperlakukannya seperti itu)
Tapi saya sudah mengganggu Anda. Anda katakan?
Jika, dengan itu, Anda berarti Anda telah memeriksa folder root repositori SVN (atau folder lain yang sesuai dengan lebih dari
trunk
atau ke satu cabang, misalnya dalam tata letak repo SVN konvensionalbranches
folder yang berisi semua cabang non-trunk) kemudian Saya berani mengatakan Anda mungkin pernah menggunakan SVN salah (ish), atau setidaknya sedikit menyalahgunakan fakta bahwa trunk, cabang dan tag semua dilipat menjadi satu namespace (meskipun hierarkis) bersama dengan direktori dalam revisi / basis kode.Meskipun mungkin tergoda untuk mengubah beberapa cabang SVN secara paralel, itu adalah AFAIK bukan bagaimana SVN dimaksudkan untuk digunakan. (Meskipun saya tidak yakin tentang apa kerugian yang bekerja seperti itu.)
Di Git, hanya direktori yang merupakan direktori
Setiap klon dari repositori Git sendiri merupakan repositori Git: Secara default, itu mendapatkan salinan lengkap dari sejarah repositori asal, termasuk semua revisi, cabang, dan tag. Tapi itu akan mempertahankan semua yang kami inginkan: Git menyimpannya dalam basis data berbasis file, yang terletak di
.git/
subfolder tersembunyi folder root repositori .Tapi apa file non-tersembunyi yang Anda lihat di folder repositori?
Ketika Anda
git clone
repositori, Git melakukan beberapa hal. Kurang lebih:.git/
subfolder dengan "database"master
).Langkah terakhir itu berarti bahwa Git mencari revisi yang ditunjuk oleh cabang ini, dan membongkar file-tree yang disimpan di sana (database menggunakan beberapa cara kompresi dan de-duplikasi) ke dalam folder root repositori. Folder root dan semua subfoldernya (tidak termasuk
.git
subfolder khusus ) dikenal sebagai "copy pekerjaan" repositori Anda. Di situlah Anda berinteraksi dengan konten revisi / cabang saat ini check-out. Itu hanya folder dan file biasa. Namun, untuk berinteraksi dengan repositori per-se ("database" revisi dan referensi) Anda menggunakangit
perintah.Melihat cabang Git dan berinteraksi dengan cabang Git
Versi yang
gitk
saya dapat tidak dapat mengkloning repositori. Itu hanya dapat melihat riwayat repo dan membuat cabang dan memeriksa cabang. Juga, tidak ada "kloning" cabang. Anda hanya dapat mengkloning repositori.Apakah maksud Anda mengkloning repo menggunakan
git clone ...
dan kemudian, menggunakangitk
, periksa cabang?Ya, itu cukup standar:
git clone ...
git checkout ...
atau gunakan alat grafis sepertigikt
Mungkin:
git branch
git branch -r
atau semua cabang dengangit branch -a
Anda dapat menggunakan
gitk
untuk melihat riwayat lengkap (semua tag cabang dll. yang diketahui oleh repo lokal Anda) dengan menjalankannyaCara bekerja dengan banyak cabang secara paralel
Ada berbagai skenario di sini:
Perubahan baru (belum dibuat) perlu diterapkan ke beberapa cabang
Gunakan alur kerja ini:
c
dari revisi yang sudah ada dalam leluhur semua cabang ini (mis. Revisi yang memperkenalkan bug ketika perubahan akan menjadi perbaikan bug) atau dari revisi yang (termasuk semua leluhurnya) dapat diterima untuk diperkenalkan di semua cabang ini.c
.Untuk setiap cabang
b
yang membutuhkan perubahan:Lihat
b
:Gabungkan
c
menjadib
:Hapus cabang
c
:Perubahan yang ada diperlukan pada cabang yang berbeda
(... tetapi tanpa perubahan lain yang dibuat di tempat perubahan itu berada)
Di satu cabang
a
, Anda ingin mengubah satu atau beberapa file ke keadaan persisnya pada cabang yang berbedab
a
Dapatkan konten file dari cabang
b
:(Selain
git checkout
tanpa melewati jalur, ini tidak akan beralih ke cabangb
, hanya mendapatkan konten file yang diminta dari sana. File-file ini mungkin atau mungkin belum adaa
. Jika ya, mereka ditimpa dengan kontennyab
.)Saat mengerjakan satu cabang, Anda ingin melihat bagaimana keadaan di cabang lain
Lihatlah cabang yang ingin Anda kerjakan.
Kemudian, untuk melihat cabang lainnya,
gitk
mencoba untuk beralih tombol radio dari "patch" ke "tree")git worktree
untuk membuat direktori kerja terpisah dari repositori yang sama (yaitu juga menggunakan database dalam.git/
direktori repositori lokal Anda saat ini) di mana Anda dapat memeriksa cabang lain itusumber
stash
sangat ideal.git stash
Adalah baik untuk memindahkan pekerjaan yang belum selesai keluar dari jalan, misalnya untuk berganti cabang dan kemudian kembali.Kecuali Anda melihat direktori di atas trunk, di Subversion Anda umumnya tidak memiliki semua cabang yang tersedia secara lokal. Dalam Git, semua konten (komit, pesan, cabang, dll.) Selalu dikloning ke setiap salinan.
Tidak mungkin, lihat di atas. Anda bisa
git checkout branch-name
, tetapi Anda tidak bisagit clone something branch-name
. Dalam Subversion, cabang adalah folder. Di Git, cabang adalah pointer ke sebuah commit.Lari
git branch
. Secara default ini hanya menampilkan cabang lokal. Gunakangit branch --remote
untuk melihat cabang jarak jauh.sumber
--single-branch
(bahkan hanya ujung dengan--depth 1
). Perbedaan antara cabang lokal dan terpencil yang diketahui git hanyalah semacam label. Cabang jarak jauh diawali dengan nama sumber jarak jauh (seringorigin
). Cabang lokal tidak memiliki awalan itu. Tetapi pada akhirnya, data tersedia secara lokal (kecuali jika Anda melakukan--single-branch
atau sesuatu yang serupa). Ketika Anda menjalankangit checkout $branchname
dengan cabang yang tidak memiliki cabang lokal selain cabang jarak jauh, git secara otomatis membuat cabang lokal "melacak" kendali jarak jauh.Karena ini ditandai dengan git, saya harap kurangnya pengetahuan SVN saya bisa diabaikan.
Anda mengkloning seluruh repositori jarak jauh tidak hanya cabang tertentu.
Repositori paling baik dibayangkan sebagai basis data, jadi Anda membuat tiruan dari kondisi saat ini dari basis data jauh. Tetapi setelah itu, Anda bekerja pada salinan database Anda sendiri; jika Anda berkomitmen, Anda mengubah database lokal Anda.
The
fetch
Perintah ini digunakan untuk menjaga database lokal sinkron dengan satu remote.Biasanya dari database lokal itu, Anda checkout cabang untuk bekerja. Ini tidak lain dari penanda internal untuk git, di mana pekerjaan Anda saat ini dimulai.
Katakanlah, Anda sedang mengerjakan repositori sederhana, di mana tidak ada cabang selain itu
master
, Anda bisa melihat ke dalam.git
folder untuk mengungkap "sihir":Asumsikan komit terakhir Anda (aktif
master
) adalah182e8220b404437b9e43eb78149d31af79040c66
, Anda akan menemukan persisnya di bawahcat .git/refs/heads/master
.Dari yang Anda cabut dari cabang baru
git checkout -b mybranch
, Anda akan menemukan pointer yang sama persis di filecat .git/refs/heads/mybranch
.Cabang tidak lebih dari "pointer". Marker "berfungsi" disebut a
HEAD
.Jika Anda ingin tahu di mana Anda
HEAD
berada:cat .git/HEAD
yang mengatakan misalnyaref: refs/heads/mybranch
, yang pada gilirannya menunjuk (cat .git/refs/heads/mybranch
) ke hash komit78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
Komit aktual disimpan di bawah
objects
folder (caranya adalah topiknya sendiri).Jangan bingung
working directory
dengan "git-database" secara keseluruhan. Seperti yang saya katakan di atas, direktori kerja Anda hanya snapshot dari (mungkin) subset.Katakanlah Anda memiliki cabang yang berbeda, direktori kerja Anda didedikasikan untuk mengerjakan cabang itu saja (meskipun Anda bisa meletakkan pekerjaan dari sana di tempat lain).
Biasanya, jika Anda ingin melihat, cabang apa yang ditentukan untuk proyek, Anda memiliki kemungkinan
git branch
untuk cabang lokalgit branch --remote
untuk cabang terpencilgit branch -a
untuk keduanya(atau
git branch -v
)Karena git adalah sistem kontrol versi terdistribusi, git tidak hanya memungkinkan, tetapi dianjurkan, untuk membuat cabang-cabang yang berbeda secara lokal / jauh.
Alur kerja khas saya adalah:
Ketika fitur selesai:
WIP
cabang (dengan rebasing interaktif) = buat satu komit dari ituWIP
cabang ke cabang fitur dan menawarkan itu (jika Anda bekerja dengan github tawaran itu akan disebut "permintaan tarik") untuk diintegrasikan ke dalam cabang (master) yang stabil.Itu tergantung pada bagaimana proyek Anda disusun:
Katakanlah Anda memiliki master yang stabil. Dan fitur hanya dikembangkan dari cabang stabil itu - jadi biasanya di belakang cabang fitur. Maka Anda akan memiliki komit terakhir pada master yang akan menjadi root dari cabang fitur.
Maka Anda akan membuat komit pada cabang master dan dapat memutuskan, apakah akan menggabungkan kedua cabang bersama-sama atau untuk rebase (yang merupakan semacam penggabungan untuk pengguna dengan kebutuhan canggih, katakanlah).
Atau Anda selalu dapat membuat perubahan pada cabang (mis.
master
) Dan memilihnya ke cabang lain.Ini terserah kamu.
Biasanya, Anda berakhir dengan nama repositori.
Tetapi ada beberapa kesempatan, ketika ini tidak diinginkan:
mis. Anda mengkloning oh-my-zsh dengan
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Here.oh-my-zsh
secara eksplisit disebut sebagai target.sumber
Git clone
sebenarnya mengkloning seluruh repositori, tetapi menetapkan direktori kerja Anda ke default (biasanya master).Anda dapat melihat cabang lain menggunakan
git branch
untuk melihat cabang lokal ataugit branch -r
untuk melihat cabang jarak jauh dan kemudiangit checkout
untuk beralih ke cabang yang ada atau membuat yang baru berdasarkan cabang saat ini.Anda harus membaca dokumentasi git untuk lebih jelasnya, dan Atlassian juga memiliki beberapa artikel bagus.
sumber
Cabang di git dan svn pada dasarnya berbeda.
Dalam svn cabang (atau tag) adalah direktori dalam repo.
Di git, cabang (atau tag) adalah pointer ke komit.
Dengan svn Anda bisa jika Anda ingin checkout akar repo. Ini berarti Anda telah memeriksa setiap cabang dan tag sekaligus. Afaict ini bukan cara normal untuk menggunakan svn.
Cabang git bukan direktori, jadi tidak ada kata lain untuk "memeriksa akar repo". Ada beberapa dukungan untuk beberapa pohon yang bekerja, jadi saya kira Anda bisa membuat skrip untuk checkout setiap cabang pada saat yang sama jika Anda benar-benar menginginkannya tetapi itu akan menjadi pemikiran yang agak tidak biasa.
Selanjutnya dengan SVN ada satu repo. Dengan git, setiap pengembang memiliki repo sendiri. Ini berarti pengembang dapat bekerja offline tetapi juga berarti pengembang yang berbeda mungkin memiliki gagasan berbeda tentang apa yang ada di setiap cabang.
Berdasarkan menjadi direktori dan berdasarkan model sejarah linear sederhana svn cabang svn memiliki sejarah yang kuat. Jika Anda ingin tahu apa yang ada di cabang x pada tanggal y Anda dapat dengan mudah mengajukan pertanyaan itu.
Cabang Git di sisi lain tidak benar-benar memiliki sejarah. Ada "reflog" tetapi dimaksudkan lebih sebagai mekanisme pemulihan bencana daripada sejarah jangka panjang. Secara khusus reflog tidak dapat dibaca dari jarak jauh dan dinonaktifkan secara default untuk repo kosong.
Komit tentu saja memiliki sejarah tetapi sejarah tersebut tidak cukup untuk menjawab pertanyaan "apa yang ada di cabang x dari laporan pada tanggal z".
Anda dapat mendaftar semua cabang lokal dengan mengetikkan "cabang git".
Anda dapat mendaftar semua cabang baik lokal maupun jarak jauh dengan menggunakan "git branch -a"
Beberapa pilihan.
Anda dapat melakukan perubahan pada "cabang lain", beralih ke master lakukan pekerjaan Anda di sana, lalu beralih kembali.
Anda juga dapat membuat pohon kerja tambahan. Google "git-worktree" untuk rincian tentang sintaks.
Saya tidak berpikir ada konvensi yang mapan. Memeriksa beberapa pohon yang bekerja sekaligus adalah pengecualian, bukan aturannya.
sumber