Paksa pengguna Git? [Tutup]

173

Ada banyak dokumentasi "Git untuk Perforce pengguna" di luar sana, tetapi tampaknya sangat sedikit kebalikannya.

Saya hanya menggunakan Git sebelumnya dan baru-baru ini memulai pekerjaan di mana saya harus banyak menggunakan Perforce, dan saya sering merasa sangat bingung. Konsep yang saya gunakan dari Git tampaknya tidak memetakan ke Perforce sama sekali.

Adakah yang tertarik untuk mengumpulkan beberapa tips untuk menggunakan Perforce untuk seseorang yang terbiasa dengan Git?

Brennan Vincent
sumber

Jawaban:

334

Ini sesuatu yang saya kerjakan selama beberapa minggu terakhir. Ini masih berkembang, tetapi mungkin bermanfaat. Harap dicatat saya seorang karyawan Perforce.

Pengantar Perforce untuk pengguna Git

Mengatakan bahwa pindah dari Git ke Perforce atau dari Perforce ke Git adalah hal yang tidak sepele adalah pernyataan yang meremehkan. Karena menjadi dua alat yang seolah-olah melakukan hal yang sama, pendekatan mereka tidak bisa lebih berbeda. Artikel singkat ini akan mencoba membantu pengguna Perforce baru yang datang dari Git memahami dunia baru mereka.

Satu jalan memutar singkat sebelum kita menyelam; jika Anda lebih suka Git, Anda bisa menggunakan Git dengan Perforce dengan cukup baik. Kami menyediakan alat yang disebut Git Fusion yang menghasilkan repositori Git yang disinkronkan dengan server Perforce. Orang-orang Git dan Perforce dapat hidup dalam harmoni bekerja dengan kode yang sama, sebagian besar tidak terpengaruh oleh pilihan kontrol versi rekan kerja mereka. Git Fusions 13.3 tersedia dari situs web Perforce . Memang perlu diinstal oleh administrator Perforce, tetapi jika Anda menginstalnya Anda akan menemukan bahwa fitur slicing repository-nya bisa sangat berguna sebagai pengguna Git.

Jika Anda tidak dapat meyakinkan admin Anda untuk menginstal Git Fusion, Git sendiri dilengkapi dengan Perforce binding yang disebut Git-P4 yang memungkinkan Anda menggunakan Git untuk mengubah dan mengirimkan file di ruang kerja Perforce. Informasi lebih lanjut tentang itu dapat ditemukan di: https://git.wiki.kernel.org/index.php/GitP4

Masih di sini? Bagus, mari kita lihat Perforce.

Beberapa Perbedaan Terminologi untuk Diurutkan

Sebelum kita masuk ke perincian, kita perlu membahas secara singkat perbedaan terminologi pasangan antara Git dan Perforce.

Yang pertama adalah checkout . Di Git, inilah cara Anda mendapatkan salinan kode dari cabang tertentu ke area kerja Anda. Di Perforce kami menyebutnya sinkronisasi dari baris perintah atau dari GUI P4V kami "Dapatkan Revisi Terbaru". Perforce menggunakan kata checkout dari P4V atau p4 editdari baris perintah yang berarti bahwa Anda berencana untuk mengubah file dari sistem kontrol versi. Di sisa dokumen ini, saya akan menggunakan checkout dalam arti kata Perforce.

Yang kedua adalah Git commit versus Perforce submit . Di mana Anda akan melakukan di Git, Anda akan mengirimkan di Perforce. Menjadi bahwa semua operasi terjadi terhadap layanan versi Perforce bersama, Perforce tidak memiliki yang setara untuk git push. Demikian juga kita tidak punya pull; perintah sinkronisasi dari atas menangani mendapatkan file untuk kami. Tidak ada konsep pengiriman lokal murni di Perforce kecuali Anda memilih untuk menggunakan alat P4Sandbox kami yang dijelaskan secara singkat di bawah ini.

Konsep Kunci dalam Perforce

Jika saya harus menyederhanakan Perforce menjadi dua konsep utama saya akan fokus pada depot dan ruang kerja. Depot Perforce adalah repositori file yang hidup di server Perforce. Server Perforce dapat memiliki sejumlah depot dan setiap depot dapat berisi sejumlah file. Seringkali Anda akan mendengar pengguna Perforce menggunakan depot dan server secara bergantian, tetapi mereka berbeda. Situs Perforce dapat memilih untuk memiliki beberapa server, tetapi umumnya semua file berada dalam satu server.

Ruang kerja atau klien Perforce adalah objek dalam sistem yang memetakan set file di server Perforce ke lokasi di sistem file pengguna. Setiap pengguna memiliki ruang kerja untuk setiap mesin yang mereka gunakan, dan seringkali pengguna akan memiliki lebih dari satu ruang kerja untuk mesin yang sama. Bagian terpenting dari ruang kerja adalah pemetaan atau tampilan ruang kerja.

Tampilan ruang kerja menentukan set file di depot yang harus dipetakan ke mesin lokal. Ini penting karena ada peluang bagus bahwa Anda tidak ingin semua file yang tersedia di server. Tampilan ruang kerja memungkinkan Anda memilih hanya set yang Anda pedulikan. Penting untuk dicatat bahwa ruang kerja dapat memetakan konten dari beberapa depo, tetapi hanya dapat memetakan konten dari satu server.

Untuk membandingkan Perforce dengan Git dalam hal ini, dengan Git Anda memilih dan memilih serangkaian repositori Git yang Anda minati. Setiap repo umumnya tertutup rapat berisi hanya file-file terkait. Keuntungan dari ini adalah tidak ada konfigurasi untuk dilakukan di pihak Anda; Anda melakukan klon git dari hal-hal yang Anda pedulikan dan Anda selesai. Ini sangat baik jika Anda hanya bekerja dengan satu atau dua repositori. Dengan Perforce Anda harus menghabiskan sedikit waktu memetik dan memilih bit kode yang Anda inginkan.

Banyak toko Perforce menggunakan aliran yang dapat secara otomatis menghasilkan tampilan ruang kerja, atau mereka menghasilkan tampilan menggunakan skrip atau ruang kerja templat. Banyak yang meninggalkan pengguna mereka untuk menghasilkan ruang kerja mereka sendiri. Salah satu keuntungan bisa memetakan sejumlah modul dalam satu ruang kerja adalah Anda dapat dengan mudah memodifikasi beberapa modul kode dalam satu checkin; Anda dapat dijamin bahwa siapa pun yang memiliki tampilan klien serupa yang menyinkronkan checkin Anda akan memiliki semua kode dalam keadaan yang benar. Ini juga dapat menyebabkan kode terlalu tergantung; pemisahan paksa Git dapat menyebabkan modularitas yang lebih baik. Untungnya Perforce juga dapat mendukung modularitas yang ketat juga. Ini semua pertanyaan tentang bagaimana Anda memilih untuk menggunakan alat ini.

Mengapa ruang kerja?

Saya pikir dengan datang dari Git mudah untuk merasa seperti seluruh konsep ruang kerja jauh lebih banyak masalah daripada nilainya. Dibandingkan dengan kloning beberapa repositori Git, ini tidak diragukan lagi benar. Di mana ruang kerja bersinar, dan alasan Perforce masih dalam bisnis setelah bertahun-tahun ini, adalah bahwa ruang kerja adalah cara yang fantastis untuk memangkas jutaan proyek file untuk pengembang sambil tetap membuatnya mudah untuk dibuat dan dirilis untuk menarik semua sumber dari satu sumber otoritatif. Ruang kerja adalah salah satu alasan utama mengapa Perforce dapat berskala sebaik itu.

Ruang kerja juga bagus karena tata letak file di depot dan tata letak pada mesin pengguna dapat bervariasi jika perlu. Banyak perusahaan mengatur depot mereka untuk mencerminkan organisasi perusahaan mereka sehingga mudah bagi orang untuk menemukan konten berdasarkan unit bisnis atau proyek. Namun sistem build mereka tidak peduli tentang hierarki ini; ruang kerja memungkinkan mereka untuk memetakan ulang hierarki depot mereka dengan cara apa pun yang masuk akal untuk alat mereka. Saya juga telah melihat ini digunakan oleh perusahaan yang menggunakan sistem build yang sangat tidak fleksibel yang memerlukan kode untuk berada dalam konfigurasi yang sangat spesifik yang benar-benar membingungkan manusia. Ruang kerja memungkinkan perusahaan-perusahaan ini untuk memiliki hierarki sumber yang dapat dinavigasi oleh manusia sementara alat bangun mereka mendapatkan struktur yang mereka butuhkan.

Ruang kerja di Perforce tidak hanya digunakan untuk memetakan set file yang ingin dikerjakan pengguna, tetapi mereka juga digunakan oleh server untuk melacak dengan tepat revisi dari setiap file yang telah disinkronkan pengguna. Ini memungkinkan sistem untuk mengirim set file yang benar ke pengguna ketika menyinkronkan tanpa harus memindai file untuk melihat file mana yang perlu diperbarui. Dengan sejumlah besar data, ini bisa menjadi kemenangan kinerja yang cukup besar. Ini juga sangat populer di industri yang memiliki aturan audit yang sangat ketat; Admin Perforce dapat dengan mudah melacak dan mencatat pengembang mana yang telah menyinkronkan file mana.

Untuk informasi lebih lanjut tentang kekuatan penuh ruang kerja Perforce, baca Mengkonfigurasi P4 .

Checkout Eksplisit vs. Checkout Implisit

Salah satu tantangan terbesar bagi pengguna yang pindah dari Git ke Perforce adalah konsep checkout eksplisit. Jika Anda terbiasa dengan alur kerja Git / SVN / CVS mengubah file dan kemudian memberitahu sistem kontrol versi untuk mencari apa yang telah Anda lakukan, itu bisa menjadi transisi yang sangat menyakitkan.

Berita baiknya adalah jika Anda memilihnya, Anda dapat bekerja dengan alur kerja gaya Git di Perforce. Di Perforce Anda dapat mengatur opsi "allwrite" di ruang kerja Anda. Ini akan memberi tahu Perforce bahwa semua file harus ditulis ke disk dengan set bit yang dapat ditulis. Anda kemudian dapat mengubah file apa pun yang Anda inginkan tanpa secara tegas memberi tahu Perforce. Agar Perforce merekonsiliasi perubahan yang Anda buat, Anda dapat menjalankan "status p4". Ini akan membuka file untuk menambah, mengedit, dan menghapus yang sesuai. Saat bekerja dengan cara ini, Anda ingin menggunakan "pembaruan p4" alih-alih "sinkronisasi p4" untuk mendapatkan revisi baru dari server; "pembaruan p4" memeriksa perubahan sebelum disinkronkan sehingga tidak akan mengganggu perubahan lokal Anda jika Anda belum menjalankan "status p4".

Mengapa Checkout Eksplisit?

Pertanyaan yang sering saya terima adalah "mengapa Anda ingin menggunakan checkout eksplisit?" Awalnya dapat memerah tampaknya menjadi keputusan desain gila, tetapi checkout eksplisit memang memiliki beberapa manfaat yang kuat.

Salah satu alasan untuk menggunakan checkout eksplisit adalah menghilangkan kebutuhan untuk memindai file untuk perubahan konten. Sementara dengan proyek yang lebih kecil menghitung hash untuk setiap file untuk menemukan perbedaan cukup murah, banyak pengguna kami memiliki jutaan file di ruang kerja dan / atau memiliki file yang berukuran 100 megabita, jika tidak lebih besar. Menghitung semua hash dalam kasus tersebut sangat memakan waktu. Checkout eksplisit memungkinkan Perforce tahu persis file mana yang perlu bekerja dengannya. Perilaku ini adalah salah satu alasan Perforce sangat populer di industri file besar seperti game, film, dan industri perangkat keras.

Manfaat lain adalah checkout eksplisit menyediakan bentuk komunikasi asinkron yang memungkinkan pengembang tahu secara umum apa yang sedang dikerjakan rekan-rekan mereka, atau setidaknya di mana. Ini dapat memberi tahu Anda bahwa Anda mungkin ingin menghindari bekerja di area tertentu untuk menghindari konflik yang tidak perlu, atau dapat mengingatkan Anda pada fakta bahwa pengembang baru dalam tim telah berkeliaran ke dalam kode yang mungkin tidak mereka perlukan untuk mengedit. Pengalaman pribadi saya adalah bahwa saya cenderung bekerja di Git atau menggunakan Perforce dengan allwrite pada proyek-proyek di mana saya menjadi satu-satunya kontributor atau kontributor yang jarang, dan checkout eksplisit ketika saya bekerja erat dengan sebuah tim. Untungnya pilihan ada di tangan Anda.

Checkout eksplisit juga bermain baik dengan konsep Perforce daftar perubahan tertunda. Daftar perubahan yang tertunda adalah ember tempat Anda dapat memasukkan file terbuka untuk mengatur pekerjaan Anda. Di Git Anda berpotensi menggunakan cabang berbeda sebagai ember untuk mengorganisir pekerjaan. Cabang memang bagus, tapi terkadang menyenangkan untuk mengatur pekerjaan Anda menjadi beberapa perubahan bernama sebelum benar-benar mengirimkan ke server. Dengan model Perforce yang berpotensi memetakan banyak cabang atau beberapa proyek ke dalam satu ruang kerja, daftar perubahan yang tertunda membuatnya mudah untuk menjaga perubahan yang terpisah terorganisir.

Jika Anda menggunakan IDE untuk pengembangan seperti Visual Studio atau Eclipse, saya sangat menyarankan untuk menginstal plugin Perforce untuk IDE Anda. Sebagian besar plugin IDE akan secara otomatis checkout file ketika Anda mulai mengeditnya, membebaskan Anda dari keharusan melakukan checkout sendiri.

Ganti Perforce Untuk Fitur Git

  • git stash ==> p4 shelve
  • git cabang lokal ==> baik rak Perforce atau cabang tugas
  • git blame==> p4 annotateatau Perforce Timelapse View dari GUI

Bekerja Terputus

Ada dua opsi untuk bekerja yang terputus dari layanan versi Perforce (itulah istilah umum kami untuk server Perforce).

1) Gunakan P4Sandbox untuk memiliki versi lokal lengkap dan percabangan lokal

2) Edit file sesuka Anda dan gunakan 'status p4' untuk memberi tahu Perforce apa yang telah Anda lakukan

Dengan kedua opsi di atas, Anda dapat memilih untuk menggunakan pengaturan "allwrite" di ruang kerja Anda sehingga Anda tidak perlu membuka kunci file. Saat bekerja dalam mode ini, Anda akan ingin menggunakan perintah "pembaruan p4" untuk menyinkronkan file baru alih-alih "sinkronisasi p4". "pembaruan p4" akan memeriksa perubahan file sebelum menyinkronkannya.

Mulai Cepat Paksa

Semua contoh berikut akan melalui baris perintah.

1) Konfigurasikan koneksi Anda ke Perforce

export P4USER=matt
export P4CLIENT=demo-workspace
export P4PORT=perforce:1666

Anda dapat menempel pengaturan ini di file konfigurasi shell Anda, gunakan p4 setuntuk menyimpannya di Windows dan OS X, atau menggunakan file konfigurasi Perforce.

1) Buat ruang kerja

p4 workspace

# set your root to where your files should live:
Root: /Users/matt/work

# in the resulting editor change your view to map the depot files you care about
//depot/main/... //demo-workspace/main/...
//depot/dev/...  //demo-workspace/dev/...

2) Dapatkan file dari server

cd /Users/matt/work
p4 sync

3) Periksa file yang ingin Anda kerjakan dan modifikasi

p4 edit main/foo; 
echo cake >> main/foo

4) Kirim ke server

p4 submit -d "A trivial edit"

5) Jalankan p4 help simpleuntuk melihat perintah dasar yang Anda perlukan untuk bekerja dengan Perforce.

Mat
sumber
5
Tinjauan yang luar biasa. Saya akan menyimpan ini (atau pos yang dihasilkan di situs web) untuk diberikan kepada beberapa karyawan baru kami.
Caleb Huitt - cjhuitt
@Matt mengatakan "datang dari Git mudah untuk merasa seperti seluruh konsep ruang kerja jauh lebih banyak masalah daripada nilainya." Mungkin - tetapi saya telah melakukan pemetaan seperti itu di RCS dan CVS selama bertahun-tahun. Tidak menggunakan modul CVS, tetapi dengan membuat pohon symlink yang menunjuk ke satu atau lebih repo CVS. Pohon jarang, tidak mengandung semua direktori. Untuk banyak alasan Anda menggambarkan Perforce melakukannya. Ini bisa menyusahkan untuk mempertahankan ini di CVS. (Dan git, dan hg, dan bzr ... tidak begitu yakin tentang bzr.)
Krazy Glew
Terima kasih Matt, bacaan yang sangat berguna. Saya masih berpikir bahwa sistem versi harus memberi tahu saya apa yang saya ubah secara lokal dibandingkan dengan repo jarak jauh atau antara cabang dan bukan sebaliknya :)
jupp0r
1
Memang! Untungnya Anda dapat melakukannya dengan Perforce; Saya belum menjalankan 'p4 edit' selama bertahun-tahun. perforce.com/blog/131112/say-goodbye-p4-edit
Matt
8
Terima kasih, tapi saran. Kata 'kuat' agak musang dan membuat saya cenderung mengabaikan pernyataan sebagai propaganda. Saya lebih suka jika Anda menjelaskan fitur dan kemudian biarkan saya memutuskan apakah itu kuat atau tidak.
damian
24

Perbedaan terbesar antara git dan p4, yang tidak dijawab oleh jawaban yang ada, adalah bahwa mereka menggunakan unit abstraksi yang berbeda.

  • Dalam git, abstraksi adalah tambalan (alias diff, alias changeset). Komit di git pada dasarnya adalah output dari menjalankan diffantara keadaan sebelumnya dan saat ini dari file yang sedang dikomit.
  • Dalam terpaksa, abstraksi adalah file . Komit dalam p4 adalah konten lengkap file dalam komit pada saat itu. Ini diatur dalam daftar perubahan, tetapi revisi itu sendiri disimpan berdasarkan per file, dan daftar perubahan hanya mengumpulkan revisi berbeda dari file bersama-sama.

Segala sesuatu yang lain mengalir dari perbedaan ini . Bercabang dan menggabungkan dalam git tidak menyakitkan karena, dari perspektif abstraksi git, setiap file dapat direkonstruksi sepenuhnya dengan menerapkan satu set tambalan secara berurutan, dan oleh karena itu untuk menggabungkan dua cabang, Anda hanya perlu menerapkan semua tambalan pada cabang sumber yang tidak ada di cabang target ke cabang target dalam urutan yang benar (dengan asumsi tidak ada tambalan di kedua cabang yang tumpang tindih).

Cabang Perforce berbeda. Operasi cabang di perforce akan menyalin file dari satu subfolder ke yang lain, dan kemudian menandai keterkaitan antara file dengan metadata di server. Untuk menggabungkan file dari satu cabang ke cabang lainnya ( integrationdalam istilah perforce), perforce akan melihat konten lengkap file di 'kepala' di cabang sumber dan konten lengkap file di kepala cabang target dan jika perlu bergabung menggunakan leluhur yang sama. Ia tidak dapat menerapkan tambalan satu per satu seperti git can, yang berarti penggabungan manual lebih sering terjadi (dan cenderung lebih menyakitkan).

Damian
sumber
10
Saya tidak berpikir deskripsi ini sepenuhnya akurat - git menyimpan snapshot lengkap semua file, dan membuat snapshot baru ketika file diubah (yang membuatnya mahal jika sering dilakukan perubahan pada file biner besar), jadi komit hanya berisi tautan (melalui hash) ke keadaan saat ini dari semua file. Itu sebabnya beralih cabang di git biasanya sangat cepat - hanya perlu menyalin versi yang direferensikan dari semua file yang hashnya telah berubah menjadi ruang kerja. Diff hanya dibuat dengan cepat jika perlu untuk membandingkan dan menggabungkan / rebasing.
ChrAfonso
3
Terlepas dari implementasi tepat di bawah kap, perintah gabungan di git (terutama gabungan sepele atau maju cepat) tampaknya beroperasi menggunakan tambalan dari perspektif pengguna akhir , yang merupakan titik yang saya coba buat.
damian
Perforce dapat melakukan gabungan daftar perubahan (changeset). Inilah pertanyaan Stack Overflow yang membicarakannya. stackoverflow.com/questions/6158916/perforce-merge-changelist/…
Br.Bill
5
@ Br.Bill Lagi, intinya saya membuat bukanlah apakah P4 mampu melakukan sesuatu (karena tentu saja itu!). Intinya adalah tentang abstraksi , yaitu model yang perlu diinternalisasi pengguna untuk memahami cara kerjanya.
damian
1
Terima kasih untuk ini. Ini segera menjelaskan bagaimana kita bisa mendapatkan Versi Terbaru dari file tertentu, bagaimana kita bisa mendapatkan daftar perubahan tertentu. Ini adalah bagian yang paling membingungkan bagi saya karena saya berasal dari git.
Abdulsattar Mohammed
20

Mungkin tidak ada banyak dokumentasi seperti itu karena Perforce adalah sistem kontrol revisi yang cukup tradisional (lebih dekat ke CVS, Subversion, dll.) Dan biasanya dianggap kurang rumit daripada sistem kontrol revisi yang didistribusikan modern.

Mencoba memetakan perintah dari satu ke yang lain bukanlah pendekatan yang tepat; konsep dari sistem kontrol revisi terpusat vs terdistribusi tidak sama. Sebagai gantinya, saya akan menjelaskan alur kerja khas di Perforce:

  1. Jalankan p4 editpada setiap file yang ingin Anda edit. Anda perlu memberi tahu Perforce file mana yang sedang Anda edit. Jika Anda menambahkan file baru, gunakan p4 add. Jika Anda menghapus file, gunakan p4 delete.
  2. Buat perubahan kode Anda.
  3. Jalankan p4 changeuntuk membuat perubahan. Di sini Anda dapat membuat deskripsi tentang perubahan Anda dan secara opsional menambahkan atau menghapus file dari perubahan Anda juga. Anda dapat menjalankan p4 change CHANGE_NUMBERuntuk mengedit deskripsi nanti jika perlu.
  4. Anda dapat membuat perubahan kode tambahan jika perlu. Jika Anda perlu menambah / mengedit / menghapus file lain, Anda dapat menggunakan p4 {add,edit,delete} -c CHANGE_NUMBER FILE.
  5. Jalankan p4 syncuntuk menarik perubahan terbaru dari server.
  6. Jalankan p4 resolveuntuk menyelesaikan konflik apa pun dari sinkronisasi.
  7. Saat Anda siap mengirim perubahan, jalankan p4 submit -c CHANGE_NUMBER.

Anda dapat menggunakan p4 revertuntuk mengembalikan perubahan Anda ke file.

Perhatikan bahwa Anda dapat mengerjakan beberapa perubahan secara bersamaan selama tidak ada file yang tumpang tindih. (File di klien Perforce Anda dapat dibuka hanya dalam satu perubahan pada satu waktu.) Ini kadang-kadang bisa nyaman jika Anda memiliki perubahan kecil dan independen.

Jika Anda merasa perlu mengedit file yang sudah Anda buka di set perubahan lain, Anda bisa membuat klien Perforce terpisah atau Anda dapat menyimpan perubahan yang ada untuk nanti melalui p4 shelve. (Tidak seperti git stashrak tidak mengembalikan file di pohon lokal Anda, jadi Anda harus mengembalikannya secara terpisah.)

jamesdlin
sumber
3
Maaf saya tidak mengerti: apakah sistem modern harus lebih rumit daripada sistem tradisional? Kesederhanaan selalu menjadi prinsip dalam rekayasa perangkat lunak. Dalam beberapa hal, saya pikir P4 jauh lebih modern baik dalam konsep dan kegunaan (dan pemeliharaan) daripada Git. Saya tidak membenci Git, tetapi lihatlah, setelah 30 tahun kemajuan rekayasa perangkat lunak, orang-orang terpaksa menggunakan kembali konsol berbasis teks untuk mengeluarkan perintah VCS - sebuah kemunduran dalam evolusi manusia!
Dejavu
5
@Dejavu Ini bukan tentang tradisional vs modern; ini lebih tentang terpusat vs. didistribusikan (dan yang terdistribusi lebih modern). Yang didistribusikan tidak selalu lebih rumit, tetapi saya mengatakan secara khusus bahwa "Perforce ... dianggap kurang rumit ...", yang merupakan pernyataan pendapat, bukan fakta, dan yang tidak dimaksudkan sebagai selimut pernyataan tentang semua sistem. Saya pribadi menganggap git lebih kompleks karena ia menambahkan lebih banyak konsep (misalnya mendorong, menarik, mengubah), dan beberapa hal tidak semudah itu (misalnya hash, bukan bilangan perubahan global).
jamesdlin
2
Terima kasih atas klarifikasi, James! Saya hanya sedikit terhina baru-baru ini melihat semua rekan kerja harus dilatih sebagai peretas git yang harus mengetahui banyak keterampilan peretasan git untuk menyelesaikan beberapa masalah yang terasa sangat intuitif saat menggunakan Perforce.
Dejavu
4
@Dejavu, komentar Anda tidak masuk akal, mengingat IDE modern mendukung grafis git, dan mereka telah melakukannya selama bertahun-tahun.
Acumenus