Au lieu d'une introduction
Bonjour! Aujourd'hui, nous allons parler d'un système de contrôle de version, à savoir Git.
Les bases de Git
Git est un système de contrôle de version distribué pour notre code. Pourquoi en avons-nous besoin? Les équipes distribuées ont besoin d'une sorte de système pour gérer leur travail. Il est nécessaire pour suivre les changements qui se produisent au fil du temps. Autrement dit, nous devons être en mesure de voir étape par étape quels fichiers ont changé et comment. Ceci est particulièrement important lorsque vous recherchez ce qui a changé dans le contexte d'une seule tâche, ce qui permet d'annuler les modifications.Installer Git
Installons Java sur votre ordinateur.Installation sous Windows
Comme d'habitude, vous devez télécharger et exécuter un fichier exe. Tout est simple ici : cliquez sur le premier lien Google , effectuez l'installation, et le tour est joué. Pour ce faire, nous allons utiliser la console bash fournie par Windows. Sous Windows, vous devez exécuter Git Bash. Voici à quoi cela ressemble dans le menu Démarrer :

Installation sous Linux
Habituellement, Git fait partie des distributions Linux et est déjà installé, car il s'agit d'un outil initialement écrit pour le développement du noyau Linux. Mais il y a des situations où ce n'est pas le cas. Pour vérifier, vous devez ouvrir un terminal et écrire : git --version. Si vous obtenez une réponse intelligible, rien ne doit être installé. Ouvrez un terminal et installez Git sur Ubuntu . Je travaille sur Ubuntu, donc je peux vous dire ce qu'il faut écrire : sudo apt-get install git.Installation sur macOS
Ici aussi, vous devez d'abord vérifier si Git est déjà là. Si vous ne l'avez pas, le moyen le plus simple de l'obtenir est de télécharger la dernière version ici . Si Xcode est installé, alors Git sera définitivement installé automatiquement.Paramètres Git
Git a des paramètres utilisateur pour l'utilisateur qui soumettra le travail. Cela a du sens et est nécessaire, car Git prend ces informations pour le champ Auteur lorsqu'un commit est créé. Configurez un nom d'utilisateur et un mot de passe pour tous vos projets en exécutant les commandes suivantes :
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
Si vous avez besoin de changer l'auteur d'un projet spécifique, vous pouvez supprimer "--global". Cela nous donnera ceci :
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
Un peu de théorie...
Pour plonger dans le sujet, nous devrions vous présenter quelques nouveaux mots et actions...- référentiel git
- commettre
- bifurquer
- fusionner
- conflits
- tirer
- pousser
- comment ignorer certains fichiers (.gitignore)
Statuts dans Git
Git a plusieurs statues qui doivent être comprises et mémorisées :- non suivi
- modifié
- mise en scène
- engagé
Comment devriez-vous comprendre cela?
Voici les statuts qui s'appliquent aux fichiers contenant notre code :- Un fichier qui est créé mais pas encore ajouté au référentiel a le statut "non suivi".
- Lorsque nous apportons des modifications à des fichiers qui ont déjà été ajoutés au référentiel Git, leur statut est "modifié".
- Parmi les fichiers que nous avons modifiés, nous sélectionnons ceux dont nous avons besoin, et ces classes passent au statut "stage".
- Un commit est créé à partir de fichiers préparés à l'état intermédiaire et est placé dans le référentiel Git. Après cela, il n'y a plus de fichiers avec le statut "stage". Mais il peut encore y avoir des fichiers dont le statut est "modifié".

Qu'est-ce qu'un engagement ?
Un commit est l'événement principal en matière de contrôle de version. Il contient toutes les modifications apportées depuis le début de la validation. Les commits sont liés entre eux comme une liste à liens simples. Plus précisément : il y a un premier commit. Lorsque le deuxième commit est créé, il sait ce qui vient après le premier. Et de cette manière, les informations peuvent être suivies. Un commit possède également ses propres informations, appelées métadonnées :- l'identifiant unique du commit, qui peut être utilisé pour le trouver
- le nom de l'auteur du commit, qui l'a créé
- la date de création du commit
- un commentaire qui décrit ce qui a été fait pendant le commit

Qu'est-ce qu'une succursale ?
Une branche est un pointeur vers un commit. Parce qu'un commit sait quel commit le précède, lorsqu'une branche pointe vers un commit, tous ces commits précédents s'appliquent également à lui. En conséquence, nous pourrions dire que vous pouvez avoir autant de branches que vous le souhaitez pointant vers le même commit. Le travail se passe dans les branches, donc lorsqu'un nouveau commit est créé, la branche déplace son pointeur vers le commit le plus récent.Premiers pas avec Git
Vous pouvez travailler avec un référentiel local seul ou avec un référentiel distant. Pour pratiquer les commandes requises, vous pouvez vous limiter au référentiel local. Il stocke uniquement toutes les informations du projet localement dans le dossier .git. Si nous parlons du référentiel distant, alors toutes les informations sont stockées quelque part sur le serveur distant : seule une copie du projet est stockée localement. Les modifications apportées à votre copie locale peuvent être poussées (git push) vers le référentiel distant. Dans notre discussion ici et ci-dessous, nous parlons de travailler avec Git dans la console. Bien sûr, vous pouvez utiliser une sorte de solution basée sur une interface graphique (par exemple, IntelliJ IDEA), mais vous devez d'abord déterminer quelles commandes sont exécutées et ce qu'elles signifient.Travailler avec Git dans un dépôt local
Ensuite, je vous suggère de suivre et d'effectuer toutes les étapes que j'ai suivies en lisant l'article. Cela améliorera votre compréhension et votre maîtrise de la matière. Eh bien, bon appétit ! :) Pour créer un dépôt local, vous devez écrire :
git init

git status

- git add -A — ajoute tous les fichiers au statut "staged"
- git add . — ajouter tous les fichiers de ce dossier et de tous les sous-dossiers. En gros, c'est le même que le précédent
- git add <file name> — ajoute un fichier spécifique. Ici, vous pouvez utiliser des expressions régulières pour ajouter des fichiers selon un modèle. Par exemple, git add *.java : Cela signifie que vous souhaitez uniquement ajouter des fichiers avec l'extension java.
git add *.txt
Pour vérifier l'état, nous utilisons la commande déjà connue de nous :
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"
Pour voir tous les commits, écrivez :
git log

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

Travailler avec .gitignore
De toute évidence, nous ne voulons conserver que le code source, et rien d'autre, dans le référentiel. Alors que pourrait-il y avoir d'autre ? Au minimum, des classes compilées et/ou des fichiers générés par des environnements de développement. Pour dire à Git de les ignorer, nous devons créer un fichier spécial. Faites ceci : créez un fichier appelé .gitignore à la racine du projet. Chaque ligne de ce fichier représente un motif à ignorer. Dans cet exemple, le fichier .gitignore ressemblera à ceci :
```
*.class
target/
*.iml
.idea/
```
Nous allons jeter un coup d'oeil:
- La première ligne consiste à ignorer tous les fichiers avec l'extension .class
- La deuxième ligne consiste à ignorer le dossier "target" et tout ce qu'il contient
- La troisième ligne consiste à ignorer tous les fichiers avec l'extension .iml
- La quatrième ligne consiste à ignorer le dossier .idea
git status


git add .gitignore
git commit -m "added .gitignore file"
Et maintenant le moment de vérité : nous avons une classe compilée GitTest.class qui est "untracked", que nous ne voulions pas ajouter au dépôt Git. Nous devrions maintenant voir les effets du fichier .gitignore :
git status

Travailler avec des succursales et autres
Naturellement, travailler dans une seule branche n'est pas pratique pour les développeurs solitaires, et c'est impossible lorsqu'il y a plus d'une personne dans une équipe. C'est pourquoi nous avons des succursales. Comme je l'ai dit plus tôt, une branche n'est qu'un pointeur mobile vers des commits. Dans cette partie, nous explorerons le travail dans différentes branches : comment fusionner les modifications d'une branche à une autre, quels conflits peuvent survenir, et bien plus encore. Pour voir une liste de toutes les branches du référentiel et comprendre dans laquelle vous vous trouvez, vous devez écrire :
git branch -a

- créer une nouvelle succursale basée sur celle dans laquelle nous nous trouvons (99% des cas)
- créer une branche basée sur un commit spécifique (1% des cas)
Créons une branche basée sur un commit spécifique
Nous nous baserons sur l'identifiant unique du commit. Pour le trouver, on écrit :
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
Une branche est créée avec uniquement les deux premiers commits de la branche master. Pour vérifier cela, nous nous assurons d'abord de basculer vers une branche différente et de regarder le nombre de commits là-bas :
git status
git log

git branch -a

Créons une branche basée sur la branche actuelle
La deuxième façon de créer une branche est de la créer à partir d'une autre. Je souhaite créer une branche basée sur la branche master. Tout d'abord, je dois y passer, et l'étape suivante consiste à en créer un nouveau. Nous allons jeter un coup d'oeil:- git checkout master — passer à la branche master
- git status — vérifie que nous sommes bien dans la branche master

git checkout -b feature/update-txt-files

Résolution de conflit
Avant d'explorer ce qu'est un conflit, nous devons parler de la fusion d'une branche dans une autre. Cette image illustre le processus de fusion d'une branche dans une autre :

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
Tout est clair jusqu'à présent, n'est-ce pas ? Compliquons la situation : disons maintenant que vous devez à nouveau modifier le fichier txt. Mais maintenant, ce fichier sera également modifié dans la branche master. En d'autres termes, il changera en parallèle. Git ne pourra pas savoir quoi faire lorsque nous voulons fusionner notre nouveau code dans la branche master. Allons-y! Nous allons créer une nouvelle branche basée sur master, apporter des modifications à text_resource.txt et créer un commit pour ce travail :
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"
Et maintenant, le point le plus intéressant : nous devons fusionner les modifications de la branche feature/add-header vers master. Nous sommes dans la branche master, il suffit donc d'écrire :
git merge feature/add-header
Mais le résultat sera un conflit dans le fichier test_resource.txt : 

- Les modifications qui se trouvaient sur cette ligne dans la branche master se trouvent entre "<<<<<<< HEAD" et "=======".
- Les modifications qui se trouvaient dans la branche feature/add-header se trouvent entre "=======" et ">>>>>>> feature/add-header".

git status

git add *.txt

git commit

Travailler avec des référentiels distants
La dernière étape consiste à déterminer quelques commandes supplémentaires nécessaires pour travailler avec le référentiel distant. Comme je l'ai dit, un référentiel distant est un endroit où le référentiel est stocké et à partir duquel vous pouvez le cloner. Quels types de référentiels distants existe-t-il ? Exemples:-
GitHub est la plus grande plate-forme de stockage pour les référentiels et le développement collaboratif. Je l'ai déjà décrit dans des articles précédents.
Suivez-moi sur GitHub . J'y expose souvent mon travail dans les domaines que j'étudie pour le travail. -
GitLab est un outil Web pour le cycle de vie DevOps avec open source . Il s'agit d'un système basé sur Git pour gérer les référentiels de code avec son propre wiki, son système de suivi des bogues , son pipeline CI/CD et d'autres fonctions.
Après l'annonce de l'achat de GitHub par Microsoft, certains développeurs ont dupliqué leurs projets dans GitLab. -
BitBucket est un service web d'hébergement de projets et de développement collaboratif basé sur les systèmes de contrôle de version Mercurial et Git. À une certaine époque, il avait un gros avantage sur GitHub en ce sens qu'il offrait des référentiels privés gratuits. L'année dernière, GitHub a également présenté cette fonctionnalité à tout le monde gratuitement.
-
Et ainsi de suite…
git clone https://github.com/romankh3/git-demo
Il existe maintenant une copie locale complète du projet. Pour être sûr que la copie locale du projet est la plus récente, vous devez extraire le projet en écrivant :
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
La commande pour pousser ceci vers le référentiel distant est :
git push

Lien utile
- Documentation officielle de Git . Je le recommande comme référence.
GO TO FULL VERSION