(Do not) Use the git push --force Luke
Andrés Hernández - tonejito
Febrero 2025
Básico
El alumno conocerá el sistema de control de versiones git y aprenderá el uso de esta herramienta tanto desde línea de comandos, como desde un cliente de escritorio y vía web a través de Github.
Estudiantes, pasantes o egresados de carreras afines a computación, desarrolladores y entusiastas de la programación.


<Enter>
Esto también puede cambiarse con el comando chfn(1)
root@debian-12:~# chfn --full-name "Andrés Hernández" mi-usuario
Se puede verificar con getent(1)
root@debian-12:~# getent passwd mi-usuario
mi-usuario:x:1000:1000:Andrés Hernández,,,:/home/mi-usuario:/bin/bash
Guardar cambios en archivos separados
prog.c prog1.c prog2.c ... prog<n>.c
Guardar cambios en carpetas separadas
tarea/prog.c
version_inicial/prog.c
modificado2/prog.c
vers-28sep/prog.c
ProyectoFinal_2017-1_completo(Andres)/prog1.c
Se genera un correo por cada versión enviada
Puede ser tedioso encontrar una versión anterior
Algunos servicios de almacenamiento en la nube permiten regresar a versiones anteriores
Muchos de los servicios gratuitos únicamente permiten un número finito de versiones anteriores
Algunas veces los servicios de almacenamiento quitan las versiones anteriores más antiguas
Si el servidor falla, se pierden todas las versiones del proyecto
Cada cliente tiene una copia de todas las versiones del proyecto
Si el servidor falla es posible copiar todas las versiones desde un cliente
Es posible establecer estructuras jerárquicas

La comunidad de desarrolladores, incluyendo a Linus Torvalds, optó por desarrollar su propia herramienta
⇒
git presenta tres áreas de trabajo, asociadas con los estados que puede tener un archivo.git guarda todas las versiones de los archivos del proyecto
| Estado | Descripción | Comando |
|---|---|---|
| Modified | El archivo fue editado en el directorio de trabajo | editor archivo |
| Staged | El archivo (nuevo o modificado) fue agregado al área de staging | git add archivo |
| Estado | Descripción | Comando |
|---|---|---|
| Staged | El archivo se movió o renombró utilizando git |
git mv archivo1 archivo2 |
| Staged | El archivo se borró del área de staging utilizando git |
git rm archivo |
| Estado | Descripción | Comando |
|---|---|---|
| Committed | Los cambios del archivo fueron guardados en el repositorio | git commit archivo |
apt-get o aptitudeyumPara instalar en otras variantes de UNIX ver la documentación oficial
git init$ man git-init
git-init - Create an empty Git repository or reinitialize an existing one
git init [-q | --quiet] [--bare] [--template=<template_directory>]
[--separate-git-dir <git dir>] [--shared[=<permissions>]] [directory]
git init--sharedtonejito@linux:~$ git init --shared=group repo-compartido
Initialized empty shared Git repository in /home/tonejito/repo-compartido/.git/
tonejito@linux:~$ chmod -R g+rw repo-compartido/
tonejito@linux:~$ ls -la repo-compartido/
total 4
drwxrwsr-x 3 tonejito users 17 Jun 6 09:50 .
drwxr-xr-x 57 tonejito users 4096 Jun 6 09:50 ..
drwxrwsr-x 7 tonejito users 147 Jun 6 09:50 .gitgit clone para guardar una copia de un repositorio existentePara clonar el repositorio es necesario conocer la URL donde se aloja el proyecto
/path/to/repo.git/file:///path/to/repo.git/http[s]://host.xz[:port]/path/to/repo.git/ftp[s]://host.xz[:port]/path/to/repo.git/ssh://[user@]host.xz[:port]/path/to/repo.git/ssh://[user@]host.xz[:port]/~[user]/path/to/repo.git/git://host.xz[:port]/path/to/repo.git/git://host.xz[:port]/~[user]/path/to/repo.git/[user@]host.xz:path/to/repo.git/[user@]host.xz:/~[user]/path/to/repo.git/git-clone(1)git clone de la siguiente maneratonejito@linux:~$ git clone https://github.com/tonejito/curso-git.git
Cloning into 'curso-git'...
remote: Counting objects: 108, done.
remote: Compressing objects: 100% (42/42), done.
remote: Total 108 (delta 24), reused 0 (delta 0), pack-reused 65
Receiving objects: 100% (108/108), 429.40 KiB | 0 bytes/s, done.
Resolving deltas: 100% (45/45), done.
Checking connectivity... done.git-clone(1) (cont.)curso-git.gittonejito@linux:~$ ls -A curso-git/
.git .gitignore LICENSE.md presentation.md
img index.html Makefile README.md<coff> Ejemplo recursivo 😁 </coff>
git-add(1)git add se utiliza para especificar qué archivos incluirá git en el control de versionesgit-add(1) (cont.)man de git add muestra las opciones de línea de comandosgit-add - Add file contents to the index
git add [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing]
[--] [<pathspec>...]
README.md y escribir algún mensaje simple en elREADME.mdEditar el archivo README.md
# Mi repositorio de git
Andrés Hernández
git-status(1)git status para revisar si hay cambiostonejito@linux:~/repositorio$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
git-add(1)README.md al repositorio con el comando git addgit status para revisar si hay cambiosOn branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
git-add(1) (cont.)Desapareció el mensaje que sugería utilizar git add (comparar con la lámina anterior)
El cambio aún no está guardado, ver siguiente sección
.git se utiliza el comando git commitman de git commit muestra las opciones de línea de comandosgit-commit - Record changes to the repository
git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
[--dry-run] [(-c | -C | --fixup | --squash) <commit>]
[-F <file> | -m <msg>] [--reset-author] [--allow-empty]
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>] [--[no-]status]
[-i | -o] [-S[<key-id>]] [--] [<file>...]
git commit# serán ignoradas$GIT_EDITOR, core.editor, $VISUAL o $EDITORCommit inicial del proyecto
+ Se agrega el archivo README.md
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Explicit paths specified without -i or -o; assuming --only paths...
# On branch master
#
# Initial commit
#
# Changes to be committed:
# new file: README.md
#
| Línea | Elemento |
|---|---|
| 1 | Título del commit |
| 2 | Línea en blanco |
| 3 | Descripción del commit |
Es el único elemento requerido en un commit
| Línea | Elemento | Contenido |
|---|---|---|
| 1 | Título del commit | Descripción breve y concreta del cambio aplicado, menos de 50 caracteres |
| Línea | Elemento | Contenido |
|---|---|---|
| 2 | Línea en blanco | Se utiliza para separar el título del cuerpo |
| Línea | Elemento | Contenido |
|---|---|---|
| 3 | Descripción del commit | Mensaje que explica el cambio aplicado a profundidad |
| … | ✓ | Puede abarcar varias líneas de texto |
| … | ✓ | Es posible insertar elementos de sintáxis de Markdown |
| … | ✓ | Se pueden utilizar listas para enumerar elementos de manera vertical |
git-commit(1) - one linergit commit y especificar el título del commit en el mismo comandogit-commit(1) - one liner (cont.)git logtonejito@linux:~/repositorio$ touch archivo-para-borrar
tonejito@linux:~/repositorio$ git add archivo-para-borrar
tonejito@linux:~/repositorio$ git commit -m "Archivo de prueba para probar git-rm"
tonejito@linux:~/repositorio$ git log -n 1
commit f552622d1a526ed0471ea260e3b99d1cef0c72f3
Author: Andrés Hernández <andres.hernandez@ciencias.unam.mx>
Date: Wed Jun 8 13:52:04 2016 -0500
Archivo vacío para probar git-rmgit rmrm o borrar mediante el navegador de archivos.git se utiliza el comando git rmman de git rm muestra las opciones de línea de comandosgit-rm - Remove files from the working tree and from the index
git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>...
git-rm(1)git rm borra el archivo del Directorio de trabajo y marca el cambio en el Área de Stagingtonejito@linux:~/repositorio$ ls -l
total 4
-rw-r--r-- 1 tonejito users 0 Jun 8 13:45 archivo-para-borrar
-rw-r--r-- 1 tonejito users 44 Jun 6 18:01 README.md
tonejito@linux:~/repositorio$ git rm archivo-para-borrar
rm 'archivo-para-borrar'
tonejito@linux:~/repositorio$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: archivo-para-borrargit-rm(1) (cont.).git con git commitgit mv se utiliza para mover o renombrar archivos del repositoriomv o renombrar desde el navegador de archivosman de git mv muestra las opciones de línea de comandosgit-mv - Move or rename a file, a directory, or a symlink
git mv [-v] [-f] [-n] [-k] <source> <destination>
git mv [-v] [-f] [-n] [-k] <source> ... <destination directory>
git-mv(1)tonejito@linux:~/repositorio$ touch archivo-para-mover archivo-para-renombrar
tonejito@linux:~/repositorio$ git add archivo-para-mover archivo-para-renombrar
tonejito@linux:~/repositorio$ git commit -m "Archivos vacíos para prueba de git-rm" archivo-para-*
[master 657aa04] Archivos vacíos para prueba de git-rm
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 archivo-para-mover
create mode 100644 archivo-para-renombrargit-mv(1) (cont.)git mv moviendo un archivo a otro directorio y renombrando otro archivotonejito@linux:~/repositorio$ mkdir -v directorio
mkdir: created directory ‘directorio’
tonejito@linux:~/repositorio$ git mv archivo-para-mover directorio/
tonejito@linux:~/repositorio$ git mv archivo-para-renombrar archivo-con-otro-nombre
tonejito@linux:~/repositorio$ git commit -m "Prueba de git-mv"
[master 4f30937] Prueba de git-mv
2 files changed, 0 insertions(+), 0 deletions(-)
rename archivo-para-renombrar => archivo-con-otro-nombre (100%)
rename archivo-para-mover => directorio/archivo-para-mover (100%)origin y la rama por defecto se llama mastergit remotegit-push(1)git push de la siguiente maneratonejito@linux:~/repositorio$ git push -u origin master
Username for 'https://github.com': tonejito
Password for 'https://tonejito@github.com':
Counting objects: 12, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 1.35 KiB | 0 bytes/s, done.
Total 12 (delta 1), reused 0 (delta 0)
To https://github.com/tonejito/repositorio.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.git-push(1) (cont.)git pushtonejito@linux:~/repositorio$ git push
Username for 'https://github.com': tonejito
Password for 'https://tonejito@github.com':
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 462 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/tonejito/repositorio.git
4f30937..be47c1b master -> mastergit-push(1) (cont.)push.defaultgit reconoce cuando se realizan cambios en los archivos del Directorio de trabajo.git es necesario ejecutar git commit| Estado del archivo | Comando | Descripción |
|---|---|---|
| Untracked | touch <file> |
Se creó un nuevo archivo en el Directorio de trabajo Aún no se agrega al control de versiones |
| Estado del archivo | Comando | Descripción |
|---|---|---|
| new file | git add <file> |
Se agregó un nuevo archivo para ser versionado |
| Estado del archivo | Comando | Descripción |
|---|---|---|
| deleted | git rm <file> |
El archivo se borró del repositorio |
| Estado del archivo | Comando | Descripción |
|---|---|---|
| renamed | git mv <src> <dst> |
El archivo cambió de nombre o fue movido |
| Estado del archivo | Comando | Descripción |
|---|---|---|
| modified | gedit <file> |
El contenido del archivo fue modificado |
| Estado del archivo | Comando | Descripción |
|---|---|---|
| both modified | 😅 🔫 😡 | Es necesario hacer merge 😱 |
git add (ver siguiente sección)tonejito@linux:~/repositorio$ touch archivo-externo
tonejito@linux:~/repositorio$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
archivo-externo
nothing added to commit but untracked files present (use "git add" to track)
git add ⇨ new filegit addgit commit para guardar el cambiotonejito@linux:~/repositorio$ git add archivo-nuevo
tonejito@linux:~/repositorio$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: archivo-nuevo
git rm ⇨ deletedgit rmgit commit para guardar el cambiotonejito@linux:~/repositorio$ git rm archivo-para-borrar
rm 'archivo-para-borrar'
tonejito@linux:~/repositorio$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: archivo-para-borrar
git mv ⇨ renamedgit rmgit mv ⇨ renamed (cont.)git commit para guardar el cambiotonejito@linux:~/repositorio$ git mv archivo-para-mover directorio/
tonejito@linux:~/repositorio$ git mv archivo-para-renombrar archivo-con-otro-nombre
tonejito@linux:~/repositorio$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: archivo-para-renombrar -> archivo-con-otro-nombre
renamed: archivo-para-mover -> directorio/archivo-para-mover
git commit para guardar el cambiogit checkout <archivo>tonejito@linux:~/repositorio$ 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: pagina.html
no changes added to commit (use "git add" and/or "git commit -a")
git log se utiliza para visualizar la bitácora de revisiones del proyectoAuthor en la bitácora del repositorio?commit f020486f071bf11053547a86f4a7153b3c950f4b
Author: Facultad de Ciencias <ciencias@debian8.local>
Date: Tue 19 Jan 03:14:08 2038 +0000
Título del commit
Mensaje del commit
| Ubicación | Directorio | Descripción |
|---|---|---|
| System-wide Sistema |
/etc/gitconfig |
Archivo de configuración global para todos los repositorios presentes en el sistema |
| Ubicación | Directorio | Descripción |
|---|---|---|
| Global Usuario |
~/.gitconfig |
Archivo de configuración que aplica para todos los repositorios del usuario |
| Ubicación | Directorio | Descripción |
|---|---|---|
| Local Repositorio |
$GIT_DIR/config |
Aplica únicamente para el repositorio actual |
| Sistema operativo | Retorno de línea | Descripción |
|---|---|---|
| UNIX / BSD / Solaris / MacOSX / Linux | LF |
El salto de línea se representa con el caracter \n |
| Sistema operativo | Retorno de línea | Descripción |
|---|---|---|
| MacOS <= 9.2.2 Classic |
CR |
El salto de línea se representa con el caracter \r |
| Sistema operativo | Retorno de línea | Descripción |
|---|---|---|
| Windows | CR-LF |
El salto de línea se representa con el caracter \r seguido de \n |
git config puede corregir esto de manera adecuada 😁Un problema común con algunos editores es que agregan espacios en blanco sin que el usuario se de cuenta
| Elemento | Activo por defecto |
Descripción |
|---|---|---|
blank-at-eol |
SI | Quita espacios en blanco al final de la línea |
| Elemento | Activo por defecto |
Descripción |
|---|---|---|
blank-at-eof |
SI | Quita lineas vacías al final del archivo |
| Elemento | Activo por defecto |
Descripción |
|---|---|---|
space-before-tab |
SI | Quita espacios antes de un caracter <TAB> en el principio de la línea |
| Elemento | Activo por defecto |
Descripción |
|---|---|---|
indent-with-non-tab |
NO | Busca lineas que estan identadas con espacios, se controla con la directiva tabwidth |
| Elemento | Activo por defecto |
Descripción |
|---|---|---|
tab-in-indent |
NO | Busca <TAB> en la identación de las lineas |
| Elemento | Activo por defecto |
Descripción |
|---|---|---|
cr-at-eol |
NO | Identifica el caracter <CR> como válido al final de la linea |
core.whitespacegit config para modificar la directiva core.whitespace- son excluidosPara establecer el valor de core.whitespace utilizaremos las siguientes características:
blank-at-eol, blank-at-eof y space-before-tabindent-with-non-tab y tab-in-indentcr-at-eol ya que no se especifica en el valor