Dato che questo è etichettato con git, spero che la mia mancanza di conoscenza SVN sia trascurabile.
Attualmente sto clonando un repository e clonare un ramo specifico usando gitk.
Stai clonando l'intero repository remoto non solo un ramo specifico.
Il repository è meglio immaginato come un database, quindi stai facendo un clone dello stato corrente del database remoto. Ma dopo ciò, stai lavorando sulla tua copia di quel database; se si commette, si modifica il database locale.
Il fetch
comando viene utilizzato per mantenere sincronizzato il database locale con quello remoto.
Di solito da quel database locale, fai il checkout di un ramo su cui lavorare. Questo non è altro che un marker interno per git, dove è iniziato il tuo lavoro attuale.
Supponiamo che tu stia lavorando su un semplice repository, dove non ci sono rami oltre master
, puoi dare un'occhiata alla .git
cartella per svelare la "magia":
Supponiamo che il tuo ultimo commit (attivo master
) sia stato 182e8220b404437b9e43eb78149d31af79040c66
, lo troverai esattamente sotto cat .git/refs/heads/master
.
Da quel ramo di un nuovo ramo git checkout -b mybranch
, troverai lo stesso puntatore nel file cat .git/refs/heads/mybranch
.
I rami non sono altro che "puntatori". Il marcatore "funzionante" si chiama a HEAD
.
Se vuoi sapere dove si HEAD
trova:
cat .git/HEAD
che dice ad esempio ref: refs/heads/mybranch
, che a sua volta indica ( cat .git/refs/heads/mybranch
) un hash di commit78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
I commit effettivi sono memorizzati nella objects
cartella (il come è un argomento a sé stante).
La cartella del progetto contiene solo il contenuto per quel ramo e non riesco a vedere tutti i rami come in SVN, il che è un po 'confuso per me.
Non confondere il working directory
"git-database" nel suo insieme. Come ho detto sopra, la tua directory di lavoro è solo un'istantanea di (forse) un sottoinsieme.
Supponi di avere rami diversi, la tua directory di lavoro è dedicata a lavorare solo su quel ramo (anche se potresti spostare il lavoro da lì altrove).
Di solito, se vuoi vedere quali rami sono definiti per il progetto, hai la possibilità di
git branch
per le filiali locali
git branch --remote
per filiali remote
git branch -a
per entrambi
(o git branch -v
)
Poiché git è un sistema di controllo della versione distribuita, non è solo possibile, ma incoraggiato, creare filiali diverse a livello locale / remoto.
Il mio flusso di lavoro tipico è:
- dirama una funzione
- diramare un ramo WIP (work in progress) da quello
- funziona come preferisci, anche se ti impegni dopo una sola riga; non importa
Quando la funzionalità è completa:
- schiaccia / rielabora il
WIP
ramo (con rebasing interattivo) = esegui un singolo commit da quello
- unisci il
WIP
ramo nel ramo delle caratteristiche e offri che (se lavori con github quell'offerta sarebbe chiamata "richiesta pull") da integrare nel ramo stabile (master).
Inoltre vorrei sapere come gestire un processo in cui ho bisogno di wprl su due rami contemporaneamente nel caso, ad esempio, ho bisogno di fare un aggiornamento rapido sul master ma mantenere anche il contenuto di un altro ramo.
Dipende da come è strutturato il tuo progetto:
Di 'che hai un maestro stabile. E le funzionalità sono sviluppate solo da quel ramo stabile, quindi di solito è dietro un ramo delle caratteristiche. Quindi avresti un ultimo commit sul master che sarebbe la radice del ramo della funzione.
Quindi effettueresti un commit sul ramo master e potresti decidere se unire entrambi i rami o rebase (che è una specie di unione per utenti con esigenze avanzate, per così dire).
Oppure sei sempre in grado di apportare modifiche ai rami (ad esempio master
) e inserirli negli altri rami.
Quali sono le convenzioni sui nomi consigliate per rendere le cartelle che includono il ramo clonato dal repository in GIT, ad esempio myproject-branchname
Spetta a voi.
In genere, si finisce con il nome del repository.
Ma ci sono occasioni in cui questo non è voluto:
ad es. clonare oh-my-zsh con git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Here .oh-my-zsh
viene esplicitamente chiamato come target.