Daripada perkenalan
hello! Hari ini kita akan bercakap tentang sistem kawalan versi, iaitu Git.
Asas Git
Git ialah sistem kawalan versi teragih untuk kod kami. Mengapa kita memerlukannya? Pasukan teragih memerlukan beberapa jenis sistem untuk mengurus kerja mereka. Ia diperlukan untuk menjejaki perubahan yang berlaku dari semasa ke semasa. Iaitu, kita perlu dapat melihat langkah demi langkah fail mana yang telah berubah dan bagaimana. Ini amat penting apabila anda menyiasat perkara yang berubah dalam konteks satu tugasan, membolehkan perubahan itu dikembalikan.Memasang Git
Mari pasang Java pada komputer anda.Memasang pada Windows
Seperti biasa, anda perlu memuat turun dan menjalankan fail exe. Segala-galanya mudah di sini: klik pada pautan Google yang pertama , lakukan pemasangan, dan itu sahaja. Untuk melakukan ini, kami akan menggunakan konsol bash yang disediakan oleh Windows. Pada Windows, anda perlu menjalankan Git Bash. Begini rupanya dalam Menu Mula:

Memasang pada Linux
Biasanya Git adalah sebahagian daripada pengedaran Linux dan sudah dipasang, kerana ia adalah alat yang pada asalnya ditulis untuk pembangunan kernel Linux. Tetapi ada situasi yang tidak. Untuk menyemak, anda perlu membuka terminal dan tulis: git --version. Jika anda mendapat jawapan yang boleh difahami, maka tiada apa yang perlu dipasang. Buka terminal dan pasang Git pada Ubuntu . Saya sedang mengusahakan Ubuntu, jadi saya boleh memberitahu anda apa yang perlu ditulis untuknya: sudo apt-get install git.Memasang pada macOS
Di sini juga, anda perlu menyemak sama ada Git sudah ada di sana. Jika anda tidak memilikinya, maka cara paling mudah untuk mendapatkannya ialah dengan memuat turun versi terkini di sini . Jika Xcode dipasang, maka Git pasti akan dipasang secara automatik.tetapan Git
Git mempunyai tetapan pengguna untuk pengguna yang akan menyerahkan kerja. Ini masuk akal dan perlu, kerana Git mengambil maklumat ini untuk medan Pengarang apabila komit dibuat. Sediakan nama pengguna dan kata laluan untuk semua projek anda dengan menjalankan arahan berikut:
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
Jika anda perlu menukar pengarang untuk projek tertentu, anda boleh mengalih keluar "--global". Ini akan memberi kita perkara berikut:
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
Sedikit teori...
Untuk menyelami topik ini, kami harus memperkenalkan anda kepada beberapa perkataan dan tindakan baharu...- git repositori
- komited
- cawangan
- bercantum
- konflik
- tarik
- menolak
- bagaimana untuk mengabaikan beberapa fail (.gitignore)
Status dalam Git
Git mempunyai beberapa patung yang perlu difahami dan diingati:- tidak dikesan
- diubahsuai
- dipentaskan
- komited
Bagaimana anda harus memahami ini?
Ini adalah status yang digunakan pada fail yang mengandungi kod kami:- Fail yang dibuat tetapi belum ditambahkan pada repositori mempunyai status "tidak dijejaki".
- Apabila kami membuat perubahan pada fail yang telah ditambahkan pada repositori Git, maka statusnya "diubah suai".
- Antara fail yang telah kami ubah, kami memilih fail yang kami perlukan, dan kelas ini ditukar kepada status "berperingkat".
- Komit dibuat daripada fail yang disediakan dalam keadaan berperingkat dan masuk ke repositori Git. Selepas itu, tiada fail dengan status "berperingkat". Tetapi mungkin masih terdapat fail yang statusnya "diubah suai".

Apakah komitmen?
Komit ialah peristiwa utama dalam hal kawalan versi. Ia mengandungi semua perubahan yang dibuat sejak komit bermula. Komit dipautkan bersama seperti senarai pautan tunggal. Lebih khusus: Terdapat komitmen pertama. Apabila komit kedua dibuat, ia tahu apa yang berlaku selepas yang pertama. Dan dengan cara ini, maklumat boleh dikesan. Komit juga mempunyai maklumatnya sendiri, yang dipanggil metadata:- pengecam unik commit, yang boleh digunakan untuk mencarinya
- nama pengarang komit, yang menciptanya
- tarikh komit dibuat
- ulasan yang menerangkan perkara yang telah dilakukan semasa komit

Apakah cawangan?
Cawangan adalah penunjuk kepada beberapa komitmen. Oleh kerana komit mengetahui komit mana yang mendahuluinya, apabila cawangan menunjuk ke komit, semua komit sebelumnya juga terpakai padanya. Oleh itu, kami boleh mengatakan bahawa anda boleh mempunyai seberapa banyak cawangan yang anda mahu menunjukkan komitmen yang sama. Kerja berlaku dalam cawangan, jadi apabila komit baharu dibuat, cawangan mengalihkan penunjuknya ke komit yang lebih terkini.Bermula dengan Git
Anda boleh bekerja dengan repositori tempatan sahaja dan juga dengan repositori jauh. Untuk mempraktikkan arahan yang diperlukan, anda boleh mengehadkan diri anda kepada repositori tempatan. Ia hanya menyimpan semua maklumat projek secara setempat dalam folder .git. Jika kita bercakap tentang repositori jauh, maka semua maklumat disimpan di suatu tempat pada pelayan jauh: hanya salinan projek disimpan secara tempatan. Perubahan yang dibuat pada salinan tempatan anda boleh ditolak (git push) ke repositori jauh. Dalam perbincangan kami di sini dan di bawah, kami bercakap tentang bekerja dengan Git dalam konsol. Sudah tentu, anda boleh menggunakan beberapa jenis penyelesaian berasaskan GUI (contohnya, IntelliJ IDEA), tetapi mula-mula anda harus memikirkan arahan yang sedang dilaksanakan dan maksudnya.Bekerja dengan Git dalam repositori tempatan
Seterusnya, saya cadangkan anda mengikuti dan melaksanakan semua langkah yang saya lakukan semasa anda membaca artikel tersebut. Ini akan meningkatkan pemahaman dan penguasaan anda terhadap bahan tersebut. Nah, selamat makan! :) Untuk membuat repositori tempatan, anda perlu menulis:
git init

git status

- git add -A - tambah semua fail ke status "berperingkat".
- git add . — tambah semua fail daripada folder ini dan semua subfolder. Pada asasnya, ini adalah sama seperti yang sebelumnya
- git add <nama fail> — menambah fail tertentu. Di sini anda boleh menggunakan ungkapan biasa untuk menambah fail mengikut beberapa corak. Contohnya, git add *.java: Ini bermakna anda hanya mahu menambah fail dengan sambungan java.
git add *.txt
Untuk menyemak status, kami menggunakan arahan yang telah kami ketahui:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

git add test_resource.txt
git commit -m "added hello word! to test_resource.txt"
Untuk melihat semua komitmen, tulis:
git log

git add GitTest.java
git commit -m "added GitTest.java"
git status

Bekerja dengan .giignore
Jelas sekali, kami hanya mahu menyimpan kod sumber sahaja, dan tiada yang lain, dalam repositori. Jadi apa lagi yang boleh ada? Sekurang-kurangnya, kelas terkumpul dan/atau fail yang dijana oleh persekitaran pembangunan. Untuk memberitahu Git supaya mengabaikannya, kita perlu mencipta fail khas. Lakukan ini: buat fail bernama .giignore dalam akar projek. Setiap baris dalam fail ini mewakili corak untuk diabaikan. Dalam contoh ini, fail .giignore akan kelihatan seperti ini:
```
*.class
target/
*.iml
.idea/
```
Mari kita lihat:
- Baris pertama ialah mengabaikan semua fail dengan sambungan .class
- Baris kedua ialah mengabaikan folder "sasaran" dan semua yang terkandung di dalamnya
- Baris ketiga ialah mengabaikan semua fail dengan sambungan .iml
- Baris keempat ialah mengabaikan folder .idea
git status


git add .gitignore
git commit -m "added .gitignore file"
Dan kini detik kebenaran: kami mempunyai kelas terkumpul GitTest.class yang "tidak dijejaki", yang kami tidak mahu tambahkan pada repositori Git. Sekarang kita harus melihat kesan fail .giignore:
git status

Bekerja dengan cawangan dan sebagainya
Sememangnya, bekerja di satu cawangan sahaja menyusahkan pembangun bersendirian, dan adalah mustahil apabila terdapat lebih daripada seorang dalam satu pasukan. Itulah sebabnya kami mempunyai cawangan. Seperti yang saya katakan tadi, cawangan hanyalah penunjuk alih untuk melakukan. Dalam bahagian ini, kita akan meneroka bekerja di cawangan yang berbeza: cara menggabungkan perubahan daripada satu cawangan ke cawangan lain, konflik yang mungkin timbul dan banyak lagi. Untuk melihat senarai semua cawangan dalam repositori dan memahami yang mana anda berada, anda perlu menulis:
git branch -a

- buat cawangan baharu berdasarkan cawangan kami (99% daripada kes)
- buat cawangan berdasarkan komitmen tertentu (1% daripada kes)
Mari buat cawangan berdasarkan komitmen tertentu
Kami akan bergantung pada pengecam unik komit. Untuk mencarinya, kami menulis:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
Cawangan dibuat dengan hanya dua komit pertama daripada cawangan induk. Untuk mengesahkan ini, kami mula-mula pastikan untuk beralih ke cawangan lain dan melihat bilangan komitmen di sana:
git status
git log

git branch -a

Mari buat cawangan berdasarkan cawangan semasa
Cara kedua untuk mencipta cawangan ialah menciptanya daripada yang lain. Saya ingin membuat cawangan berdasarkan cawangan induk. Pertama, saya perlu beralih kepadanya, dan langkah seterusnya ialah mencipta yang baharu. Mari kita lihat:- git checkout master - tukar ke cawangan induk
- git status — sahkan bahawa kami sebenarnya berada di cawangan induk

git checkout -b feature/update-txt-files

Penyelesaian konflik
Sebelum kita meneroka apa itu konflik, kita perlu bercakap tentang menggabungkan satu cabang kepada yang lain. Gambar ini menggambarkan proses penggabungan satu cawangan kepada yang lain:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

git branch -D feature/update-txt-files
Semuanya jelas setakat ini, ya? Mari kita rumitkan keadaan: sekarang katakan bahawa anda perlu menukar fail txt sekali lagi. Tetapi kini fail ini akan ditukar dalam cawangan induk juga. Dengan kata lain, ia akan berubah secara selari. Git tidak akan dapat memikirkan apa yang perlu dilakukan apabila kami ingin menggabungkan kod baharu kami ke dalam cawangan induk. Mari pergi! Kami akan membuat cawangan baharu berdasarkan induk, membuat perubahan pada text_resource.txt dan membuat komitmen untuk kerja ini:
git checkout -b feature/add-header
... we make changes to the file

git add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

git add test_resource.txt
git commit -m "added master header to txt"
Dan sekarang perkara yang paling menarik: kita perlu menggabungkan perubahan daripada cawangan ciri/tambah-kepala kepada menguasai. Kami berada di cawangan induk, jadi kami hanya perlu menulis:
git merge feature/add-header
Tetapi hasilnya akan menjadi konflik dalam fail test_resource.txt: 

- Perubahan yang terdapat pada baris ini dalam cawangan induk ditemui di antara "<<<<<<<< HEAD" dan "=======".
- Perubahan yang terdapat dalam cawangan ciri/tambah-pengepala ditemui di antara "=======" dan ">>>>>>> ciri/pengepala tambah".

git status

git add *.txt

git commit

Bekerja dengan repositori jauh
Langkah terakhir ialah memikirkan beberapa lagi arahan yang diperlukan untuk berfungsi dengan repositori jauh. Seperti yang saya katakan, repositori jauh adalah tempat di mana repositori disimpan dan dari mana anda boleh mengklonkannya. Apakah jenis repositori jauh yang ada? Contoh:-
GitHub ialah platform storan terbesar untuk repositori dan pembangunan kolaboratif. Saya telah menerangkannya dalam artikel sebelum ini.
Ikuti saya di GitHub . Saya sering mempamerkan kerja saya di sana dalam bidang yang saya belajar untuk bekerja. -
GitLab ialah alat berasaskan web untuk kitaran hayat DevOps dengan sumber terbuka . Ia ialah sistem berasaskan Git untuk mengurus repositori kod dengan wikinya sendiri, sistem penjejakan pepijat , saluran paip CI/CD dan fungsi lain.
Selepas berita bahawa Microsoft membeli GitHub, beberapa pembangun menduplikasi projek mereka dalam GitLab. -
BitBucket ialah perkhidmatan web untuk pengehosan projek dan pembangunan kolaboratif berdasarkan sistem kawalan versi Mercurial dan Git. Pada satu masa ia mempunyai kelebihan besar berbanding GitHub kerana ia menawarkan repositori peribadi percuma. Tahun lepas, GitHub turut memperkenalkan keupayaan ini kepada semua orang secara percuma.
-
Dan sebagainya…
git clone https://github.com/romankh3/git-demo
Kini terdapat salinan tempatan lengkap projek itu. Untuk memastikan bahawa salinan tempatan projek adalah yang terkini, anda perlu menarik projek dengan menulis:
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
Perintah untuk menolak ini ke repositori jauh ialah:
git push

Pautan berguna
- Dokumentasi Git rasmi . Saya syorkan sebagai rujukan.
GO TO FULL VERSION