Líneas de comando de Git de uso común

Estado del archivo y área de trabajo

Área de trabajo:
① Directorio de trabajo: el área donde normalmente escribe código.
② Área de almacenamiento temporal: el lugar donde se agrega el código después de agregarlo pero antes de confirmarlo.
③ Almacén local: donde se ubicará el código una vez confirmado.

Estado del archivo:
① Modificado: después de modificar el directorio de trabajo, el código no se agrega al área de almacenamiento temporal ni se confirma en el almacén local.
② Almacenado temporalmente: después de modificar el directorio de trabajo, el código se agrega al área de almacenamiento temporal y no se confirma en el almacén local.
③ Enviado: después de modificar el directorio de trabajo, el código se ha enviado al almacén local.

ID de usuario

Configurar información personal

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

Nota: –global significa que todos los repositorios Git en su máquina usarán esta configuración.

Ver información personal

$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

editor

Los diferentes sistemas operativos recomiendan diferentes editores: se recomienda Vim para Linux y NotePad++ se puede utilizar para Windows.

以vim为例:
vim TestGit.md

Nota: vim puede crear y abrir el archivo TestGit.md. No es el punto clave y no entraré en detalles. Si estás interesado, puedes encontrar Xiaodu o Xiaogu.

Crear un repositorio local

Inicializar almacén local
- $ git init  

Descripción: Inicializa el almacén y genera el archivo .git

Clonar el almacén remoto al 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.

Nota:
① Inicializar el almacén y clonar el almacén remoto son dos formas de crear un almacén local. Elija diferentes métodos de creación según los diferentes escenarios.
② Una vez inicializado el almacén local, aún es necesario asociarlo con el almacén remoto, como se explica en la sección de almacén remoto.

Operaciones locales comunes

Agregar archivos al área de preparación
$ git add readme.txt
Envíe los archivos en el área de preparación al almacén local.
$ git commit -m "wrote a readme file"

Nota: agregue una descripción de este envío después de -m
para omitir el área de preparación y ejecutar el envío.

$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

Nota: El parámetro -a puede preparar automáticamente el archivo y luego realizar el envío.

Ver el historial de envíos del almacén 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!
Ver el historial de envíos del almacén local de forma concisa
$git log --pretty=oneline
462a66ec484df873bc5638fbd53523408ecfed43 Merge remote-tracking branch 'origin/master'
34a6e3f6dba34d4870da3f9a25ab653a33ae2a49 Today is Friday!
Ver el estado del archivo
$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

Descripción:
① Cambios a confirmar: archivos que se han almacenado temporalmente y se pueden enviar
② Archivos sin seguimiento: archivos que no están almacenados temporalmente

Ver detalles de cambios de archivos no preparados
$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
Ver detalles de cambios en archivos preparados
$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

Nota: Una vez que el archivo está preparado, las diferencias no se pueden consultar mediante el comando git diff. Se debe agregar el parámetro –staged o –cached.

Reversión de versión

Volver a la versión anterior
文件内容:
  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

Nota: el código de línea de comando anterior es el código 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
Consultar el registro de envío de cada versión.
$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

Descripción: El contenido incluye ① ID de confirmación ② comando ejecutado ③ descripción

Retroceder a una versión especificada
$git reset --hard c836a
HEAD is now at c836aaf add tenth line

Nota:
① Busque la identificación de confirmación y podrá volver a la versión especificada.
② No es necesario completar toda la identificación de confirmación, completar parte y git la encontrará automáticamente.

Ver la diferencia entre la última versión en el espacio de trabajo y el repositorio
修改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")

Nota: En este momento, se descubrió que todavía hay contenido que no se ha agregado al área de almacenamiento temporal.

$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

Explicación:
① Se descubrió que la segunda modificación no se envió al área de almacenamiento temporal, lo que provocó que git commit enviara solo la primera modificación.
② El comando git diff es el código principal.
③ En este momento, vuelva a realizar las operaciones de agregar y confirmar.

Deshacer cambios

Deshacer modificaciones que no se agregaron al área de preparación
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")

Descripción: descartar cambios: el mensaje para descartar modificaciones es "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
Deshacer las modificaciones que se han agregado al área de preparación:
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

Nota: para cancelar la preparación: el mensaje para no realizar la preparación es "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$

Eliminar operaciones relacionadas

Operación de sincronización de Git después de eliminar archivos
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

Instrucciones:
① rm TestGit.txt
② git rm TestGit.txt
③ git commit TestGit.txt -m "Eliminar archivo TestGit.txt"

Operaciones de recuperación de archivos después de eliminar archivos.
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

Descripción: $ git checkout --TestGit.txt puede restaurar las operaciones de modificación que no se han agregado al área de almacenamiento temporal y también puede restaurar archivos eliminados.

Almacén remoto

Asociado con almacén remoto
$git remote add origin [email protected]:OnlyYouMyLove/TestGit.git

Descripción:
① Composición: git remoto add + nombre de almacén personalizado + dirección ssh del almacén
② git init necesita realizar una operación remota de git después de inicializar el almacén para realizar la vinculación de los almacenes locales y remotos, lo que puede considerarse como una creación completa de los almacenes locales .

Envíe el contenido del almacén local al almacén remoto por primera vez
$git push -u origin master

Explicación:
① Agregar el parámetro -u puede vincular el almacén local y el almacén remoto
. ② Si se informa el siguiente error, significa falta de permiso: genere ssh localmente, simplemente agréguelo a la lista de 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 se informa el siguiente error, simplemente ingrese sí:
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.

Nota: La advertencia solo aparecerá una vez.

④ Verifique la clave ssh (en el sistema Linux, otros sistemas son similares):
$cat ~/.ssh/id_rsa.pub
No es la primera vez que se traslada el contenido del almacén local al almacén remoto
$git push origin master
Extraiga datos del almacén remoto al local
$git fetch origin

Descripción:
① git clone automáticamente nombra el nombre del servidor de almacén remoto como origen, extrae todos los datos y luego crea un puntero a la rama maestra en el servidor localmente y lo nombra origen/maestro, que se llama rama remota, y luego git creará una rama maestra local.
② fetch Este comando obtendrá todos los datos que aún no están incluidos localmente del servidor y luego actualizará la rama remota. Nota: Solo se actualiza la rama remota, la rama maestra local no ha cambiado y debe fusionarse.
③ el origen es el mismo que el nombre de la rama maestra. Es solo el nombre predeterminado. No tiene ningún significado especial y se puede personalizar.

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

Nota: Solo mediante la búsqueda y combinación se pueden sincronizar los datos del almacén remoto con el almacén local.

Extraiga datos del almacén remoto y combínelos directamente con el 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

Nota: El comando pull extrae datos directamente a la rama remota y los fusiona en la rama maestra.

rama

Crear y cambiar de rama
$git checkout -b dev
Switched to a new branch 'dev'

Nota: El parámetro -b significa crear y cambiar ramas, lo que equivale a los dos comandos siguientes

$ git branch dev 创建分支
$ git checkout dev 切换分支
Switched to branch 'dev'
Ver sucursal actual
$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

Descripción: Comando principal –git branch y use * para apuntar a la rama actual

fusionar ramas
$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.

Descripción: Los pasos son los siguientes
① Editar TestGit en la rama de desarrollo
② Cambiar a la rama maestra
③ Fusionar dev con la rama maestra actual

eliminar rama
$git branch -d dev
Deleted branch dev (was 555af4a).

resolver conflictos

Análisis de escenarios y soluciones

Un archivo, dos ramas, cada rama realiza cambios diferentes en la misma oración en el archivo. Cuando una rama modifica y envía, otra rama modifica y envía, y luego fusiona otra rama, surgirán conflictos. La solución es continuar modificando el archivo y finalmente editar la oración que operan ambas ramas, y luego Simplemente enviar.

创建并切换到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

Nota: =======Lo anterior es la versión HEAD (maestra)>>>>>>>>Lo anterior es la versión de desarrollo

解决冲突--进行编辑:
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.

Nota: Después de que ocurre un conflicto, algunos archivos no se pueden enviar después de modificarlos para resolver el conflicto.

上面的commit修改为提交所有文件即可
$git commit -m "merge files"
[master 39791ca] merge files
Vea el gráfico de combinación de la sucursal:
$git log --graph --pretty=oneline --abbrev-commit
*   39791ca merge files
|\  
| * 6a31928 dev commit file
* | b62ed88 master commit file
|/  
* 555af4a first commit

Se puede ver en el diagrama de fusión que es la fusión de dev y master:
① 555af4a primera confirmación: la primera confirmación
② 6a31928 archivo de confirmación de dev b62ed88 archivo de confirmación maestra: dev envía el maestro primero y luego confirma
③ 39791ca archivos de fusión: fusiones y se compromete después de resolver conflictos

Rebase

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

Lo anterior es el registro del gráfico de fusión después del conflicto de rama. Encontrará que es muy confuso: dos confirmaciones y una fusión no están en línea recta. Y esto es sólo una fusión conflictiva. ¡Cuantas más fusiones haya, más desordenado será el registro del historial! El número de fusiones de un proyecto puede llegar a cientos o incluso miles. Si el registro histórico de fusiones es muy confuso, provocará grandes obstáculos en la lectura y afectará la eficiencia del trabajo. ¿Puede la imagen de la izquierda ser una línea recta en lugar de un diamante? La respuesta es sí, cuando los conflictos ocurren localmente, use rebase en lugar de fusionar.

Entonces, ¿por qué hay una historia en forma de diamante después de la fusión? Esto comienza con su esencia: la rama de desarrollo, la rama maestra y sus ancestros comunes se fusionan para generar una nueva instantánea. A este tipo de confirmación lo llamamos "compromiso de fusión", y un compromiso de fusión no tiene solo un compromiso principal. Hay dos A dev y un master. Entonces aparece una forma de diamante en el gráfico del historial de fusión.

复现冲突场景: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".

Descripción: falló la rebase, primero resuelva el conflicto y luego use "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

¿Por qué el rebase puede lograr el efecto de sumisión histórica de una línea? Luego, echemos un vistazo al principio: primero encuentre el ancestro común de las dos ramas que se integrarán (la rama en la que se encuentra actualmente y la rama en la que desea integrarse), luego obtenga los cambios (diff) introducidos por cada confirmación de la rama actual y guarde estos cambios como un archivo temporal, luego restablezca la rama actual a la rama con la que desea fusionarse y, finalmente, introduzca cada cambio previamente guardado en esa rama por turno. Para decirlo sin rodeos, significa registrar y guardar los cambios en dev, y luego introducir los cambios guardados en la rama maestra uno por uno, lo que equivale a que todos los cambios estén en la rama maestra. Los resultados de la fusión y el cambio de base son los mismos, pero el historial de confirmaciones es completamente diferente.

¡Dices que todavía no lo entiendes y todavía no ves la diferencia! Pero si lo piensas detenidamente, en realidad hay una gran diferencia: el rebase en realidad descarta las confirmaciones existentes de dev y luego crea una nueva confirmación correspondiente con contenido similar, pero es una confirmación diferente.

Supongo que te gusta

Origin blog.csdn.net/u010689434/article/details/90025396
Recomendado
Clasificación