En este tema vamos a ver tareas básicas en Git.
Mas información
Source:Stack overflow Developer survey 2022
Código nuestro que estas en GitHub. Santificados sean tus commits. Venga a nosotros tu fetch. Hágase tu merge tanto en remoto como en local. Danos hoy nuestro branch de cada día. Perdona nuestras pulls, así como también nosotros perdonamos a los que nos pushean más rápido; No nos dejes caer en los conflictos, y líbranos del checkout. Amén ---Javier del Moral (2023)
Al instalar Git en Windows hay varias opciones a tener en cuenta que explicaremos en clase.
Una vez instalado Git, hay que indicar cual es nuestro nombre y nuestro correo.
git config --global user.name "juan" git config --global user.email juan@micorreo.com
Por último , si estás en el instituto , habrá que configurar el proxy:
git config --global http.proxy http://172.16.0.9:8080 git config --global https.proxy http://172.16.0.9:8080
Para instalar Git en Linux y que sea la última versión usaremos los siguientes comandos (Ya que por ejemplo en Ubuntu 18.04 la versión e un poco vieja):
sudo add-apt-repository ppa:git-core/ppa sudo apt update sudo apt install git
Los comandos básicos de Git son:
git init
git clone https://github.com/lgonzalezmislata/prueba.git
--cached
para referirse a la staged area otros usan --staged
--cached
para referirse a la staged area--staged
para referirse a la staged area --cached | --staged |
|
---|---|---|
git rm | ✓ | |
git restore | ✓ | |
git diff | ✓ | ✓ |
git rm --cached fichero
.
commit
solo se hace "commit" de los ficheros que estén en la staging area.git commit -m "mensaje"
git add fichero
commit
incluya ademas de los ficheros que están staged se incluya ademas todos aquellos ficheros que están modified , usaremos el parámetro -a
( o --all
)git commit -a -m "mensaje"
git add
.git restore --staged fichero
git reset fichero
pero se creo el nuevo comando git restore
que se puede usar la para hacer lo mismo así que recomendamos usar el comando más nuevo.
--cached
para que no se borre del área de trabajo y si solo de la staged area.git rm --cached fichero
git rm fichero
y en ese caso se borra tanto del staged area como del área de trabajo. No hay forma de borrarlo solo del área de trabajo ya que para eso está rm
de Linux.
git restore fichero
git checkout fichero
pero se creo el nuevo comando git restore
que se puede usar la para hacer lo mismo así que recomendamos usar el comando más nuevo.
--worktree
de forma que quede git restore --worktree fichero
pero no es necesario ya que se hace por defecto. Pero si se usara --staged
no se modifica el área de trabajo por defecto y en ese caso sería necesario añadirlo.
Restaura el fichero en el área de trabajo | Restaura el fichero en el staged area | |
---|---|---|
git restore fichero | ✓ | |
git restore --worktree fichero | ✓ | |
git restore --worktree --staged fichero | ✓ | ✓ |
git restore --staged fichero | ✓ |
git status
En la rama master Cambios a ser confirmados: (usa "git restore --staged <archivo>..." para sacar del área de stage) nuevos archivos: facturas.html Cambios no rastreados para el commit: (usa "git add <archivo>..." para actualizar lo que será confirmado) (usa "git restore <archivo>..." para descartar los cambios en el directorio de trabajo) modificados: main.js Archivos sin seguimiento: (usa "git add <archivo>..." para incluirlo a lo que será confirmado) cliente.html
git add
justo antes de hace el git commit
ya que sino hacemos los siguiente:git add
git status
. El fichero modificado está a la vez en el estado staged
y modified
git commit
En el commit solo se guardan los primeros cambios y no los segundos. Ya que al hacer el git add
, git se guarda como está el fichero en ese momento y en el git commit
solo se hace como está en ese momento.Aunque si hiciéramos el git commit -a
si que se guardaría el segundo cambio.
Más información:
Una misma rama en git puede estar en varios sitios a la vez. El repositorio es el historio donde están todos los commits que se han hecho.
Vamos a explicar cada uno de ellos suponiendo que estamos en la rama master
.
commit
origin/master
. Hay que fijarse que hay va todo junto y no con un espacio en medio. Ya es es simplemente el nombre de una rama local nuestra. Solo que es una copia de un remoto llamado origin
de su rama master
.master
. Al hacer referencia a una rama de un repositorio remoto, se usara la expresión origin master
con un espacio en medio. Ya que por separado está el nombre del remote llamado origin y de la rama llamadamaster
master
que es lo mismo que moverse a la rama master
. Tambien se puede usar con un hash de un commit.git switch master
origin/master
)git push o git push origin master
origin/master
.git fetch o git fetch origin master
master
y origin/master
. Como nuestra rama puede ser distinta, se hace un merge
sobre nuestra rama. Lo cual es peligroso.git pull o git pull origin master
git pull origin master
y estamos en otra rama , se hace un merge de origin/master
en la rama que estemos y eso no suele ser lo que queríamos hacer.
Así que mi recomendación es nunca usar git pull
y usar siempre git fetch
.
git pull
y usa siempre git fetch
.
origin/master
en la rama master
.git merge --ff-only origin/master
El Git un "remote" hace referencia a un servidor de Git donde subimos el código. Por defecto cuando hacemos git clone
se crea un remote llamado origin
.
git remote -v origin https://github.com/lgonzalezmislata/prueba.git (fetch) origin https://github.com/lgonzalezmislata/prueba.git (push)
git remote add nombreminuevoremote https://www.otroservidor.com/lgonzalezmislata/prueba.git
Una vez creado el remote otroservidor
ya podremos usarlo en los comandos git push
, git fetch
o git pull
además de usar origin
El comando git reset <commit>
vuelve a un commit anterior y borrando todos los siguientes.
git reset --hard 0d588ed
git reset --soft 0d588ed
git reset --mixed 0d588ed
git commit
) se usa la siguiente orden. Ya que HEAD
es el nombre del último commit y HEAD~1
el del penúltimo commit.git reset --soft HEAD~1
La siguiente tabla resume lo que hace cada modificador:
Borra los commits siguientes | Se modifica área de trabajo | Modifica staged area | |
---|---|---|---|
--hard | Si | Si | Si |
--mixed | Si | No | Si |
--soft | Si | No | No |
Ejemplos de como hacer un commit y lo que se necesita hacer después de borrarlo
soft | mixed | hard | |
---|---|---|---|
Hacer el commit | vi fichero git add fichero git commit -m "mensaje malo" | vi fichero git add fichero git commit -m "mensaje malo" | vi fichero git add fichero git commit -m "mensaje malo" |
Borrar el commit | git reset --soft HEAD~1 | git reset --mixed HEAD~1 | git reset --hard HEAD~1 |
Rehacer el commit | git commit -m "mensaje bueno" | git add fichero git commit -m "mensaje bueno" | vi fichero git add fichero git commit -m "mensaje bueno" |
Mas información en:
Una vez que hemos subido un commit a GitHub es una muy mala práctica borrar un commit sin embargo si queremos deshacer algo , podemos usar git revert <commit>
.
git revert HEAD~1
git revert --no-commit HEAD~1 git commit -am "Mensaje de commit"
--no-commit
es útil porque nos permite revisar que va a hacer el commit y nos permite hacer alguna modificación más.
Si no estamos interesados en hacer el commit lo podemos abortar con git revert --abort
o usar el ya conocido git restore --staged --worktree fichero
.
git add <fichero>
y por último ya hacer el commit.
git revert
y git reset
es que git revert
crea un nuevo commit que deshace el trabajo de otro commit , mientras que git reset
borra realmente los commits.
git revert C
quedará así
git reset --hard B
quedará así
En git podemos movermos a otras ramas o a otros commit. Para movernos se usa el comando git switch
.
git checkout
pero se creo el nuevo comando git switch
que se puede usar la para hacer lo mismo así que recomendamos usar el comando más nuevo.
Para movernos por ramas solo hay que indicar el nombre de la rama
git switch develop
Si la rama es del tipo origin/nombre_rama
hay que indicar --detach
ya que sobre esa rama no se pueden crear commit puesto que esa rama viene del remoto con git fetch
git switch --detach origin/develop
Podemos movernos a un commit anterior de forma que los ficheros de ese commit estén en nuestro directorio de trabajo. El lanzar esta orden no modifica ningún commit.Su utilidad es ver como estaba el código en estados anteriores. Hay que indicar --detach
ya que sobre commit no se pueden añadir más commits yaque ya están añadidos ya que es un commit que está a mitad del arbol de git.
git switch --detach 2308b63
Si ahora lanzamos el comando git status
se mostrará lo siguiente
HEAD desacoplada en 2308b63 nada para hacer commit, el árbol de trabajo está limpio
El significado de HEAD desacoplada o HEAD detached es que ahí no podemos trabajar, no pudiendo hacer nuevos commits desde ahí aunque si que podríamos hacer una nueva rama.
git switch master
Por defecto Git no sube las carpetas vacías, por lo que si queremos que las suba hay que añadir algún fichero. Por convención se suele crear un fichero llamado .gitkeep
y al ya haber algún fichero, git subirá esa carpeta.
El fichero .gitignore
permite indicar que carpetas no se deben subir a git. El fichero debe estar en el raíz del proyecto de git.
node_modules
hay que crear el fichero .gitignore
con la siguiente línea:/node_modules
Normalmente trabajamos siempre en nuestro ordenador y no queremos todas las veces volver a poner la contraseña. En ese caso se puede decir a git que la almacene y no nos la vuelva a pedir:
git config --global credential.helper cache
git config --global credential.helper store
Hay veces que queremos guardar temporalmente los cambios para después volver a ellos, por ejemplo si queremos cambiar de rama.
git contiene una orden para hacer eso que es git stash
.
1 |
git stash push |
pop
se restaura el estado en el staged area.
1 |
git stash push --include-untracked |
Por defecto | --include-untracked | --all |
|
---|---|---|---|
Los ficheros modificados (estén o no en el staged area) | ✓ | ✓ | ✓ |
Los ficheros nuevos | ✓ | ✓ | |
Los ficheros ignorados | ✓ |
Y si luego queremos recuperar los cambios se hace con:
1 |
git stash pop |
--index
para que restaure el staged area
1 |
git stash pop --index |
El comando git log
permite ver el histórico de commits
git --no-pager log --pretty=oneline
git --no-pager log --pretty=tformat:"%h %cn %cd %s" --date=format:"%d/%m/%Y %H:%M:%S"
Los mensajes de commit deben seguir el siguiente formato:
type(#issue):titulos Explicación (opcional)
Siendo
type
#issue
: Es el Nº de la incidencia a la que hace referencia. Mas información sobre los issues de GitHub: aquíVamos ahora unos ejemplos:
fix(#45):Falla si la fecha está vacía
feat(#456):Mostrar el listado de los pacientes El listado se ha hecho en HTML en vez de generar un PDF.
Mas información:
Para todos los ejercicios de este tema, se usarán los comandos de Git siempre que sea posible y los mensajes de los commits deberán seguir el formato explicado en clase.
git status
para ver el estado de los ficheros.
En este ejercicio vamos a tener 2 carpetas que estarán "apuntando" al mismo repositorio de Git. Las carpetas las vamos a llamar "A" y "B".
Crea un nuevo proyecto de NodeJS y haz lo siguiente:
index.js
node_modules
dist
pero que esté vacia.
Modifica el proyecto de Git de forma que no se suba la carpeta node_moules
y si que se suba la carpeta dist