Lignes de commande Git couramment utilisées

Statut du fichier et zone de travail

Zone de travail :
① Répertoire de travail : la zone où vous écrivez habituellement du code.
② Zone de stockage temporaire : L'endroit où le code est ajouté après son ajout mais avant sa validation.
③ Entrepôt local : où se trouvera le code après sa validation.

Statut du fichier :
① Modifié : Une fois le répertoire de travail modifié, le code n'est pas ajouté à la zone de stockage temporaire et n'est pas non plus stocké dans l'entrepôt local.
② Stocké temporairement : une fois le répertoire de travail modifié, le code a été ajouté à la zone de stockage temporaire et n'a pas été validé dans l'entrepôt local.
③ Soumis : une fois le répertoire de travail modifié, le code a été validé dans l'entrepôt local.

ID de l'utilisateur

Configurer les informations personnelles

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

Remarque : –global signifie que tous les référentiels Git sur votre machine utiliseront cette configuration.

Afficher les informations personnelles

$git config --list
[email protected]
user.name=Fu Kaiqiang
alias.st=status
alias.co=checkout
alias.dt=difftool -t meld -y
color.ui=auto
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
[email protected]:OnlyYouMyLove/TestGit.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

éditeur

Différents systèmes d'exploitation recommandent différents éditeurs. Vim est recommandé pour Linux et NotePad++ peut être utilisé pour Windows.

以vim为例:
vim TestGit.md

Remarque : vim peut créer et ouvrir le fichier TestGit.md. Ce n'est pas le point clé et je n'entrerai pas dans les détails. Si vous êtes intéressé, vous pouvez trouver Xiaodu ou Xiaogu.

Créer un référentiel local

Initialiser l'entrepôt local
- $ git init  

Description : Initialisez l'entrepôt et générez le fichier .git

Cloner le référentiel distant en local
$git clone [email protected]:OnlyYouMyLove/TestGit.git
Cloning into 'TestGit'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), 4.76 KiB | 0 bytes/s, done.
Checking connectivity... done.

Remarque :
① L'initialisation de l'entrepôt et le clonage de l'entrepôt distant sont deux façons de créer un entrepôt local. Choisissez différentes méthodes de création selon différents scénarios.
② Une fois l'entrepôt local initialisé, il doit toujours être associé à l'entrepôt distant, comme indiqué dans la section sur l'entrepôt distant.

Opérations locales communes

Ajouter des fichiers à la zone de préparation
$ git add readme.txt
Soumettez les fichiers dans la zone de transit à l'entrepôt local
$ git commit -m "wrote a readme file"

Remarque : Ajoutez une description de cette soumission après -m
pour ignorer la zone de préparation et exécuter la soumission.

$git commit -a -m "skip stage to commit"
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

Remarque : Le paramètre -a peut automatiquement préparer le fichier, puis effectuer la soumission.

Afficher l'historique des soumissions de l'entrepôt local
$git log
commit 462a66ec484df873bc5638fbd53523408ecfed43
Merge: 34a6e3f 44d733a
Author: Fu Kaiqiang <[email protected]>
Date:   Fri Sep 14 10:28:10 2018 +0800
 Merge remote-tracking branch 'origin/master'
commit 34a6e3f6dba34d4870da3f9a25ab653a33ae2a49
Author: Fu Kaiqiang <[email protected]>
Date:   Fri Sep 14 10:21:42 2018 +0800
Today is Friday!
Afficher l'historique des soumissions de l'entrepôt local de manière concise
$git log --pretty=oneline
462a66ec484df873bc5638fbd53523408ecfed43 Merge remote-tracking branch 'origin/master'
34a6e3f6dba34d4870da3f9a25ab653a33ae2a49 Today is Friday!
Afficher l'état du fichier
$git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:         
(use "git reset HEAD <file>..." to unstage)  
modified:   TestGit.md
Untracked files: 
(use "git add <file>..." to include in what will be committed)
.TestGit.md.swo
.TestGit.md.swp

Description :
① Modifications à valider : fichiers qui ont été temporairement stockés et peuvent être soumis
② Fichiers non suivis : fichiers qui ne sont pas temporairement stockés

Afficher les détails des modifications de fichiers non planifiées
$git diff
diff --git a/TestGit.md b/TestGit.md
index 1de64fb..89aaf06 100644
--- a/TestGit.md
+++ b/TestGit.md
@@ -1,2 +1,3 @@
 Hello World 
 Hello Chuizi
+Hello Branch
Afficher les détails des modifications apportées aux fichiers intermédiaires
$git diff --staged
diff --git a/TestGit.md b/TestGit.md
index bc8bff8..2d675a0 100644
--- a/TestGit.md
+++ b/TestGit.md
@@ -2,3 +2,4 @@ Hello World
 Hello Chuizi
 Hello HUAWEI
 Hello XIAOMI
+Hello MEIZU

Remarque : Une fois le fichier préparé, les différences ne peuvent pas être interrogées via la commande git diff. Le paramètre –staged ou –cached doit être ajouté.

restauration de version

retour à la version précédente
文件内容:
  1 Hello World
  2 Test Git
  3 Hello ChuiZi
  4 Hello JianGuo
  5 hahahahah
  6 fdafafafafaf
  7 fajfkajfakdjfk
  8 eight line
  9 nine line
 10 tenth line


$git log
commit c836aafa9e33890aebd9b53c816e3180ccd4ddb7
Author: Fu Kaiqiang <[email protected]>
Date:   Fri Sep 14 17:01:59 2018 +0800

    add tenth line

commit b1a66343568506fdb9960ebd3d896fd798ac61a4
Author: Fu Kaiqiang <[email protected]>
Date:   Fri Sep 14 17:01:09 2018 +0800

    add ninth line
$git reset --hard HEAD^
HEAD is now at b1a6634 add ninth line

Remarque : le code de ligne de commande ci-dessus est le code principal

$git log
commit b1a66343568506fdb9960ebd3d896fd798ac61a4
Author: Fu Kaiqiang <[email protected]>
Date:   Fri Sep 14 17:01:09 2018 +0800

    add ninth line


文件内容:
  1 Hello World
  2 Test Git
  3 Hello ChuiZi
  4 Hello JianGuo
  5 hahahahah
  6 fdafafafafaf
  7 fajfkajfakdjfk
  8 eight line
  9 nine line
Interroger chaque enregistrement de soumission de version
$git reflog
c836aaf HEAD@{0}: reset: moving to c836a
b1a6634 HEAD@{1}: reset: moving to HEAD^
c836aaf HEAD@{2}: commit: add tenth line
b1a6634 HEAD@{3}: commit: add ninth line

Description : le contenu comprend ① l'identifiant de validation ② la commande exécutée ③ la description

Revenir à la version spécifiée
$git reset --hard c836a
HEAD is now at c836aaf add tenth line

Remarque :
① Recherchez l'ID de validation et vous pourrez revenir à la version spécifiée.
② Il n'est pas nécessaire de remplir l'intégralité de l'identifiant de validation, d'en remplir une partie et git le trouvera automatiquement.

Afficher la différence entre la dernière version dans l'espace de travail et le référentiel
修改TestGit.md内容为:
Hello World
$git add TestGit.md 
再修改TestGit.md内容为:
Hello World
Hello Chuizi
$git commit -m "Two line"
[master 7dd7cf8] Two line
 1 file changed, 1 insertion(+), 11 deletions(-)
$git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
    modified:   TestGit.md
no changes added to commit (use "git add" and/or "git commit -a")

Remarque : À l'heure actuelle, il a été découvert qu'il restait du contenu qui n'avait pas été ajouté à la zone de stockage temporaire.

$git diff HEAD -- TestGit.md
diff --git a/TestGit.md b/TestGit.md
index 35eab83..1de64fb 100644
--- a/TestGit.md
+++ b/TestGit.md
@@ -1,2 +1,2 @@
 Hello World 
-
+Hello Chuizi

Explication :
① Il a été constaté que la deuxième modification n'a pas été soumise à la zone de stockage temporaire, ce qui a amené git commit à soumettre uniquement la première modification.
② La commande git diff est le code principal.
③ À ce stade, effectuez à nouveau les opérations d'ajout et de validation.

Annuler les changements

Annuler les modifications qui n'ont pas été ajoutées à la zone de préparation
fukqdembp:TestGit fukq$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   TestGit.md
no changes added to commit (use "git add" and/or "git commit -a")

Description : ignorer les modifications - l'invite pour ignorer les modifications est "git checkout - ..."

fukqdembp:TestGit fukq$ git checkout -- TestGit.md
fukqdembp:TestGit fukq$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Annulez les modifications qui ont été ajoutées à la zone de préparation :
fukqdembp:TestGit fukq$ git add TestGit.md
fukqdembp:TestGit fukq$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   TestGit.md

Remarque : pour annuler la mise en scène - l'invite pour ne pas effectuer la mise en scène est "git reset HEAD..."

fukqdembp:TestGit fukq$ git reset HEAD TestGit.md
Unstaged changes after reset:
M   TestGit.md
fukqdembp:TestGit fukq$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   TestGit.md

no changes added to commit (use "git add" and/or "git commit -a")
fukqdembp:TestGit fukq$

Supprimer les opérations associées

Opération de synchronisation Git après la suppression de fichiers
fukqdembp:TestGit fukq$ ls
LICENSE     README.md   TestGit.md  TestGit.txt

fukqdembp:TestGit fukq$ rm TestGit.txt

fukqdembp:TestGit fukq$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
    deleted:    TestGit.txt
no changes added to commit (use "git add" and/or "git commit -a")

fukqdembp:TestGit fukq$ git rm TestGit.txt
rm 'TestGit.txt'

fukqdembp:TestGit fukq$ git commit TestGit.txt -m "删除TestGit.txt文件"
[master 7075b5f] 删除TestGit.txt文件
 1 file changed, 1 deletion(-)
 delete mode 100644 TestGit.txt
fukqdembp:TestGit fukq$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
  
nothing to commit, working tree clean

fukqdembp:TestGit fukq$ ls
LICENSE     README.md   TestGit.md

Instructions :
① rm TestGit.txt
② git rm TestGit.txt
③ git commit TestGit.txt -m "Supprimer le fichier TestGit.txt"

Opérations de récupération de fichiers après la suppression de fichiers
fukqdembp:TestGit fukq$ rm TestGit.txt

fukqdembp:TestGit fukq$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    TestGit.txt

no changes added to commit (use "git add" and/or "git commit -a")

fukqdembp:TestGit fukq$ git checkout -- TestGit.txt

fukqdembp:TestGit fukq$ ls
LICENSE     README.md   TestGit.md  TestGit.txt

Remarque : $ git checkout --TestGit.txt peut non seulement restaurer les opérations de modification qui n'ont pas été ajoutées à la zone de préparation, mais également restaurer les fichiers supprimés.

entrepôt distant

Associer un entrepôt distant
$git remote add origin [email protected]:OnlyYouMyLove/TestGit.git

Description :
① Composition – git remote add + nom de l'entrepôt personnalisé + adresse ssh de l'entrepôt
② git init Après avoir initialisé l'entrepôt, vous devez effectuer des opérations git à distance pour lier les entrepôts locaux et distants. Cela peut être considéré comme une création complète de l'entrepôt local. entrepôt.

Transférer le contenu de l'entrepôt local vers l'entrepôt distant pour la première fois
$git push -u origin master

Remarque :
① L'ajout du paramètre -u permet la liaison de l'entrepôt local et de l'entrepôt distant
② Si l'erreur suivante est signalée, cela signifie un manque d'autorisations - générez ssh localement et ajoutez-le à la liste ssh de github :

$git push -u origin master
Warning: Permanently added the RSA host key for IP address 'xxx.xx.xxx.xxx' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
③ Si l'erreur suivante est signalée, entrez oui :
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

Remarque : L'avertissement n'apparaîtra qu'une seule fois.

④ Vérifiez la clé ssh (sous système Linux, d'autres systèmes sont similaires) :
$cat ~/.ssh/id_rsa.pub
Ce n'est pas la première fois que l'on transfère le contenu d'un entrepôt local vers un entrepôt distant
$git push origin master
Extraire les données de l'entrepôt distant vers le local
$git fetch origin

Description :
① git clone nomme automatiquement le serveur d'entrepôt distant comme origine, extrait toutes les données, puis crée un pointeur local vers la branche principale sur le serveur et le nomme origin/master, qui est appelé la branche distante. Ensuite, git créera une succursale principale locale.
② fetch Cette commande obtiendra toutes les données qui ne sont pas encore incluses localement à partir du serveur, puis mettra à jour la branche distante. Remarque : Seule la branche distante est mise à jour, la branche principale locale n'a pas changé et doit être fusionnée.
③ L'origine est la même que le nom de la branche principale. C'est juste le nom par défaut. Il n'a pas de signification particulière et peut être personnalisé.

$git merge origin/master
Updating ce50a7f..253d867
Fast-forward
 TestGit.md | 1 +
 1 file changed, 1 insertion(+)

Remarque : Ce n'est que par récupération et fusion que les données de l'entrepôt distant peuvent être synchronisées avec l'entrepôt local.

Extrayez les données de l'entrepôt distant et fusionnez-les directement en local
$git pull origin master
From github.com:OnlyYouMyLove/TestGit
 * branch            master     -> FETCH_HEAD
Updating ce50a7f..5ec3b49
Fast-forward
 .test.swp  | Bin 0 -> 4096 bytes
 TestGit.md |   3 +++
 2 files changed, 3 insertions(+)
 create mode 100644 .test.swp

Remarque : La commande pull extrait directement les données vers la branche distante et fusionne les données dans la branche principale.

bifurquer

Créer et changer de branche
$git checkout -b dev
Switched to a new branch 'dev'

Remarque : Le paramètre -b signifie créer et changer de branche, ce qui équivaut aux deux commandes suivantes

$ git branch dev 创建分支
$ git checkout dev 切换分支
Switched to branch 'dev'
voir la branche actuelle
$git branch
* master

$git checkout -b dev
Switched to a new branch 'dev'

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

$git branch
* dev
  master

Description : Commande principale –git branch et utilisez * pour pointer vers la branche actuelle

fusionner une branche
$git branch
* dev
  master

$vim TestGit.md

$git checkout master
M   TestGit.md
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

$git branch
  dev
* master

$git merge dev
Already up-to-date.

Description : Les étapes sont les suivantes
① Modifier TestGit sur la branche dev
② Basculer vers la branche principale
③ Fusionner le développement avec la branche principale actuelle

supprimer une branche
$git branch -d dev
Deleted branch dev (was 555af4a).

résoudre des conflits

Analyse de scénarios et solutions

Un fichier, deux branches, chaque branche apporte des modifications différentes à la même phrase du fichier. Lorsqu'une branche modifie la soumission, une autre branche modifie la soumission, puis fusionne l'autre branche, un conflit se produira. La solution est de continuer à modifier le fichier, de faire la modification finale de la phrase qui exploite les deux branches, puis simplement soumettre.

创建并切换到dev分支
$git checkout -b dev
M   TestGit.md
Switched to a new branch 'dev'
编辑TestGit.md文件
$vim TestGit.md
编辑以后:
Hello World
Hello Chuizi
Hello XIAOMI
暂存
$git add TestGit.md
 提交
$git commit TestGit.md -m "dev commit file"
[dev 6a31928] dev commit file
 1 file changed, 1 insertion(+)
切换到master分支
$git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
编辑TestGit.md文件
$vim TestGit.md
编辑以后:
Hello World
Hello Chuizi
Hello HUAWEI
暂存
$git add TestGit.md 
提交
$git commit TestGit.md -m "master commit file"
[master b62ed88] master commit file
 1 file changed, 1 insertion(+)
合并
$git merge dev
Auto-merging TestGit.md
CONFLICT (content): Merge conflict in TestGit.md
Automatic merge failed; fix conflicts and then commit the result.
编辑TestGit.md文件
$vim TestGit.md
Hello World
Hello Chuizi
<<<<<<< HEAD
Hello HUAWEI
=======
Hello XIAOMI
>>>>>>> dev

Remarque : =======Ce qui précède est la version HEAD (maître)>>>>>>>>Ce qui précède est la version dev

解决冲突--进行编辑:
Hello World
Hello Chuizi
Hello HUAWEI
Hello XIAOMI
暂存
$git add TestGit.md 
提交
$git commit TestGit.md 
fatal: cannot do a partial commit during a merge.

Remarque : Après qu'un conflit se produit, certains fichiers ne peuvent pas être soumis après avoir modifié le fichier pour résoudre le conflit.

上面的commit修改为提交所有文件即可
$git commit -m "merge files"
[master 39791ca] merge files
Visualisez le graphique de fusion de la branche :
$git log --graph --pretty=oneline --abbrev-commit
*   39791ca merge files
|\  
| * 6a31928 dev commit file
* | b62ed88 master commit file
|/  
* 555af4a first commit

On peut voir sur le diagramme de fusion qu'il s'agit de la fusion de dev et master :
① 555af4a first commit : premier commit
② 6a31928 dev commit file b62ed88 master commit file : dev commit d'abord master puis commit
③ 39791ca fusionner les fichiers : fusionner et commit après avoir résolu les conflits

Rebase

$git log --graph --pretty=oneline --abbrev-commit
*   39791ca merge files
|\  
| * 6a31928 dev commit file
* | b62ed88 master commit file
|/  
* 555af4a first commit

Ce qui précède est le journal du graphique de fusion après un conflit de branche. Vous constaterez qu'il est très déroutant. Deux commits et une fusion ne sont pas en ligne droite. Et ce n'est qu'une fusion contradictoire. Plus il y a de fusions, plus l’historique sera compliqué ! Le nombre de fusions pour un projet peut atteindre des centaines ou des milliers. Si l'historique des fusions est très confus, cela entraînera de grands obstacles à la lecture et affectera l'efficacité du travail. L'image de gauche peut-elle être une ligne droite au lieu d'un losange ? La réponse est oui, lorsque des conflits surviennent localement, utilisez rebase au lieu de fusionner.

Alors pourquoi y a-t-il une histoire en forme de losange après la fusion ? Cela commence par son essence : la branche dev, la branche master et leur ancêtre commun sont fusionnés pour générer un nouvel instantané. Nous appelons cette soumission une "soumission de fusion", et la soumission de fusion n'a pas qu'une seule soumission parent. sont deux A dev et master. Ainsi, une forme de losange apparaît dans le graphique de l'historique de fusion.

复现冲突场景:dev和master分别修改了同一个文件的相同地方,并且执行了暂存和提交,然后我们这里执行rebase操作:
$git checkout dev
Switched to branch 'dev'
$git rebase master
First, rewinding head to replay your work on top of it...
Applying: dev commit
Using index info to reconstruct a base tree...
M   TestGit.md
Falling back to patching base and 3-way merge...
Auto-merging TestGit.md
CONFLICT (content): Merge conflict in TestGit.md
error: Failed to merge in the changes.
Patch failed at 0001 dev commit
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

Description : échec du rebase, veuillez d'abord résoudre le conflit, puis utilisez "git rebase --continue"

$vim TestGit.md
$git add TestGit.md
$git rebase --continue
Applying: dev commit
$git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
$git merge dev
Updating 6321248..ce50a7f
Fast-forward
 TestGit.md | 1 +
 1 file changed, 1 insertion(+)
$git log --graph --pretty=oneline --abbrev-commit
* ce50a7f dev commit
* 6321248 master commit
* 555af4a first commit

Pourquoi le rebasage peut-il obtenir l'effet de soumission historique d'une ligne ? Voyons ensuite le principe : trouver d'abord l'ancêtre commun des deux branches à intégrer (la branche sur laquelle vous vous trouvez actuellement et celle dans laquelle vous souhaitez intégrer), puis obtenir les changements (diff) introduits par chaque commit de la branche actuelle, et enregistrez ces modifications dans un fichier temporaire, puis réinitialisez la branche actuelle sur la branche dans laquelle vous souhaitez fusionner, et enfin récupérez chaque modification précédemment enregistrée sur cette branche. Pour parler franchement, cela signifie enregistrer et sauvegarder les modifications dans dev, puis introduire tour à tour les modifications enregistrées dans la branche master, ce qui équivaut à ce que toutes les modifications soient sur la branche master. Les résultats de la fusion et du rebase sont les mêmes, mais l'historique des validations est complètement différent.

Vous dites que vous ne comprenez toujours pas, vous ne voyez toujours pas la différence ! Mais si vous y réfléchissez bien, la différence est en fait très grande : le rebasage abandonne en fait le commit existant du développeur, puis crée un nouveau commit correspondant avec un contenu similaire, mais il s'agit d'un commit différent.

おすすめ

転載: blog.csdn.net/u010689434/article/details/90025396