Git - Gestione delle filiali

L'operazione di filiale consente di creare un'altra linea di sviluppo. Possiamo usare questa operazione per biforcare il processo di sviluppo in due direzioni diverse. Ad esempio, abbiamo rilasciato un prodotto per la versione 6.0 e potremmo voler creare un ramo in modo che lo sviluppo delle funzionalità 7.0 possa essere tenuto separato dalle correzioni di bug 6.0.

Crea ramo

Tom crea un nuovo ramo utilizzando il comando git branch <nome ramo>. Possiamo creare un nuovo ramo da uno esistente. Possiamo usare un commit o un tag specifico come punto di partenza. Se non viene fornito alcun ID commit specifico, il ramo verrà creato con HEAD come punto di partenza.

[jerry@CentOS src]$ git branch new_branch

[jerry@CentOS src]$ git branch
* master
new_branch

Viene creato un nuovo ramo; Tom ha utilizzato il comando git branch per elencare i rami disponibili. Git mostra un asterisco prima del ramo attualmente estratto.

La rappresentazione pittorica dell'operazione di creazione del ramo è mostrata di seguito:

Passa da un ramo all'altro

Jerry usa il comando git checkout per passare da un ramo all'altro.

[jerry@CentOS src]$ git checkout new_branch
Switched to branch 'new_branch'
[jerry@CentOS src]$ git branch
master
* new_branch

Collegamento per creare e cambiare ramo

Nell'esempio sopra, abbiamo usato due comandi per creare e cambiare i rami, rispettivamente. Git fornisce–bopzione con il comando checkout; questa operazione crea un nuovo ramo e passa immediatamente al nuovo ramo.

[jerry@CentOS src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'

[jerry@CentOS src]$ git branch
master
new_branch
* test_branch

Elimina un ramo

Un ramo può essere cancellato fornendo l'opzione –D con il comando git branch. Ma prima di eliminare il ramo esistente, passa all'altro ramo.

Jerry è attualmente in test_branche vuole rimuovere quel ramo. Quindi cambia ramo ed elimina ramo come mostrato di seguito.

[jerry@CentOS src]$ git branch
master
new_branch
* test_branch

[jerry@CentOS src]$ git checkout master
Switched to branch 'master'

[jerry@CentOS src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).

Ora, Git mostrerà solo due rami.

[jerry@CentOS src]$ git branch
* master
new_branch

Rinomina un ramo

Jerry decide di aggiungere il supporto per i caratteri larghi nel suo progetto di operazioni sulle stringhe. Ha già creato un nuovo ramo, ma il nome del ramo non è appropriato. Quindi cambia il nome del ramo usando–m opzione seguita dal old branch name e il new branch name.

[jerry@CentOS src]$ git branch
* master
new_branch

[jerry@CentOS src]$ git branch -m new_branch wchar_support

Ora, il comando git branch mostrerà il nuovo nome del ramo.

[jerry@CentOS src]$ git branch
* master
wchar_support

Unisci due rami

Jerry implementa una funzione per restituire la lunghezza della stringa di una stringa di caratteri ampi. Nuovo il codice apparirà come segue:

[jerry@CentOS src]$ git branch
master
* wchar_support

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git diff

Il comando precedente produce il seguente risultato:

t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
   +
   const wchar_t *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p - s);
   +
}

Dopo il test, si impegna e invia le modifiche al nuovo ramo.

[jerry@CentOS src]$ git status -s
M string_operations.c
?? string_operations

[jerry@CentOS src]$ git add string_operations.c

[jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'

[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)

Nota che Jerry sta trasferendo queste modifiche al nuovo ramo, motivo per cui ha utilizzato il nome del ramo wchar_support invece di master ramo.

[jerry@CentOS src]$ git push origin wchar_support   <−−− Observer branch_name

Il comando precedente produrrà il seguente risultato.

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
wchar_support -> wchar_support

Dopo aver confermato le modifiche, il nuovo ramo apparirà come segue:

Tom è curioso di sapere cosa sta facendo Jerry nella sua filiale privata e controlla il registro dal wchar_support ramo.

[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src

[tom@CentOS src]$ git log origin/wchar_support -2

Il comando precedente produrrà il seguente risultato.

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string


commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Visualizzando i messaggi di commit, Tom si rende conto che Jerry ha implementato la funzione strlen per il carattere wide e desidera la stessa funzionalità nel ramo master. Invece di reimplementare, decide di prendere il codice di Jerry unendo il suo ramo con il ramo principale.

[tom@CentOS project]$ git branch
* master

[tom@CentOS project]$ pwd
/home/tom/top_repo/project

[tom@CentOS project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

Dopo l'operazione di unione, il ramo principale apparirà come segue:

Ora, il ramo wchar_supportè stato unito al ramo principale. Possiamo verificarlo visualizzando il messaggio di commit o visualizzando le modifiche apportate nel file string_operation.c.

[tom@CentOS project]$ cd src/

[tom@CentOS src]$ git log -1

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse 
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string

[tom@CentOS src]$ head -12 string_operations.c

Il comando precedente produrrà il seguente risultato.

#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

   while (*p)
      ++p;

   return (p - s);
}

Dopo il test, invia le modifiche al codice al ramo principale.

[tom@CentOS src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
5776472..64192f9 master −> master

Ribasare i rami

Il comando Git rebase è un comando di unione dei rami, ma la differenza è che modifica l'ordine dei commit.

Il comando Git merge cerca di mettere i commit di altri branch in cima all'HEAD del branch locale corrente. Ad esempio, il tuo ramo locale ha commit A−> B−> C−> D e il ramo merge ha commit A−> B−> X−> Y, quindi git merge convertirà il ramo locale corrente in qualcosa di simile A−> B−> C−> D−> X−> Y

Il comando Git rebase cerca di scoprire l'antenato comune tra il ramo locale corrente e il ramo di unione. Quindi invia i commit al ramo locale modificando l'ordine dei commit nel ramo locale corrente. Ad esempio, se il tuo ramo locale ha commit A−> B−> C−> D e il ramo merge ha commit A−> B−> X−> Y, allora Git rebase convertirà il ramo locale corrente in qualcosa come A− > B−> X−> Y−> C−> D.

Quando più sviluppatori lavorano su un singolo repository remoto, non è possibile modificare l'ordine dei commit nel repository remoto. In questa situazione, puoi usare l'operazione rebase per mettere i tuoi commit locali sopra i commit del repository remoto e puoi spingere queste modifiche.