2012-01-26 14 views
10

Il mio attuale git status si presenta così:Git parziali commit di modifiche messo in scena

# 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 

vorrei commettere il scena modifiche docs/file3.org prima, poi l'altro modifiche in scena. Ma se faccio git commit -m '...' docs/file3.org, commuterà entrambe le modifiche non pianificate di & a quel file.

C'è un modo semplice per farlo? O ho bisogno di stash le mie modifiche non applicate, lo stemperamento di uno dei file, commit l'altro, restage, commit, e stash pop?

+2

È possibile che il comportamento di 'git commit' sia cambiato da quando hai postato questa domanda, ma a partire da dicembre 2015, il comando che hai provato (specificando i percorsi che avresti voluto commettere) dovrebbe funzionare. Dalla [documentazione] (https://git-scm.com/docs/git-commit) di git commit - unica opzione: * Effettuare un commit prendendo il contenuto aggiornato della struttura di lavoro dei percorsi specificati nel comando linea, ignorando qualsiasi contenuto che è stato messo in scena per altri percorsi. Questa è la modalità predefinita di funzionamento di git commit se nella riga di comando sono presenti dei percorsi, nel qual caso questa opzione può essere omessa. * – waldyrious

+0

In realtà mi aspetterei che 'git commit' (senza percorsi specificati) per il commit * solo messo in scena * modifiche. Ad ogni modo, un'altra opzione sta usando 'git gui' per le operazioni di stage e commit. – aweibell

risposta

9

Dal momento che avete solo bisogno di confermare le modifiche messe in scena in un file, si può semplicemente scorta, mantenendo i cambiamenti indicizzati intatto, e commettendo il file dopo.

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

Questo è fondamentalmente il flusso che ho delineato nella mia domanda, che speravo * non * di fare. =) Ma se è quello che abbiamo, è quello che abbiamo, grazie. –

+0

Non capisco il punto di essere in grado di mettere in scena parziale se non è possibile dividere il commit in ogni caso? Usare git stash suona davvero come una soluzione. – aweibell

1

git stash è l'opzione migliore, combinata con.

git add --interactive 

Ciò dovrebbe consentire di "ripristinare" (nonstage) alcuni file già aggiunti all'indice.
Quindi git stash consentirebbe di salvare quei file e ripristinarli.

(Vedere "git add --patch and --interactive" articolo per un esempio)

2

ho intenzione di assumere sei in master per tutto questo ...

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

ora avrete questo

master 
    \ 
    \--commit1--commit2 

Ora, eseguire git log e registrare gli SHA per "commit1" e "commit2".

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

che vi darà

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

E poi si può distruggere il 'qualunque' ramo

git branch -D whatever 

modificare:

Y ou potrebbe anche fare qualcosa di simile con la scorta:

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

Nel tuo primo 'git commit', non impegnerà entrambi i file attualmente in scena? Questo è quello che sto cercando di evitare, voglio un set di hunk da un file nel mio primo commit. –

Problemi correlati