Git checkout todos los files de la confirmación exacta

Como sé, para get una versión anterior de algún file, necesito una input:

git checkout COMMIT-HASH -- file-name.ext 

Pero si no quiero get todos los files modificados de alguna confirmación? ¿Puedo ingresar algo como:

 git checkout COMMIT-HASH -- * 

PD. Sé que puedo listr files de forma manual, pero no es conveniente si hay muchos files.

Simplemente no pases el nombre del file.

 git checkout COMMIT-HASH 

Si entiendo lo que está preguntando correctamente, creo que uno de estos dos hará el trabajo:

 git reset --merge <commit> 

o

 git checkout <commit> -- . 

Si hay files actualmente en su directory de trabajo que no están en <commit> , seguirán allí, lo que podría confundir las cosas, dependiendo de exactamente por qué desea hacer esto. Una alternativa para get un tree de trabajo limpio que sea solo el contenido de <commit> sería este:

 rm -r * git archive --format=tar <commit> | tar xf - 

Para el caso, puedes simplemente vaciar tu worktree antes de los commands de git reset o git checkout arriba, también …

Ninguno de estos moverá tu HEAD , que creo que es el efecto que intentas lograr …

Creo que esta pregunta SO puede ser de utilidad: ¿cómo enumerar todos los files en una confirmación?

Básicamente, para get una list de los files, puede usar git diff-tree :

 git diff-tree --no-commit-id --name-only -r COMMIT_ID 

Una vez que tengas eso, puedes alimentarlo para que salga de Git:

 git diff-tree --no-commit-id --name-only -r COMMIT_ID | \ xargs git checkout COMMIT_ID -- 

Entonces, el git diff-tree ayudará a get la list de files, y el xargs git checkout COMMIT_ID -- ayudará a restablecer los files afectados de nuevo al estado en el que se encontraban en ese commit (solo está revertiendo esos files en particular) .

Probablemente necesites hacer esto en la parte superior de tu tree de trabajo. Además, no traté de ver qué pasaría si hay un cambio de nombre involucrado, por lo que es probable que tenga que considerar otro caso extremo. Los espacios en los nombres de las routes también podrían ser un problema aquí, pero no vi una forma de get las routes en un formatting terminado en nulo con git diff-tree . Quizás git diff sería mejor en ese caso:

 git diff --name-only -z COMMIT_ID^ COMMIT_ID | \ xargs -0 git checkout COMMIT_ID -- 

Además, si realmente quieres regresar de esa manera y realmente solo hay un compromiso, es posible que git revert sea ​​una mejor manera de hacerlo.