Vous utilisez déjà le contrôle de source pour gérer votre code, n'est-ce pas? Vous pouvez même utiliser votre GDS comme élément central de votre flux de travail, comme nous le faisons chez New Relic..
Dans cet article, nous n'allons pas passer en revue les bases de la gestion du contrôle de source, quel que soit celui que vous utilisez. Supposons simplement que vous savez déjà comment vous déplacer. Ce que nous allons couvrir, c'est comment les pros utilisent git. Nous allons examiner certaines des fonctionnalités avancées et des workflows avec lesquels vous n'êtes peut-être pas déjà familiarisés. J'espère que vous marcherez bouche bée devant toutes les possibilités offertes par git!
Si vous êtes comme moi, vous aimez explorer le fonctionnement des autres développeurs..
Pour les non-initiés, ou ceux provenant d'un autre SCM, Git est un système de contrôle de version distribué. Il est gratuit et open source, a une empreinte minuscule et peut s’intégrer dans le flux de travail qui vous convient le mieux. En règle générale, cela ne vous oblige pas à travailler de manière particulière, ce qui signifie qu'il existe de nombreuses méthodologies différentes sur la façon d'utiliser ses fonctionnalités, telles que les zones de transfert, les branches et les versions de marquage. Si vous êtes un peu comme moi, vous aimez explorer le fonctionnement des autres développeurs. Alors préparez-vous à commencer à modifier votre .gitconfig
, parce que vous allez vous régaler. Voyons comment les pros utilisent git.
Vous êtes probablement familier avec la modification accidentelle d'un seul fichier pour deux raisons différentes sans vous engager entre.
Vous êtes certainement familiarisé avec l’ajout de fichiers à la zone de transfert avec le nom approprié. ajouter
commander. Et vous êtes probablement familier avec la modification accidentelle d'un seul fichier pour deux raisons différentes sans vous engager entre les deux. Donc, vous aurez sûrement un journal git
rempli de messages tels que "Editer X et changer le Y sans rapport". Si cela ressemble à votre flux de travail, l'ajout interactif est votre nouveau meilleur ami..
L'ajout interactif ou l'ajout d'un patch vous guide dans vos modifications, morceau par morceau. Lorsque vous ajoutez un fichier avec le -p
commande, vous serez invité à chaque changement logique (c’est-à-dire que les lignes éditées successivement seront regroupées). Il y a un grand nombre de choix que vous pouvez faire sur chaque morceau, en divisant le morceau actuel en plus petits, en sautant un morceau ou même en le modifiant manuellement. Utilisez le ?
option pour voir une liste complète des commandes.
Débuter avec staging hunks est aussi simple que:
git add -p
En tant que bon citoyen du code, lorsque vous rencontrez quelque chose qui nécessite une solution rapide ou un nettoyage, vous devriez probablement prendre un moment pour le changer. Mais si vous utilisez un flux de travail lourd de branches de fonctionnalités, vous ne voulez pas de ce correctif sans rapport avec votre branche de fonctionnalités. Cela signifie que vous aurez besoin de planque
vos modifications actuelles, passez à votre branche principale, puis corrigez-la. Les rebonds entre les branches peuvent être fastidieux, mais heureusement, il existe un raccourci rapide pour passer à votre dernière branche. (via Zach Holman)
git checkout -
Cette syntaxe devrait paraître familière aux utilisateurs de * NIX. le CD
commande a un raccourci similaire (CD -
) qui accédera au dernier répertoire dans lequel vous vous trouviez. Vous ne devrez jamais vous souvenir de ce que vous avez appelé cette branche de fonctionnalité lorsque vous devez revenir en arrière; juste git checkout -
.
Lorsque vous travaillez avec des branches d’entités, vous pouvez en créer rapidement autant qui encombrent la sortie de git branch --list
. De temps en temps, vous voulez vous débarrasser des branches qui en ont fait le maître. Mais vous avez probablement une petite pause devant vous git branch -d
, mais avec les commandes ci-dessous, vous pouvez les supprimer en toute confiance sans hésiter. (via Zach Holman)
Si vous voulez voir quelles branches locales vous avez fusionnées dans la branche sur laquelle vous vous trouvez actuellement, il vous suffit de:
branche de git - fusionné
L'inverse est également disponible. Montre quelles branches n'ont pas été fusionnées dans la branche actuellement sélectionnée avec:
branche git - non fusionnée
Écrasez-le avec quelques outils UNIX simples et supprimez rapidement tout ce qui a déjà été fusionné:
branche de git - fusionné | xargs git branch -d
Supposons que vous expérimentez certaines refactorisations et que vous ayez quelques branches avec diverses modifications. Si vous souhaitez apporter des modifications à un fichier d'une branche distante dans votre branche en cours de travail, vous pouvez effectuer un nombre quelconque d'étapes. Sans l’astuce ci-dessous, vous cacheriez probablement vos modifications actuelles, changer de branche et récupérer le contenu du fichier que vous souhaitez modifier, revenez en arrière (avec git checkout -
bien sûr) et faire vos modifications. Ou vous pouvez simplement extraire ce fichier qui le fusionnera dans votre branche actuelle (via Zach Holman):
git checkout-- chemin / vers / fichier.rb
Vous avez donc la liste de branches encombrée dont nous avons parlé auparavant; certains de ceux que vous avez nettoyés avec le --fusionné
drapeau. Mais qu'en est-il de toutes ces autres branches? Comment savez-vous lesquels sont utiles ou totalement obsolètes? le pour-chaque-ref
La commande affichera une liste pour chaque branche et affichera les informations de référence pour la dernière validation. Nous pouvons personnaliser le résultat pour inclure des informations utiles, mais, plus important encore, nous pouvons trier la liste par date. Cette commande nous donnera une liste de branches avec le dernier message de validation et le dernier commetteur, triées par ordre de date décroissant. (via Rein Henrichs)
git pour-each-ref --sort = -committerdate --format = '% (committerdate: short)% (nom de la référence: short) [% (commtername)]'
Bien que vous puissiez taper cette commande à chaque fois, je vous recommande vivement d’en faire un alias et de vous épargner de sérieux maux de tête..
git config --global alias.latest "pour-chaque-ref --sort = -committerdate --format = '% (committerdate: short)% (refname: court) [% (nom de commettant)]'"
Ou du moins ils ne devraient pas utiliser blâmer
sans l'un des drapeaux d'options ci-dessous. Le blâme de Git est puissant; c'est comme utiliser la science pour prouver que vous avez raison. Mais attention, beaucoup de changements sont superficiels et trouver la vraie source du code en question prend un peu plus de temps. Des opérations telles que la suppression d'espaces, le déplacement de texte vers de nouvelles lignes ou même le déplacement de texte depuis un autre fichier peuvent être ignorées afin de faciliter la tâche de l'auteur du code d'origine..
Avant de blâmer quelqu'un, assurez-vous de vérifier l'une de ces choses:
git blame -w # ignore les espaces blancs git blame -M # ignore le déplacement de texte git blame -C # ignore le déplacement de texte dans d'autres fichiers
De temps en temps, vous devez rechercher une ligne de code que vous savez avoir écrit mais que vous ne trouvez pas. Il pourrait être coincé dans une branche lointaine, supprimé il y a longtemps, ou caché dans un site vierge; mais de toute façon, vous pouvez trouver n'importe quelle chaîne de votre historique git en écrasant quelques commandes. Tout d'abord, nous allons obtenir une liste de tous les commits, puis grep chacun d'eux pour notre chaîne.
git rev-list --all | xargs git grep -F ''
Vous avez probablement un ami qui a accidentellement saisi des données sensibles dans un dépôt: clés d'accès, mots de passe, recette secrète marinara de votre grand-mère. La première chose qu’ils devraient faire est de changer leurs mots de passe et de révoquer l’accès avec ces clés (et de s’excuser auprès de votre grand-mère). Ensuite, vous voudrez rechercher le fichier incriminé et le supprimer de l’historique complet de git, ce qui semble beaucoup plus facile qu’il ne l’est réellement. Une fois ce processus terminé, les données sensibles seront également supprimées de tous ceux qui extrairont les modifications nettoyées. Les fourchettes de votre référentiel qui ne fusionnent pas vos modifications en amont contiendront toujours les fichiers compromis (ne sautez pas la modification des mots de passe et la révocation des clés d'accès).
Tout d’abord, nous réécrirons l’historique git de chaque branche en supprimant le fichier contenant les données sensibles..
git filter-branch - index-filter 'git rm --cached --ignore-unmatch'--prune-empty --tag-name-filter cat - --all
Ajouter le fichier à .gitignore
et s'engager à mettre à jour .gitignore
.
écho>> .gitignore git add .gitignore git commit -m "Ajouter sensible fichier à gitignore "
Comme nous sommes en train de réécrire l’historique, vous devrez forcer le transfert des modifications sur votre télécommande..
git push origine master --force
Les fichiers compromis existent toujours dans votre dépôt local. Vous devrez donc effectuer quelques tâches de nettoyage pour les purger entièrement..
rm -rf .git / refs / original / git reflog expire --expire = maintenant - tout git gc --prune = maintenant git gc --aggressive --prune = maintenant
Le repo de vos amis doit être exempt de données sensibles et vous serez le héros pour les aider avec vos connaissances professionnelles. (via StackOverflow et GitHub)
Travailler avec le code de quelqu'un d'autre dans votre environnement peut signifier que vous devez apporter un nombre quelconque de modifications à la configuration pour que l'application s'exécute. Il est trop facile de commettre accidentellement un changement à ces configurations qui étaient exclusivement destinées à votre environnement. Ainsi, au lieu de toujours surveiller ces fichiers et de les laisser traîner dans la zone de transfert "modifiée", vous pouvez simplement indiquer à l'index git d'ignorer les modifications apportées à ce fichier. Vous pouvez penser à cela un peu comme un fichier ignoré par git qui reste avec le repo. (via Arnaud Coomans)
git update-index --assume-inchangé
Parfois, à partir de zéro, c'est exactement ce que vous devez faire, pour un certain nombre de raisons. Peut-être avez-vous hérité d'une base de code dont vous ne pouvez pas vous assurer qu'il est sécurisé pour l'open source, peut-être allez-vous simplement essayer quelque chose de entièrement nouveau ou ajoutez-vous une branche qui remplit un objectif distinct que vous souhaitez conserver avec le repo (comme GitHub Pages). Dans ce cas, il existe un moyen très simple de créer une nouvelle branche dans votre référentiel qui n’a essentiellement pas d’historique. (via Nicola Paolucci)
git checkout --orphan
Arrêtez de perdre votre temps à taper de longues commandes et faites-vous quelques alias utiles.
Aucune discussion sur git ne serait complète sans parler de divers alias qui vous permettront d'économiser des minutes par an en frappes de touche enregistrées. Arrêtez de perdre votre temps à taper de longues commandes et faites-vous quelques alias utiles. Les alias peuvent être créés en les ajoutant à votre fichier .gitconfig ou en utilisant la ligne de commande git config --global alias.
. Vous trouverez ci-dessous un échantillon d'alias que vous pouvez utiliser comme tremplin pour des idées..
co: avec un flux de travail de branche caractéristique, vous passerez régulièrement d'une branche à l'autre. Epargnez-vous six personnages à chaque fois.
co = caisse
ds: Il est toujours recommandé de vérifier les modifications que vous allez valider avant de valider. Cela vous permet d’attraper des fautes de frappe, d’inclure accidentellement des données sensibles et de regrouper le code dans des groupes logiques. Définissez vos modifications, puis utilisez git ds
pour voir le diff de ces changements.
ds = diff --staged
st: vous devriez être assez familier avec la sortie prolixe du statut de git. À un moment donné, vous voudrez sauter toutes les formalités et vous mettre au travail. Cet alias indique la forme abrégée du statut et inclut les détails de la branche..
st = status -sb
modifier: Avez-vous oublié d'inclure un fichier avec votre dernier commit, ou peut-être aviez-vous un ajustement à faire? Modifier les changements mis en scène à votre dernier commit.
modifier = commettre - amender -C HEAD
annuler: Parfois, modifier votre dernier commit n'est pas suffisant et vous devrez l'annuler. Cet alias recule d'un commit et laisse les modifications de ce commit staged. Maintenant, vous pouvez apporter des modifications supplémentaires ou renouveler l'engagement avec un nouveau message..
annuler = réinitialiser --soft HEAD ^
ls: travailler sur une base de code avec un groupe de développeurs, c'est essayer de suivre le rythme de travail des utilisateurs. Cet alias fournira un journal git sur une ligne incluant la date et le nom du committer.
ls = log --pretty = format: "% C (jaune)% h% C (bleu)% ad% C (rouge)% d% C (réinitialisation)% s% C (vert) [% cn]" - décorer --date = court
se lever: Cet alias est idéal pour passer en revue vos travaux d'hier sur n'importe quel type de stand-up quotidien ou simplement pour vous rafraîchir la mémoire le matin..
standup = log --since 'il y a 1 jour' --oneline --author
graphique: Une histoire complexe de git peut être difficile à revoir en ligne droite. L'utilisation de l'indicateur de graphique vous montre comment et quand les validations ont été ajoutées à la branche actuelle.
graph = log --graph --pretty = format ':% C (jaune)% h% Cblue% d% Creset% s% C (blanc)% an,% ar% Creset'
Git peut être à la fois incroyablement simple et incroyablement complexe. Vous pouvez commencer avec les bases et travailler vous-même à la manipulation de graphes plus complexe au fil du temps. Il n'est pas nécessaire de tout maîtriser avant de pouvoir l'utiliser. La commande qui sera la plus puissante à mesure que vous apprendrez est homme git-
. Essayez de l'utiliser avant de consulter Google pour obtenir une réponse..
Vous pouvez en apprendre davantage sur la façon dont la société pour laquelle je travaille, New Relic, utilise git sur notre blog ou essayez gratuitement New Relic Pro. Merci d'avoir lu! Si vous avez des questions, laissez-nous savoir ci-dessous!