Una vez modificado un archivo, podemos ver los cambios con:
git diff
Deshacer cambios de un archivo:
(Nota, no hemos utilizado el comando git add
)
git checkout -- myfile.txt
Deshacer TODOS los cambios:
git checkout -- .
Pero, si utilizamos el comando git add
, nuestro archivo aparecerá en verde en el staging area y por consiguiente checkout NO funcionará.
Debemos utilizar un nuevo comando reset.
git reset HEAD myfile.txt
Ahora, ya sale en rojo en el staging area. Como si nunca hubieramos usado el comando git add
.
Ahora podemos utilizar el checkout sin problema.
Primero, imprimimos el Log de commits.
git log --oneline
d934552 (HEAD -> master, origin/master) rebase interactivo cambio
729f5d7 Rebase interactivo
367f18a Update Tag Readme
0a15183 (tag: v3.14) rebase tips readme
871e064 (branchToRebase) update json
019a826 git ignore
Tenemos el hash del commit y el mensaje.
Ahora queremos borrar el commit 367f18a Update Tag Readme
.
git reset 367f18a
Borrar tanto del stage como el commit, es PELIGROSO:
git reset --hard 367f18a
Pero tenemos un comando que permite Deshacer un Commit pero que conserve los cambios en el Staging area, como si apenas hubieramos escrito el codigo pues.
git reset --soft 367f18a
On branch master:
Changes to be committed:
modified file.txt
En lugar de utilizar git reset
es mejor utilizar este comando.
Vemos diferencia entre dos commits:
git diff 729f5d7 d934552
O bien, comparamos el penúltimo commit con el último.
git diff HEAD~1 HEAD
Hacemos Revert del commit especificando el Hash o si es el último commit usamos HEAD ( o el penultimo commit usamos HEAD~1):
git revert d934552
git revert HEAD
Luego, git nos pedira ingresar un commit, generalmente llevan la palabra "Revert commit ....", es decir, se crea un commit de un commit revertido.
Si no queremos que git haga esto, usamos el siguiente comando. Este comando hará un git rever pero, no creara un nuevo commit, sino dejara tus cambios en el Staging area.
git revert --no-commit HEAD~1
Creamos una rama:
git branch name-of-branch
Nos cambiamos a esa rama:
git checkout name-of-branch
O hacer ambas cosas con un comando:
git checkout -b name-of-branch
Mostrar ramas ocultas:
git branch -a
Tags anotadas: son almacenadas como objetos, mas detalladas. Tags ligeras: son tags con menos informacion.
Tag anotada:
git tag -a v0.8 -m "un mensaje, es la version 0.8"
Tag no anotada:
git tag v1.0
Asignar un Tag a un Commit en especifico, usamos el numero SHA del Commit al final del comando (ej. num sha 612d323):
git tag -a v1.0 -m "soy la version 1.0" 612d323
Una vez creadas las tags, debemos subirlas al github.
git push origin v1.0
Subir todos los Tags:
git push origin --tags
To show all tags:
git tag -l
First, notice the two points : its important.
In order to delete a tag, le us say tag v3.14
, type:
git push origin :v3.14
- [deleted] v3.14
NOTE: If you type it without the two points :, you are uploading the TAG instead of Deleting it.
Guarda los cambios en la rama oculta:
git fetch origin
From https://github.com...
3424234..42343 master -> origin/master
Pasa los cambios de la rama oculta a la rama master:
git merge origin/master
Auto-merging
From https://github.com...
3424234..42343 master -> origin/master
Git Pull es como ejecutar un git fetch y un git merge al mismo tiempo.
git pull = git fetch + git merge
Si queremos actualizar nuestra rama con los últimos cambios de master.
Primero tener actualizado master:
git checkout master && git pull
Cambiamos a nuestra Rama:
git checkout BranchToRebase
Ahora, procedemos a realizar el Rebase:
git rebase master
En caso de tener un conflicto...
Podemos abortar, esto significa dejar la rama como estaba.
git rebase --abort
O bien, corregir los conflictos:
Despues de hacer Rebase.
$git rebase master
First, rewinding head to replay your work on top of it...
Applying: git ignore
Applying: update json
Using index info to reconstruct a base tree...
M simpleJson.json
Falling back to patching base and 3-way merge...
Auto-merging simpleJson.json
CONFLICT (content): Merge conflict in simpleJson.json
error: Failed to merge in the changes.
Patch failed at 0002 update json
Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Se observa que hay un conflicto:
CONFLICT (content): Merge conflict in simpleJson.json
error: Failed to merge in the changes.
Procedemos a abrir el archivo con un mergetool.
git mergetool
Luego, detectamos los conflictos. Suelen parecerse a esto:
<<<<<<< HEAD
"some code": "code of master branch"
=======
"some code": "code of branchToRebase"
HEAD: Último commit.
Despues de corregir los conflictos. Agregamos el archivo corregido con:
git add conflict_files
Luego indicamos que continue el Rebase.
git rebase --continue
Y listo.
Ejecutamos:
git mergetool
Corregimos... Y agregamos los archivos corregidos.
git add conflict_files
Hacemos un Commit.
git commit -m "se arreglaron conflictos"
Lo enviamos a master
git push origin master
Podemos cambiar orden de commits. Podemos aplastar commits en uno, squash. Podemos poner un mensaje general de varios commits.
NUNCA: se hace Rebase Interactivo en código Pusheado, solo local.
git rebase -i
Identificamos cuantos commits queremos modificar, digamos los ultimos 4 de la rama.
git rebase -i HEAD~4
Se abre un editor de textos VIM en la terminal.
pick 213213 Mi cambio C (el mas viejo)
pick 624236 Mi otro cambio B
pick 411239 Mi cambio A (el mas nuevo)
Para cambiar el orden de los commits, solo cambialo de renglon.
pick 411239 Mi cambio A
pick 624236 Mi otro cambio B
pick 213213 Mi cambio C e
Podemos aplastar commits squash, para que aparezca como un unico commit: Debemos dejar el commit superior con pick, ya que en este commit se incluiran los demas cambios.
pick 411239 Mi cambio A
squash 624236 Mi otro cambio B
squash 213213 Mi cambio C
Guardamos cambios :wq
Luego, Git preguntara por un mensaje global (se muestra otravez el editor de textos)
Agregamos un comentario del Commit global
Guardamos cambios :wq
Un commit de manera local:
git commit --amend -m "Nuevo mensaje en commit"
Git pensara que no hay nada que subir, entonces usamos el comando de force push:
git push origin master -f
Suele pasar cuando creamos una rama nueva, pero esta entra en conflicto con otra existente en:
.git/refs/heads
Entonces abrimos dicho path con open .git/refs/heads
y vemos si esta repetida.
Como resolver ese error?, pues creando una rama nueva con diferente nombre.
Para los que han sufrido revisando cuales commits hacen parte de su branch ignorando los commit de merge etc.
git log --no-merges --first-parent
git remote prune origin
i: te permite escribir
esc, dos puntos, tecleamos wq
w: write
q: salir
:wq
Agregamos en el archivo .gitignore
aquello que queremos que no se suba al repositorio.
obviamente se debe hacer push al archivo .gitignore
despues de haber sido editado.
O es el WIFI o es esto:
A shell task (/usr/bin/env git fetch --prune --quiet https://github.com/...git refs/tags/:refs/tags/ +refs/heads/:refs/heads/ (launched in /Users/Library/Caches/org.carthage.CarthageKit/dependencies)) failed with exit code 1
Utilizar el comando:
rm -rf ~/Library/Caches/org.carthage.CarthageKit