2009-09-21 19 views
75

C'è una cartella controllata git su un server su cui è stato estratto il ramo principale e un'intera pila di file è stata modificata e non impegnata. C'è un modo per me di impegnare le modifiche in un ramo separato in modo da poter tornare a una versione pulita?Git crea il ramo dal master estratto?

ie Voglio annullare tutte le modifiche apportate a queste persone, ma memorizzarle in un'altra occasione, in modo che se la persona desidera le loro modifiche, possono passare a quel ramo.

(Sì, lo so, questo non è il modo in cui git è progettato per funzionare, ma questa è la mia situazione!) Tutte le idee sono molto apprezzate.

+1

simile a . e hey, git funziona molto bene nel tuo caso, non direi che non è progettato per un tale flusso di lavoro. è! – knittl

+0

Solo per un chiarimento, mi aspetto che le modifiche non verranno mai utilizzate, ma ho bisogno di una registrazione permanente per ogni evenienza. – corydoras

risposta

132

Innanzitutto passare a un ramo diverso sede nella HEAD corrente avviene in questo modo:

git checkout -b newbranch 

commit tutte le modifiche (supponendo che non file aggiunti, altrimenti li git add):

git commit -a 

torna al ramo principale:

git checkout master 

la precedenza unco i cambiamenti di mm saranno tutti sul ramo newbranch e il master rimarrà nello stato in cui si trovava senza tali modifiche.

+5

* Spiegazione: * il contenuto del repository funzionante e le modifiche di staging non appartengono a nessun ramo. Semplice creazione di un nuovo ramo disattivato HEAD (ultima revisione) è sufficiente per il nuovo commit da eseguire appena creato ''. –

+0

Grazie ragazzi, pensavo che il passaggio a un nuovo ramo potesse cancellare le modifiche. Venendo da uno sfondo SVN non pensavo che cambiare come fosse possibile. Provarlo adesso. – corydoras

+0

Perfetto, ha fatto esattamente come te dì! Git è un po 'freddo (: – corydoras

13

È sempre possibile memorizzare le modifiche.

git stash 
git checkout -b bravenewmaster 
git stash apply 

Anche tenere a mente, che se si impegnano al ramo "sbagliato" si può sempre spostare quel ramo indietro, perché ramo non è altro che un puntatore a un commit.

+3

Perché preoccuparsi di mettere da parte se stai per riapplicare immediatamente le stesse modifiche? Potresti anche fare 'git checkout -b bravenewmaster'. È meno digitante e non toccherà inutilmente tutti i file modificati. –

+1

Beh, non ho provato, ma ho pensato che 'git' per qualsiasi motivo non lascia' git checkout -b' quando ci sono cambiamenti. Altrimenti, perché la domanda? ;-) –

+0

In realtà, per quello che posso dire "Voglio annullare in modo efficace tutte le modifiche di queste persone, ma archiviarle in un'altra possibilità, quindi se quella persona vuole le loro modifiche possono passare a quell'albo" osservazione - la memorizzazione da sola dovrebbe essere sufficiente con nessuna ramificazione e applicazione. –

13

Questo metodo è utile:

git checkout -B <new_branch> <start point> 

Dove:

  • <new_branch> è la vostra nuova filiale (ad es my_branch)
  • <start point> è la filiale di partenza (master nel tuo caso)
  • -B crea un nuovo ramo a partire da <start point>, i f già esistente, quindi resettarlo a (non fallirà come -b quando il ramo esiste già)
  • a volte -m può essere utile specificare quando si cambia ramo, questo eseguirà un'unione a tre vie tra il ramo corrente, il proprio lavoro contenuto dell'albero (utile per lo scripting).

Vedere: man git-checkout per ulteriori dettagli.

Problemi correlati