example - gitk windows
Git: Comparar todos los compromisos locales con la versiĆ³n de Remote Repo (6)
El comando más simple y ciertamente más fácil de recordar que (normalmente) hace lo que quiere es este:
git diff origin
Esto muestra la diferencia entre lo que sacó originalmente (el origen) y la rama actual en la que está trabajando, que los valores predeterminados master
.
Soy algo nuevo en Git y lo que estoy tratando de hacer parece que debería ser posible. Básicamente, he estado trabajando fuera del clon de un repositorio y he hecho algunos compromisos locales. ¿Hay alguna manera de ver la diferencia de la "suma" de todos mis cambios y la versión original del repositorio? Asumiría que esto sería posible porque Git esencialmente lo hará cuando haga un push
.
Aquí hay un ejemplo de lo que estoy tratando de hacer: en gitk veré algo como esto:
* - [mybranch] Se agregó ''42'' al final de answers.txt (confirmación local)
* - Se agregó ''Hello World'' al final de my.txt (confirmación local)
* - Se agregó ''C # /. NET'' al comienzo de my.txt (confirmación local)
* - <[RemoteRepo]> (repositorio original del que cloné)
¿Cómo puedo ver la diferencia de la suma de todos mis cambios en my.txt
y answers.txt
en comparación con la versión original que my.txt
de my.txt
?
Hay tres maneras (otras dos de otras respuestas dadas aquí)
1) git diff origin/master master
2) git diff origin/master..master
3) git diff origin/master...master
El primero y el segundo son iguales y muestran los cambios entre las puntas del maestro y del maestro remoto.
El tercero muestra los cambios que se produjeron en el maestro desde la última vez que se empujó la rama y creo que este es el más apropiado que está buscando
La diferencia se puede ver con git diff AB
, comparará el código en A a B:
git diff origin/master master
origin/master
es el estado de la rama maestra remota cuando se recuperó (o clonó) por última vez, el master
es el estado local del código, a menos que haya cambiado de ramas al trabajar localmente.
La respuesta más lista es
git show-branch
Lo que puedes hacer para tener más control es usar git log
annex git rev-list
:
git log --left-right --graph --cherry-pick /
--oneline branchname...remote/branchname
Este es mi método preferido y dará como resultado algo como
> | fff6bda remote fix
< | c8903ee local fix
< | 724373c Merge branch ''bla'' into bla
|/ /
| < | 2faf547 details
| < | abbdc47 ....
|/ /
< | befc181 some tagged commit
Incluya --decorate y obtendrá algo parecido a gitk, git-gui y gitweb:
> | fff6bda remote fix
< | c8903ee local fix
< | 724373c (tag_4) Merge branch ''bla'' into bla
|/ /
| < | 2faf547 details
| < | abbdc47 ....
|/ /
< | befc181 (tag_3) some tagged commit
CONSEJO PRO 1: use '' git config alias.lr log --long-option1 --long-option2
'' para un uso conveniente
CONSEJO PRO 2: use '' git config color.ui auto
'' para el alivio inmediato de la vista
Si desea todos los jefes locales ( en todas las sucursales locales ) frente a todas las confirmaciones remotas ( en las mismas ramas ):
git log --decorate --pretty=oneline --all --not --glob=refs/remotes --no-walk
Deje la no-caminata para obtener todas las revisiones individuales. En este caso, prefiero usar los interruptores que se muestran anteriormente (--graph --left-right)
Fusiones
Si desea ver las combinaciones claramente, incluya --boundary
Varias consultas avanzadas:
Filtrando los resultados
Git log
y rev-list
admiten toda una serie de funciones de filtrado astuto, consulte la página del manual
--after ''2001-01-01''
--until ''last week''
--author ''martin''
-E -i --grep=''fixes #[0123456789]+''
-S ''new_debug_function''
y muchos, muchos otros. Esto debería darle un montón de influencia para obtener exactamente la información que desea con casi ningún esfuerzo
¿Qué se esconde localmente?
Lo que reside en los escondites, pero no en los controles remotos (tenga en cuenta que no hay manera de referirse a los escondites en los remaches remotos, ya que los escondites residen en los reflogs, y los reflogs (incluso para las ramas remotas) siempre reflejan la historia local [1]):
git log $(git rev-list -g stash) --not --glob=refs/remotes
Todos los (otros) compromisos inalcanzables ...
Notas
- en mi flujo de trabajo, estos constituyen compromisos modificados o modificados de base y solo depósitos ocultos
- generar estos también llevará algún tiempo dependiendo del tamaño de su gráfico de historial
esto incluirá cualquier escondite eliminado, pero no los ocultos actuales
git log $ (git fsck --no accesible --full --lost-found | grep ''commit'' | cortar -d '''' -f3) / --no-walk --not --glob = refs / remotes --oneline --Decorar
Scripting
Para propósitos de scripting, reemplaza el uso de git log
con git rev-list
y obtendrás solo los hashes (y algo más de robustez).
[1] Ver también mi (s) respuesta (s) anterior (es) sobre cómo transferir escondites entre repositorios:
para todo git diff HEAD origin / "nameofyourbranch"
para archivo específico git diff HEAD: "filename" origen / "nameofbranch": "filename"
git diff origin/master..master