Git: operazione di aggiornamento
Modifica funzione esistente
Tom esegue l'operazione di clonazione e trova un nuovo file string.c. Vuole sapere chi ha aggiunto questo file al repository e per quale scopo, quindi esegue il filegit log comando.
[tom@CentOS ~]$ git clone [email protected]:project.git
Il comando precedente produrrà il seguente risultato:
Initialized empty Git repository in /home/tom/project/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
Receiving objects: 100% (6/6), 726 bytes, done.
remote: Total 6 (delta 0), reused 0 (delta 0)
L'operazione di clonazione creerà una nuova directory all'interno della directory di lavoro corrente. Cambia la directory nella directory appena creata ed esegue il filegit log comando.
[tom@CentOS ~]$ cd project/
[tom@CentOS project]$ git log
Il comando precedente produrrà il seguente risultato:
commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530
Changed return type of my_strlen to size_t
commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530
Initial commit
Dopo aver osservato il log, si rende conto che il file string.c è stato aggiunto da Jerry per implementare le operazioni di base sulle stringhe. È curioso del codice di Jerry. Quindi apre string.c nell'editor di testo e trova immediatamente un bug. Nella funzione my_strlen, Jerry non utilizza un puntatore costante. Quindi, decide di modificare il codice di Jerry. Dopo la modifica, il codice appare come segue:
[tom@CentOS project]$ git diff
Il comando precedente produrrà il seguente risultato:
diff --git a/string.c b/string.c
index 7da2992..32489eb 100644
--- a/string.c
+++ b/string.c
@@ -1,8 +1,8 @@
#include <stdio.h>
-size_t my_strlen(char *s)
+size_t my_strlen(const char *s)
{
- char *p = s;
+ const char *p = s;
while (*p)
++p;
}
Dopo il test, commette il suo cambiamento.
[tom@CentOS project]$ git status -s
M string.c
?? string
[tom@CentOS project]$ git add string.c
[tom@CentOS project]$ git commit -m 'Changed char pointer to const char pointer'
[master cea2c00] Changed char pointer to const char pointer
1 files changed, 2 insertions(+), 2 deletions(-)
[tom@CentOS project]$ git log
Il comando precedente produrrà il seguente risultato:
commit cea2c000f53ba99508c5959e3e12fff493b
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 08:32:07 2013 +0530
Changed char pointer to const char pointer
commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530
Changed return type of my_strlen to size_t
commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530
Initial commit
Tom usa il comando git push per inviare le sue modifiche.
[tom@CentOS project]$ git push origin master
Il comando precedente produrrà il seguente risultato:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 336 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
d1e19d3..cea2c00 master −> master
Aggiungi nuova funzione
Nel frattempo, Jerry decide di implementare string comparefunzionalità. Quindi modifica string.c. Dopo la modifica, il file appare come segue:
[jerry@CentOS project]$ git diff
Il comando precedente produrrà il seguente risultato:
index 7da2992..bc864ed 100644
--- a/string.c
+++ b/string.c
30Git Tutorials
@@ -9,9 +9,20 @@ size_t my_strlen(char *s)
return (p -s );
}
+char *my_strcpy(char *t, char *s)
+
{
+
char *p = t;
+
+ while (*t++ = *s++)
+ ;
+
+
return p;
+
}
+
int main(void)
{
int i;
+
char p1[32];
char *s[] =
{
"Git tutorials",
"Tutorials Point"
@@ -20,5 +31,7 @@ int main(void)
for (i = 0; i < 2; ++i)
printf("string lenght of %s = %lu\n", s[i], my_strlen(s[i]));
+
printf("%s\n", my_strcpy(p1, "Hello, World !!!"));
+
return 0;
}
}
Dopo i test, è pronto a spingere il suo cambiamento.
[jerry@CentOS project]$ git status -s
M string.c
?? string
[jerry@CentOS project]$ git add string.c
[jerry@CentOS project]$ git commit -m "Added my_strcpy function"
[master e944e5a] Added my_strcpy function
1 files changed, 13 insertions(+), 0 deletions(-)
Prima dell'operazione push, verifica il commit visualizzando i messaggi di log.
[jerry@CentOS project]$ git log
Il comando precedente produrrà il seguente risultato:
commit e944e5aab74b26e7447d3281b225309e4e59efcd
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:41:42 2013 +0530
Added my_strcpy function
commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530
Changed return type of my_strlen to size_t
commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530
Initial commit
Jerry è contento dei cambiamenti e vuole spingere i suoi cambiamenti.
[jerry@CentOS project]$ git push origin master
Il comando precedente produrrà il seguente risultato:
To [email protected]:project.git
! [rejected]
master −> master (non-fast-forward)
error: failed to push some refs to '[email protected]:project.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
Ma Git non sta permettendo a Jerry di spingere i suoi cambiamenti. Perché Git ha identificato che il repository remoto e il repository locale di Jerry non sono sincronizzati. Per questo motivo, può perdere la storia del progetto. Per evitare questo pasticcio, Git ha fallito questa operazione. Ora, Jerry deve prima aggiornare il repository locale e solo in seguito può eseguire il push delle proprie modifiche.
Recupera le ultime modifiche
Jerry esegue il comando git pull per sincronizzare il suo repository locale con quello remoto.
[jerry@CentOS project]$ git pull
Il comando precedente produrrà il seguente risultato:
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From git.server.com:project
d1e19d3..cea2c00 master −> origin/master
First, rewinding head to replay your work on top of it...
Applying: Added my_strcpy function
Dopo l'operazione di pull, Jerry controlla i messaggi di log e trova i dettagli del commit di Tom con l'ID commit cea2c000f53ba99508c5959e3e12fff493ba6f69
[jerry@CentOS project]$ git log
Il comando precedente produrrà il seguente risultato:
commit e86f0621c2a3f68190bba633a9fe6c57c94f8e4f
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:41:42 2013 +0530
Added my_strcpy function
commit cea2c000f53ba99508c5959e3e12fff493ba6f69
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 08:32:07 2013 +0530
Changed char pointer to const char pointer
commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530
Changed return type of my_strlen to size_t
commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530
Initial commit
Ora, il repository locale di Jerry è completamente sincronizzato con il repository remoto. Quindi può tranquillamente spingere le sue modifiche.
[jerry@CentOS project]$ git push origin master
Il comando precedente produrrà il seguente risultato:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 455 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
cea2c00..e86f062 master −> master