tool example branches git diff compare status gitk

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