¿Cómo empalmar los siguientes 2 commands de git en uno?

El siguiente command cambia el directory de trabajo, y también el escenario:

git checkout <commit> <file>

El siguiente command no toca el directory de trabajo, solo cambia la etapa:

git reset <commit> <file>

Me gustaría cambiar solo el directory de trabajo, pero no quiero tocar el escenario. Puedo hacer esto con los siguientes commands:

 git checkout <commit> <file> git reset <file> 

¿Cómo puedo hacer eso con un solo command?

La respuesta más correcta es "no puedes". Sin embargo, hay dos simples soluciones alternativas (bueno, la primera es más simple que la segunda, y la segunda es como decir "puedes"):

  • Utilice git show , por ejemplo, git show HEAD~3:path/to/foo.txt > path/to/foo.txt

    El inconveniente aquí, además de tener que escribir el nombre / ruta del file dos veces, es que el command show no aplica ningún filter de manchas. Si no tienes filters de manchas, eso no es gran cosa.

  • Puedes elegir un "file de índice" diferente (área de ensayo) durante tu git checkout para que el escenario que tocas no sea el escenario que usarás para el siguiente compromiso:

    GIT_INDEX_FILE=/tmp/dummy git checkout <commit> <path>

    El inconveniente aquí es que esto es un poco torpe, y debe recordar limpiar su file índice ficticio (el área de ensayo falsa). Además, lo anterior supone la syntax de shell (sh / bash); es posible que necesite usar el progtwig env o alguna otra forma en otras shells.