2013-05-03 9 views
16

Mi riferisco spesso a git log --graph --decorate --oneline --all --full-history per visualizzare lo stato corrente dei miei rami, ma non mostra diramazioni/rami anonimi. C'è un modo per far apparire le teste staccate in questo grafico?C'è uno strumento per mostrare a git "teste staccate" in un grafico?

So che esiste git reflog, ma è piuttosto difficile da leggere poiché non esiste una struttura: tutto ciò che devi fare è il messaggio di commit, che può ancora essere WIP se non ho ancora finito il commit.

Un po 'di sfondo (questo non è necessario per rispondere alla domanda, ma aiuterà a spiegare la motivazione per questo): Sono un utente Mercurial e il mio flusso di lavoro coinvolge un sacco di branching anonimi. Tendo a fare uso di hg heads molto per controllare queste testine, e spesso a hg rebase per separare o combinare serie di commit in base a ciò che ha senso ai fini di una revisione del codice di facile comprensione.

Mentre mi sto abituando all'utilizzo di git, spesso mi ritrovo con le teste staccate quando, ad esempio, ho eseguito il rebase di alcuni commit da un ramo per creare un nuovo ramo. Trovare queste teste staccate è fastidioso con git reflog e, a dire il vero, è un po 'spaventoso che spariscano dal solito git log. Ho persino dimenticato i vecchi commit in questo modo, e ho dovuto estrarli dallo git reflog un giorno o due dopo. In Mercurial quei commit rimarrebbero come una testa anonima, e mi verrebbe in mente che ho bisogno di finirli.

risposta

14

Sembra che tu stia cercando di utilizzare un flusso di lavoro che non corrisponde esattamente al modo in cui funziona git.

Prima di tutto, una "testa staccata" in git non è la stessa del concetto di Mercurial di una "testa". Git ha esattamente un HEAD, che è solo il commit attualmente estratto. "Staccato" significa semplicemente che al momento non si è verificato un ramo. Pertanto, quando crei un commit, questo non verrà associato a un ramo e andrà perso quando esegui il checkout di un commit diverso.

In Git, ogni commit che ti interessa dovrebbe essere raggiungibile da qualche ramo. Non esiste un "ramo anonimo", motivo per cui Git ti avvisa quando ti impegni su una testa staccata. Impegnarsi su una testa staccata è come allocare un oggetto e poi buttare via il puntatore; è possibile, ma quasi mai quello che vuoi fare. Ricorda, i rami in git sono leggeri e possono essere effimeri. Basta creare un ramo prima di eseguire il commit in modo da poter trovare nuovamente i tuoi commit.

Detto questo, se si vuole veramente vedere la struttura del repository, tra cui commit cui si fa riferimento solo dal reflogs, è possibile utilizzare:

git log --graph --decorate $(git rev-list -g --all) 
+0

Sembra pigro, ma dovendo pensare a un il nome di un ramo in anticipo è fastidioso. Quindi devo cancellare il nome anche più avanti. Non mi sembra leggero. Mi chiedo se c'è un'estensione che manterrà i puntatori ad ogni ramo senza nome per me. Quindi potrei rinominare il ramo se decido di tenerlo, o cancellarlo se voglio lasciarlo essere GCed. – dmnd

+0

@dmnd Hai l'alfabeto latino per alleggerire la tua vita. Quando vuoi diramarti, esegui 'git checkout -b a'. Creerà un ramo chiamato 'a' che è molto simile ad un ramo anonimo perché il suo nome è assolutamente inutile. Se finisci le lettere in questo modo, stai facendo qualcosa per cui Git non è stato progettato. Forse potresti citare nella tua domanda come esattamente tieni traccia del tuo lavoro se non si nominano i rami. Stai ispezionando regolarmente i messaggi di commit? Le persone tendono anche a usare alias, quindi potresti abbreviare il precedente a 'gco -b a'. È comunque necessario utilizzare un nome univoco per un ramo. –

+2

Non sono a conoscenza di tale estensione, ma sembra semplice.Sostituisci "git commit" con uno script di shell che prima verifica se HEAD è staccato (controllando lo stato di uscita di 'git symbolic-ref HEAD') e, in tal caso, crea un nuovo ramo usando qualsiasi schema di denominazione che ti piace. – David

Problemi correlati