2014-07-19 11 views
8

Mentre lavoravo su un altro file, ho modificato README.md e ho eseguito git add README.md. Quando faccio un commit Git, vedo che README.md è sia nelle "Modifiche da impegnare" che in "Modifiche non in scena per il commit".Un file può essere messo in scena e non messo in pausa in Git?

Ha senso? Dove nel .git posso guardare per vedere lo stato autorevole di questo file?

+1

si può pensare a questo come questo: si cambia 10 linee. Con 'git add -p' si aggiungono solo le prime 5 modifiche. Ora il tuo file è anche messo in scena e non messo in scena. – RedX

risposta

10

Ciò significa che parte delle modifiche apportate sono state organizzate per il commit e parte no.

È possibile controllare ciò che viene messo in scena se si esegue

git diff --staged -- README.md 

e verificare la presenza di ciò che è Unstaged eseguendo

git diff -- README.md 

La maggior parte dei sistemi di controllo versione generalmente memorizzare solo i cambiamenti tra due stati. Il modo in cui git funziona, mentre apporti più modifiche a un file, dovrai aggiungere/contrassegnare ciascuna di esse come parte di un insieme di modifiche a.k.a un commit. Quando si utilizza git add questo viene fatto automaticamente.

Tuttavia, non è l'unico modo per aggiungere tutte le modifiche individuali (hunk) al tuo "indice". Ad esempio, è possibile apportare più modifiche allo stesso file e impegnarle in commit diversi o aggiungere solo modifiche specifiche a un commit. Per esempio. per aggiungere esplicitamente alcune modifiche al tuo "indice" ma non ad altre, puoi farlo utilizzando git add -p per aggiungere solo alcuni "hunk" (gruppi) delle modifiche invece dell'intera lista di modifiche stesse.

Quello che è successo qui è che le modifiche apportate al README.mdprima messa in scena (git add) mostrerà in scena e le modifiche apportate dopo messa in scena README.md mostrerà come non è stato classificato come avete ottenuto in precedenza.

+1

È importante sapere che git mette in scena e impegna le righe di contenuto, non i file. Questo può essere molto utile, ad esempio per commettere alcune modifiche in un file lasciando gli altri per un commit futuro. Inoltre, un git gui renderà più semplice vedere e modificare quali parti del file sono messe in scena. – Jerry101

+0

@ Jerry101: "righe di contenuto, non file" --- Direi "modifiche". Perché: l'eliminazione di un file non contiene righe. Lo stesso per modificare i permessi – zerkms

+1

@zerkms sì, ma se si cambiano le parti del file che sono state messe in scena/non messe in esecuzione, lo fa in "hunks" che sembrano essere una o più righe per i file di testo. Correggi se sbaglio. – Jerry101

7

Dove in .git è possibile cercare lo stato autorevole di questo file?

Uso git diff:

  • git diff -- yourFile vi darà le modifiche non ancora messa in scena (non ancora aggiunti all'indice)
  • git diff --cached -- yourFile vi darà i cambiamenti già aggiunte all'indice.

saperne di più visita "Changes, not files":

La maggior parte dei sistemi di controllo versione lavorare con i file. Si aggiunge il file al controllo del codice sorgente e il sistema tiene traccia delle modifiche da quel momento in poi.

Git si concentra sulle modifiche apportate a un file, non sul file stesso.
Un comando git add file non comunica a git di aggiungere il file al repository, ma di prendere nota dello stato corrente del file per il successivo commit.

Vedere anche "git add -p: The most powerful git feature you're not using yet"


Nota che git status -v -v sarà presto (Git 2.3.4, Q2 2015) vi mostra entrambi diff (messo in scena e non è stato classificato), possibile elencando diverse diff per lo stesso file.

Vedere "Show both staged & working tree in git diff?".

+0

Grazie, ho compreso l'idea di modifiche Sono più interessato a capire perché README.md è stato visualizzato due volte nello stato –

+0

@MarkHarrison perché prima hai aggiunto una modifica, quindi ne ha fatto uno nuovo – VonC

+0

Ah, grazie, questo lo rende molto chiaro. –

1

In realtà lo Stato che si vede è molto facile da riprodurre:

git init 
touch test 
git add test  #1 
echo 42 > test #2 
git status  #3 

a # 1 mettiamo in scena il file di test vuoto. # 2 cambia il contenuto del file. Queste modifiche non verranno implementate (poiché è necessario eseguire esplicitamente le modifiche utilizzando git add). L'output di git status in # 3 ti dice esattamente questo.

Per vedere quali modifiche sono state gestite, eseguire git diff --cached. Per vedere quali modifiche ai tuoi file di lavoro non sono state organizzate, esegui git diff.

Nella tua domanda, diciamo che hai eseguito git commit. Dall'output git status sembra che il commit non sia stato creato, probabilmente perché non hai inserito un messaggio di commit. Controlla l'output di git commit, probabilmente git ti ha detto cosa è andato storto quando provi a creare il commit!

1

Risposta a "Ha senso?"

Ha senso solo se si capisce che git non memorizza le differenze memorizza le istantanee.

Nell'esempio si descrivono due versioni di README.md nelle modifiche. La versione di prova è la versione di cui sei attualmente soddisfatto e finirà per essere l'ultima istantanea del file se scegli di eseguirla. La versione non modificata è una potenziale istantanea che sostituirà la versione attualmente in scena se si sceglie di metterla in scena.

Leggere la sezione 'Istantanee, Not Differenze' nel seguente link per maggiori comprensione su come git opere:

http://git-scm.com/book/en/Getting-Started-Git-Basics

anche guardare il seguente link per una ulteriore spiegazione dello scenario in cui si' ve incluso nella tua domanda (in particolare la sezione 'stadiazione Modificato Files'):

http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository

Problemi correlati