2012-01-26 13 views
10

Mi actual git status se ve así:Git parciales de cometer por etapas cambios

# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: docs/file3.org 
#  modified: src/main/R/lib.R 
# 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: docs/file3.org 
#  modified: src/main/R/lib.R 

que me gustaría cometer el realizaron cambios a docs/file3.org primero, y luego la otra cambios por etapas. Pero si lo hago git commit -m '...' docs/file3.org, confirmará los cambios no escalonados & por etapas a ese archivo.

¿Hay una manera fácil de hacer esto? ¿O necesito stash mis cambios sin registrar, dejar de lado uno de los archivos, confirmar el otro, rehacer, confirmar y stash pop?

+2

Es posible que el comportamiento de 'git commit' haya cambiado desde que publicó esta pregunta, pero a partir de diciembre de 2015, el comando que intentó (especificando las rutas que quería confirmar) debería funcionar. Desde la [documentación] (https://git-scm.com/docs/git-commit) de la opción commit de git --only: * Realice una confirmación tomando los contenidos del árbol de trabajo actualizado de las rutas especificadas en el comando línea, sin tener en cuenta los contenidos que se han organizado para otras rutas. Este es el modo de operación predeterminado de git commit si se dan rutas en la línea de comandos, en cuyo caso esta opción se puede omitir. * – waldyrious

+0

De hecho, esperaría que 'git commit' (sin rutas especificadas) se comprometa * solo en etapas * modificaciones. De todos modos, otra opción es usar 'git gui' para las operaciones de escenario y compromiso. – aweibell

Respuesta

9

ya que sólo necesita para confirmar los cambios por etapas para un archivo, sólo puede escondite, manteniendo intactos los cambios indexados, y cometiendo el archivo después de eso.

git stash --keep-index #Note that the staged changes also become part of the stash 
git commit -m "Commit only one file" docs/file3.org 

git commit -m "Commit other staged changed" 
git stash pop 
# This may raise CONFLICTS since the stash includes the earlier staged changes. 
# In case of conflict, the stash is not popped, so you need to drop it explicitly. 
+1

Este es básicamente el flujo que describí en mi pregunta, que esperaba * no * hacer. =) Pero si es lo que tenemos, es lo que tenemos, gracias. –

+0

No entiendo muy bien el punto de poder realizar un parcial si no puedes dividir el commit de todos modos. Usar git stash realmente suena como una solución. – aweibell

1

git stash es la mejor opción, combinada con.

git add --interactive 

Esto debería permitir 'revertir' (dejar de grabar en el escenario) algunos archivos ya agregados al índice.
Luego, git stash le permitirá guardar esos archivos y restaurarlos.

(Véase el artículo "git add --patch and --interactive" para un ejemplo)

2

Voy a suponer que usted está en master para todo esto ...

git branch whatever 
git commit # commit currently staged changes as 'commit1' 
git add docs/file3.org 
git commit # commit unstaged changes as 'commit2' 

Ahora tendrá esta

master 
    \ 
    \--commit1--commit2 

Ahora, ejecute git log y registre los SHA para 'commit1' y 'commit2'.

git checkout master 
git cherry-pick commit2SHA 
git cherry-pick commit1SHA 

que le dará

master--newcommit2--newcommit1 
    \ 
    \--commit1--commit2 

Y a continuación, puede destruir el 'lo' rama

git branch -D whatever 

edición:

Y ou también podría hacer algo similar con el alijo:

git stash --keep-index # Save unstaged changes 
git stash    # Save staged changes 
git stash pop [email protected]{1} # Pop unstanged changes 
git commit ...   # Commit unstanged changes 
git stash pop [email protected]{0} # Pop staged changes 
git commit ...   # Commit staged changes 
+1

En su primer 'commit git', ¿no comprometerán ambos archivos actualmente en etapas? Eso es lo que intento evitar, quiero un conjunto de bloqueos de un archivo en mi primer compromiso. –

3

Lo que es realmente raro, es que el libro git-SCM explica puesta en escena exactamente como usted describió:

cambios unstaged del mismo archivo no van con cometer, solamente por etapas cambios.

Compruébelo usted mismo: http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository#Staging-Modified-Files

empecé a prueba y con independencia de lo que cambia del mismo archivo que había puesto en escena, todos los cambios fueron con la confirmación.

Cuestiones relacionadas