2012-05-20 7 views
23

Por algún motivo, Git me dice que tengo un archivo que es "comprometido" y "no organizado para la confirmación". Esto no tiene sentido:Git enumera el mismo archivo modificado y no organizado para la confirmación?

% git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: Dir1/Dir2/filename.cpp 
# 
# 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: Dir1/Dir2/filename.cpp 

Dir1, Dir2 y filename.cpp son definitivamente todo el mismo archivo. Tuve que volver a agregar filename.cpp para que apareciera como un cambio confirmado (después de haber estado originalmente en el repositorio). ¿Sobre la única cosa que pudo haber causado el problema fue que escondí, pull --rebase, y luego apareció el stash? .gitignore no enumera Dir1, Dir2 o filename.cpp en ninguna parte y los patrones no sugieren que atraparían este archivo?

+0

¿Cuál es exactamente la pregunta? – svick

+1

parece que lo ha modificado después de agregarlo, agréguelo nuevamente y debería estar bien. – thenetimp

+1

Lea sobre [lo básico] (http: // git-scm.com/book/es/Getting-Started-Git-Basics # The-Three-States) antes de usar una herramienta en producción. – kostix

Respuesta

4

Si modifica un archivo, lo agrega y lo vuelve a modificar, obtendrá este comportamiento. Cuando haces un git add, agrega los cambios hasta ese punto, y el compromiso posterior sin volver a agregar solo compromete el primer conjunto de cambios agregados.

$ git status 
# On branch master 
nothing to commit (working directory clean) 

matthewfarwell (master) 
$ vi foo.txt <-- add lines 1,2,3 here 

matthewfarwell (master) 
$ git add foo.txt 

matthewfarwell (master) 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: foo.txt 
# 

matthewfarwell (master) 
$ vi foo.txt <-- add lines 4,5,6, here 

matthewfarwell (master) 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: foo.txt 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: foo.txt 
# 

Así que si me comprometo ahora, solo se comprometerán las líneas 1,2,3.

28

Significa que ha realizado un cambio a filename.cpp, ha agregado ese cambio (con git add), y luego ha realizado otro cambio que aún no se ha agregado.

La parte de "cambios a cometer" significa que Git ha actualizado su índice con un cambio. Cuando ejecuta git commit, los cambios en el índice se usarán para crear el nuevo objeto de confirmación.

La parte "cambios no escalonados" muestra la diferencia entre el índice y su copia de trabajo.

Puede reproducir lo que se está viendo de esta manera:

  • Editar filename.cpp
  • Run git status. Verás "cambios no escalonados".
  • Ejecutar git add filename.cpp
  • Ejecutar git status. Verás "cambios que se comprometerán".
  • Editar filename.cpp nuevamente
  • Ejecute git status. Verá tanto "cambios no escalonados" como "cambios que se comprometerán".

¿Tiene sentido? Siempre es un poco complicado explicar cómo funciona Git.

+1

también tenga en cuenta: solo puede agregar un archivo una vez a un grupo de confirmación. Si lo cambia nuevamente después de agregarlo; esos cambios no serán incluidos en el compromiso. Para incluir todos los cambios nuevos en la confirmación, debe "git reset -file-" y luego "git add -file-" para actualizar la copia comprometida – ppostma1

+0

Ejecuto 'git add file.java', ejecuto' git status' justo después y aún muestra el archivo en "cambios no escalonados" y "cambios por cometer", muy confuso – Jose

10

En CVS, SVN, BZR, y sin duda una docena de otras herramientas, una vez que se agrega un archivo eso significa que se incluirá en la próxima confirmación.

Not it GIT.

En git no se "agrega un archivo", se "agrega un cambio" (a veces se llama "etapa de cambio").

Si cambia un archivo dos veces, tiene que "agregarlo" dos veces.

+0

Correcto. Solo agregaría que puede organizar solo una (s) línea (s) del archivo o incluso alguna (s) parte (s) (se llama trozo). Es una característica increíble, la estoy usando muy a menudo, por ejemplo, cuando hice más cambios (lógicamente no relacionados) en el mismo archivo y quiero dividirlos en commits separados. –

Cuestiones relacionadas