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.

[[email protected] ~]$ 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.

[[email protected] ~]$ cd project/

[[email protected] 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:

[[email protected] 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.

[[email protected] project]$ git status -s
M string.c
?? string

[[email protected] project]$ git add string.c

[[email protected] 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(-)

[[email protected] 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.

[[email protected] 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:

[[email protected] 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.

[[email protected] project]$ git status -s
M string.c
?? string

[[email protected] project]$ git add string.c

[[email protected] 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.

[[email protected] 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.

[[email protected] 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.

[[email protected] 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

[[email protected] 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.

[[email protected] 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