2008-10-23 11 views
142

Aquí hay dos preguntas diferentes, pero creo que están relacionadas.Usando Git, ¿cómo puedo encontrar cambios entre local y remoto?

  1. Al usar Git, ¿cómo puedo encontrar los cambios que he confirmado localmente, pero que aún no han enviado a una sucursal remota? Estoy buscando algo similar al comando Mercurial hg outgoing.

  2. Al usar Git, ¿cómo puedo encontrar los cambios que tiene una rama remota antes de hacer una extracción? Estoy buscando algo similar al comando Mercurial hg incoming.

Por el segundo: ¿hay alguna manera de ver qué hay disponible y luego seleccionar los cambios que quiero extraer?

+11

Mirando las respuestas, parece haber cierta confusión en cuanto a lo que 'hg entrante' y' hg saliente' realmente hacen. El equivalente de Git más cercano que encontré es la opción '--dry-run'. Simplemente 'git pull --dry-run' y verá una lista de todas las cosas que deben suceder. –

Respuesta

96

Git no puede enviar ese tipo de información a través de la red, como Hg. Pero puede ejecutar git fetch (que es más como hg pull que hg fetch) para obtener nuevas confirmaciones de sus servidores remotos.

Por lo tanto, si usted tiene una rama llamada master y un control remoto llamado origin, después de ejecutar git fetch, también debe tener una rama llamada origin/master. A continuación, puede obtener el git log de todas las confirmaciones que master debe ser un superconjunto de origin/master haciendo git log master..origin/master. Invierta esos dos para obtener lo opuesto.

Un amigo mío, David Dollar, ha creado un par de scripts de shell git para simular hg incoming/outgoing. Puede encontrarlos en http://github.com/ddollar/git-utils.

32
  1. Uso "git log origin..HEAD"

  2. Uso "git fetch" seguido de "git log HEAD..origin". Puede seleccionar cuidadosamente compromisos individuales utilizando los ID de confirmación listados.

El anterior supone, por supuesto, que el "origen" es el nombre de la rama de seguimiento a distancia (que es si usted ha utilizado clon con opciones por defecto).

+3

(Y si no está rastreando la rama remota, es "git log origin/master..HEAD".) – plindberg

+4

"origen" no es el nombre de la rama de seguimiento remoto, es el nombre del control remoto. Y solo al especificar que el nombre remoto no funciona, debe especificar la rama de seguimiento remoto, que sería origen/maestro. – robinst

41

No es una respuesta completa, pero git fetch retirará el repositorio remoto y no realizará una fusión. Puede hacer un

git diff master origin/master

+1

Funcionó para mí (pero a la inversa) - 'git diff origin/master master' –

19

También hay esto, para la comparación de todas las ramas:

git log --branches --not --remotes=origin 

Esto es lo que la página del manual git log dice acerca de esto:

Shows all commits that are in any of local branches but not in any of remote tracking branches for origin (what you have that origin doesn’t).

Lo anterior es para outgoing. Para incoming, sólo cambio:

git log --remotes=origin --not --branches 
100

A partir de Git 1.7.0, hay una sintaxis especial que le permite referirse genéricamente a la rama ascendente: @{u} o @{upstream}.

Para imitar hg incoming:

git log [email protected]{u} 

para imitar hg outgoing:

git log @{u}.. 

utilizo los siguientes incoming y outgoing alias para hacer lo anterior más fácil de usar:

git config --global alias.incoming '!git remote update -p; git log [email protected]{u}' 
git config --global alias.outgoing 'log @{u}..' 
+0

git log .. @ {u} me da estos errores. (Tengo tanto el origen como un repositorio en sentido ascendente en mi configuración de git). error: No se encontró una rama ascendente para el error ' : No se encontró una rama ascendente para' ..' error: No se encontró una rama ascendente para' .. ' fatal: argumento ambiguo' .. @ {u} ': revisión desconocida o ruta de acceso no en el árbol de trabajo. Use '-' para separar las rutas de las revisiones – Henrik

+6

Obtendrá esos errores si su sucursal local no está configurada con un flujo ascendente. Para solucionarlo, ejecute 'git branch --set-upstream foo origin/foo'. –

+0

funcionó bien para mí, aplausos –

1

git-out es un script que emula hg outgoing con bastante precisión. Analiza la salida "push-n", por lo que produce resultados precisos si necesita especificar argumentos adicionales para enviar.

+0

No para ventanas? –

+0

@techtonik ninguna idea. – stepancheg

0

git entrante

$ git fetch && git log ..origin/master --stat 
OR 
$ git fetch && git log ..origin/master --patch 

git saliente

$ git fetch && git log origin/master.. --stat 
OR 
$ git fetch && git log origin/master.. --patch 
7

lo haría

$ git fetch --dry-run 

para hg incoming y

$ git push --dry-run 

para hg outgoing.

+0

Lo siento, pasé por alto que esto ya se dijo como un comentario al OP. – chris

0

Cuando las respuestas "git log" y @ {u} inicialmente me dieron errores de "revisión desconocida", probé la sugerencia de Chris/romkyns de git push --dry-run.

Obtendrá una salida como "5905..4878 maestro-> maestro". 5905 es la última confirmación que el control remoto tiene y se compromete a través de (e incluyendo) 4878 se aplicará al control remoto.

A continuación, puede utilizar 5905..4878 como argumentos a varios otros comandos de Git para obtener más detalles:

git diff 5905..4878 # Gives full code changes in diff style 

git log --online 5905..4878 # Displays each commit's comment 
-1

Cuando no traes git, todos los contenidos que incluyen ramas, etiquetas (referencias) se almacenan temporalmente en .git/FETCH_HEAD cuyo contenido se puede ver con el comando: git log FETCH_HEAD Si no utiliza el sufijo -a con git fetch, de manera predeterminada, el contenido de FETCH_HEAD se sobrescribirá con nuevos contenidos. A partir de estos contenidos, puede ver y decidir a qué rama desea unirlos si lo hace o puede seleccionar de forma simple si solo desea unas cuantas confirmaciones de lo que ha sido traído por fetch.

Cuestiones relacionadas