Escribir al frente
Recientemente, descubrí que muchos socios pequeños no están muy familiarizados con el uso de algunas herramientas básicas en el trabajo. Por ejemplo, Git, un almacén de administración de código distribuido, no es muy familiar o no es muy familiar para muchos socios pequeños. Incluso algunos amigos nunca han oído hablar de Git, por lo que solo usan SVN. Como todo el mundo sabe, los grandes gigantes de Internet de hoy y las empresas emergentes de Internet utilizan básicamente Git, y básicamente abandonaron el uso de SVN. ¿por qué? Miremos juntos hacia abajo.
La diferencia entre Git y SVN
Diferentes métodos de almacenamiento
Git almacena el contenido en un formato de metadatos similar a una base de datos k / v, mientras que SVN se basa en archivos (la nueva versión de SVN se ha cambiado a almacenamiento de metadatos)
Aquí, damos un ejemplo simple de uso de Git.
cd .git/objects/df/
git cat-file -p df70460b4b4aece5915caf5c68d12f560a9de56e
echo 'version1' > text.txt
git hash-object -w text.txt
Diferentes formas de uso
Para enviar archivos localmente a servicios remotos, SVN solo necesita commint y Git necesita tres pasos: agregar, commint y push.
Por ejemplo, usamos la siguiente figura para simular el uso de SVN.
Podemos usar la siguiente figura para simular el uso de Git.
El modo de gestión de versiones es diferente
Git es un sistema de administración de versiones distribuido, mientras que SVN es un sistema de administración centralizado remoto.
Por ejemplo, podemos utilizar la siguiente figura para representar la gestión centralizada de SVN.
Podemos usar la siguiente figura para representar la administración distribuida de Git.
Resumen de los comandos principales de Git
Instalación del cliente Git
Descarga oficial del cliente: https://git-scm.com/downloads
Descargar otros clientes: https://tortoisegit.org/download/
Uso de comandos de Git
(1) Clonar a local basado en almacén remoto
git clone <remote_url>
(2) El directorio actual se inicializa como un almacén local de git
git init <directory>
(3) Cree un proyecto basado en una plantilla mvn
mvn archetype:generate
Agregar localmente
(1) Agregue el archivo especificado al área de almacenamiento temporal
git add <fileName>
(2) Agregue el directorio especificado al área de almacenamiento temporal
git add <directory>
(3) Agregar todo
git add -A
(4) Elimine el directorio y los subdirectorios especificados del área de almacenamiento temporal
git rm --cached target -r
(5) Agregue el archivo de configuración .gitignore
Enviar localmente
(1) Enviar al almacén local
git commit file -m '提交的注释信息'
(2) Enviar rápidamente al almacén local
git commit -am '快捷添加与提交'
Gestión de sucursales
(1) Ver la rama actual
git branch [-avv]
(2) Cree una nueva rama basada en la rama actual
git branch <branch name>
(3) Cree una nueva rama basada en el envío
git branch <branch name> <commit id>
$ git branch -d {
dev}
(4) Cambiar de rama
git checkout <branch name>
(5) Fusión de ramas
git merge <merge target>
(6) Resolver conflictos
Si la combinación automática falla debido a conflictos, el estado se está fusionando en este momento. Necesita modificar y reenviar manualmente (confirmar)
Gestión remota de almacenes
(1) Ver configuración remota
git remote [-v]
(2) Agregar dirección remota
git remote add origin http:xxx.xxx
(3) Eliminar la dirección remota
git remote remove origin
(4) Cargue la nueva rama al control remoto
git push --set-upstream origin master
(5) Asociar la sucursal local con el control remoto
git branch --track --set-upstream-to=origin/test test
Gestión de etiquetas
(1) Ver actual
git tag
(2) Crea una rama
git tag <tag name> <branch name>
(3) Eliminar rama
git tag -d <tag name>
Gestión de registros
(1) Ver todos los registros de confirmación en la rama actual
git log
(2) Ver todos los registros de confirmación en la rama actual
git log {
branch}
(3) Registro de visualización de una sola línea
git log --oneline
(4) Compare la diferencia entre las dos versiones
git log master..experiment
(5) Mostrar la red fusionada enviada en un gráfico
git log --pretty=format:'%h %s' --graph
Principios subyacentes de Git
Objeto de almacenamiento GIT (hashMap)
Git es un sistema de archivos de contenido direccionable. Su parte principal es un simple almacén de datos de valor clave. Puede insertar cualquier contenido en la base de datos y devolverá una clave hash para recuperar el valor. .
(1) Insertar datos en la biblioteca de valores-clave de Git
echo 'binghe' | git hash-object -w --stdin 79362d07cf264f8078b489a47132afbc73f87b9a
(2) Obtenga el contenido especificado según la clave
git cat-file -p 79362d07cf264f8078b489a47132afbc73f87b9a
Con base en esta función, Git guarda el contenido de cada versión de archivo en la base de datos, y cuando la versión se va a revertir, una de las claves se usa para recuperar y reemplazar el punto.
Proceso de escritura y reversión de la versión de Git
(1) Encuentra todos los objetos git
find .git/objects/ -type f
(2) Escriba la versión 1
echo 'version1' > README.MF; git hash-object -w README.MF;
(3) Escriba la versión 2
echo 'version2' > README.MF; git hash-object -w README.MF;
(4) Escriba la versión 3
echo 'version3' > README.MF; git hash-object -w README.MF;
(5) Revertir la versión especificada
git cat-file -p c11e96db44f7f3bc4c608aa7d7cd9ba4ab25066e > README.MF
Entonces, nuestro git add habitual es en realidad insertar el contenido modificado en la biblioteca de valores clave. Cuando ejecutamos git add README.MF, es equivalente a ejecutar git hash-object -w README.MF para escribir el archivo en la base de datos.
Hemos resuelto el problema de almacenamiento, pero solo puede almacenar contenido y no almacena el nombre del archivo. Si desea revertir, ¿cómo sabe qué contenido corresponde a qué archivo? A continuación, veremos el objeto de árbol, que resuelve el problema del almacenamiento de nombres de archivos.
Objeto de árbol Git
El objeto de árbol resuelve el problema del nombre de archivo. Su propósito es organizar varios nombres de archivo juntos, que contiene varios nombres de archivo y sus claves correspondientes y referencias a otros objetos de árbol, que pueden entenderse como archivos en el sistema operativo. Carpeta, una carpeta contiene varios archivos y varias otras carpetas.
Cada rama está asociada con un objeto de árbol, que almacena todos los nombres de archivo y las claves correspondientes en la rama actual. Puedes verlo con el siguiente comando
git cat-file -p master^{
tree}
Objeto de confirmación de Git
Un envío es una instantánea de la versión actual. La instantánea se guarda al enviar el objeto. El contenido almacenado es: un objeto de árbol de nivel superior, el objeto que se envió la última vez, el nombre de usuario y la dirección de correo electrónico del remitente, y la marca de tiempo del envío. enviar comentarios.
$ git cat-file -p b2395925b5f1c12bf8cb9602f05fc8d580311836
tree 002adb8152f7cd49f400a0480ef2d4c09b060c07
parent 8be903f5e1046b851117a21cdc3c80bdcaf97570
author binghe <[email protected]> 1532959457 +0800
committer binghe <[email protected]> 1532959457 +0800
En resumen, podemos inferir que se generan un total de tres objetos desde el proceso de modificación de un archivo hasta su envío:
- Un objeto de contenido: el contenido del archivo se almacena
- Un objeto de árbol: se almacena la clave del nombre del archivo y el objeto de contenido
- Un objeto de envío: almacena la clave del objeto de árbol y envía comentarios.
Referencias de Git
Cuando ejecutamos git branch {branchName}, se crea una rama. La esencia es crear un archivo de referencia basado en la confirmación especificada en git y guardarlo en .git \ refs \ heads \.
(1) Crea una rama
git branch dev
cat.git\refs\heads\dev
Hay tres tipos de referencias en Git:
- Referencia de rama
- Referencia de rama remota
- Referencia de etiqueta
(2) Consultar y comparar dos versiones
git log master..experiment
(3) Red de historial de envío de versiones
git log --pretty=format:'%h %s' --graph
(4) Ver la rama del árbol
git cat-file -p master^{
tree}
Bueno, ¡hablemos de eso hoy! ¡No olvides darle me gusta, dárselo a alguien que esté mirando y reenviarlo, para que más personas puedan verlo, aprender juntos y progresar juntos! !