GNU/Linux >> Tutoriels Linux >  >> Linux

Comment créer et appliquer des correctifs dans GIT à l'aide de la commande diff et apply

La création d'un correctif dans GIT est un excellent moyen de partager des modifications que vous n'êtes pas encore prêt à publier. branche d'un projet.

Pour mieux comprendre comment nous allons créer un patch, discutons d'abord un peu de la façon dont les magasins GIT changent.

Si vous débutez avec GIT, installez git et lancez-vous dans cet article d'introduction à GIT.

La première fois qu'un fichier est engagé dans un projet dans GIT, une copie est stockée. Pour tous les commits ultérieurs, GIT stocke essentiellement des instructions lui indiquant comment transformer la version précédente du projet en la nouvelle version validée.

Dans GIT, ces instructions sont appelées "diffs". Chaque fois que vous extrayez une branche, GIT commencera essentiellement à l'état d'origine du projet et appliquera tous ces diffs dans l'ordre, pour arriver à l'état souhaité.

Sachant maintenant comment GIT stocke les commits, il est facile de voir qu'un fichier de patch sera simplement une concaténation des diffs pour chacun des commits que le patch couvrira.

Pour notre exemple, supposons la situation suivante :Nous avons un projet simple avec 2 branches :master et experimental.

$ git log --oneline --all
  * b36f227 (experimental) third commit -- added file3
  * f39ebe8 second commit -- added file2
  * 04a26e5 (HEAD, master) first commit -- committed file1

Master est actuellement au premier commit, alors que experimental a 2 commits d'avance. Dans chaque commit, j'ai ajouté un fichier nommé respectivement file1, file2 et file3. Voici l'état actuel de chaque branche :

Sur master, nous n'avons que file1 :

$ git status
On branch master
nothing to commit, working directory clean

$ ls
file1

En mode expérimental, nous avons les 3 fichiers :

$ git status
On branch experimental
nothing to commit, working directory clean

$ ls
file1 file2 file3

Dans ce didacticiel, nous expliquerons comment créer un patch des modifications sur la branche expérimentale et les appliquer au maître.

Création du correctif GIT

Nous allons utiliser la commande git diff pour créer la sortie diff, puis la rediriger dans un fichier. La forme de la commande diff que nous utiliserons est la suivante :

git diff from-commit to-commit > output-file

où :

  • from-commit - le point auquel nous voulons que le patch démarre. (Dans notre cas, le point auquel l'expérimental diverge du maître)
  • to-commit - le correctif couvrira les modifications jusqu'à ce point inclus. (Dans notre cas, le commit le plus récent de experimental)
  • output-file – le correctif sera écrit ici

Remarque :si from-commit ou to-commit sont omis, ils seront supposés être HEAD

Nous spécifions les deux commits par leur hash unique. Généralement, vous n'avez qu'à spécifier suffisamment de hash de validation pour garantir son unicité (4 caractères suffiront probablement).

$ git diff 04a2 b36f > patch.diff

$ ls
patch.diff file1      file2      file3

Comme vous le voyez dans la sortie ci-dessus, le fichier de correctif a été créé.

Dans ce cas particulier, où nous voulons créer un patch de la branche entière, nous pouvons laisser GIT faire une partie du travail pour nous. Nous pouvons laisser GIT déterminer le point auquel notre branche expérimentale a divergé de la branche principale en utilisant la commande git merge-base :

git diff $(git merge-base <public branch> <experimental branch>) > <output file>

git merge-base déterminera le commit commun le plus récent entre 2 branches. Remarquez aussi comment cette fois nous avons omis . Il sera par défaut HEAD, et puisque la branche expérimentale a été extraite, HEAD sera le commit le plus récent de la branche expérimentale.

$ git diff $(git merge-base master experimental) > anotherPatch.diff

$ ls
anotherPatch.diff patch.diff  file1  file2  file3

Encore une fois, le fichier de correctif a été créé. Ces fichiers correctifs sont identiques.

Appliquer le correctif GIT

Une fois le fichier patch créé, l'appliquer est facile. Assurez-vous que la branche que vous avez extraite est celle à laquelle vous souhaitez appliquer le correctif (maître dans notre cas). Ensuite, vous pouvez appliquer le correctif à l'aide de la commande git apply :git apply

$ git status
On branch master
... (rest of output omitted) ...

$ ls
anotherPatch.diff patch.diff  file1

$ git apply patch.diff

$ ls
anotherPatch.diff patch.diff  file1  file2  file3

Les modifications de la branche expérimentale ont maintenant été répliquées sur master.

Avertissement :Bien que l'application d'un correctif de cette manière reproduise exactement le contenu, aucun historique de validation ne sera répliqué. Cela signifie que même si le patch que vous créez s'étend sur plusieurs commits, il apparaîtra comme un seul ensemble de modifications lorsqu'il sera appliqué. Vous perdrez à la fois la connaissance de la façon dont les commits ont été divisés et les messages pour chaque commit. Comparons l'historique des commits pour les deux branches :

Sur expérimental, nous avions 3 commits, chacun avec un message de commit significatif.

$ git branch
  * experimental
    master
$ git log --oneline
  b36f227 third commit -- added file3
  f39ebe8 second commit -- added file2
  04a26e5 first commit -- committed file1

Cependant, notre patch a simplement appliqué les modifications réelles à la branche master.

$ git branch
  experimental
  * master
$ git log --oneline
  04a26e5 first commit -- committed file1

L'application du correctif n'a pas validé les modifications et n'a pas non plus apporté l'historique de validation associé à ces modifications. Soyez prudent lorsque vous utilisez des correctifs dans GIT.


Linux
  1. Comment effectuer une comparaison ligne par ligne de fichiers sous Linux à l'aide de la commande diff

  2. 7 exemples de commandes de patch pour appliquer des fichiers de patch Diff sous Linux

  3. Comment créer des fichiers fragmentés sous Linux à l'aide de la commande "dd"

  4. Comment créer un répertoire et donner l'autorisation en une seule commande

  5. Comment créer et appliquer un patch SVN ?

Comment créer un lien symbolique sous Linux à l'aide de la commande Ln

Comment cloner et restaurer une partition Linux à l'aide de la commande dd

Comment utiliser la commande DD et comment graver ISO en l'utilisant

Comment créer, renommer et supprimer des branches Git

Comment installer et configurer Git sur Ubuntu 20.04

Comment créer une partition à l'aide de la commande "parted"