Git - Panduan Cepat

Sistem Kontrol Versi

Version Control System (VCS) adalah perangkat lunak yang membantu pengembang perangkat lunak untuk bekerja sama dan memelihara riwayat lengkap pekerjaan mereka.

Di bawah ini adalah fungsi dari VCS -

  • Memungkinkan pengembang bekerja secara bersamaan.
  • Tidak memungkinkan menimpa perubahan satu sama lain.
  • Mempertahankan sejarah setiap versi.

Berikut adalah jenis-jenis VCS -

  • Sistem kontrol versi terpusat (CVCS).
  • Sistem kontrol versi terdistribusi / terdesentralisasi (DVCS).

Dalam bab ini, kita akan berkonsentrasi hanya pada sistem kontrol versi terdistribusi dan terutama pada Git. Git berada di bawah sistem kontrol versi terdistribusi.

Sistem Kontrol Versi Terdistribusi

Sistem kontrol versi terpusat (CVCS) menggunakan server pusat untuk menyimpan semua file dan memungkinkan kolaborasi tim. Tetapi kelemahan utama dari CVCS adalah satu-satunya titik kegagalannya, yaitu kegagalan server pusat. Sayangnya, jika server pusat mati selama satu jam, maka selama jam itu, tidak ada yang bisa berkolaborasi sama sekali. Dan bahkan dalam kasus terburuk, jika disk dari server pusat rusak dan cadangan yang tepat belum diambil, maka Anda akan kehilangan seluruh riwayat proyek. Di sini, sistem kontrol versi terdistribusi (DVCS) muncul.

Klien DVCS tidak hanya memeriksa snapshot terbaru dari direktori tetapi mereka juga mencerminkan repositori sepenuhnya. Jika server mati, maka repositori dari klien mana pun dapat disalin kembali ke server untuk memulihkannya. Setiap pembayaran adalah cadangan lengkap dari repositori. Git tidak bergantung pada server pusat dan itulah mengapa Anda dapat melakukan banyak operasi saat Anda offline. Anda dapat melakukan perubahan, membuat cabang, melihat log, dan melakukan operasi lain saat Anda offline. Anda hanya memerlukan koneksi jaringan untuk menerbitkan perubahan Anda dan mengambil perubahan terbaru.

Keuntungan dari Git

Gratis dan open source

Git dirilis di bawah lisensi open source GPL. Ini tersedia secara gratis melalui internet. Anda dapat menggunakan Git untuk mengelola proyek properti tanpa membayar sepeser pun. Karena ini adalah open source, Anda dapat mendownload kode sumbernya dan juga melakukan perubahan sesuai dengan kebutuhan Anda.

Cepat dan kecil

Karena sebagian besar operasi dilakukan secara lokal, ini memberikan keuntungan besar dalam hal kecepatan. Git tidak bergantung pada server pusat; itulah sebabnya, tidak perlu berinteraksi dengan server jarak jauh untuk setiap operasi. Bagian inti Git ditulis dalam C, yang menghindari overhead waktu proses yang terkait dengan bahasa tingkat tinggi lainnya. Meskipun Git mencerminkan seluruh repositori, ukuran data di sisi klien kecil. Ini menggambarkan efisiensi Git dalam mengompresi dan menyimpan data di sisi klien.

Cadangan implisit

Kemungkinan kehilangan data sangat jarang bila ada banyak salinannya. Data yang ada di sisi klien mana pun mencerminkan repositori, oleh karena itu dapat digunakan jika terjadi crash atau kerusakan disk.

Keamanan

Git menggunakan fungsi hash kriptografi umum yang disebut fungsi hash aman (SHA1), untuk memberi nama dan mengidentifikasi objek dalam database-nya. Setiap file dan komit adalah check-sum dan diambil oleh checksumnya pada saat checkout. Ini menyiratkan bahwa, tidak mungkin untuk mengubah file, tanggal, dan mengkomit pesan dan data lainnya dari database Git tanpa mengetahui Git.

Tidak perlu perangkat keras yang kuat

Dalam kasus CVCS, server pusat harus cukup kuat untuk melayani permintaan dari seluruh tim. Untuk tim yang lebih kecil, ini bukan masalah, tetapi seiring bertambahnya ukuran tim, batasan perangkat keras server dapat menjadi penghambat kinerja. Dalam kasus DVCS, pengembang tidak berinteraksi dengan server kecuali mereka perlu mendorong atau menarik perubahan. Semua pengangkatan berat terjadi di sisi klien, sehingga perangkat keras server bisa sangat sederhana.

Percabangan lebih mudah

CVCS menggunakan mekanisme penyalinan yang murah, Jika kita membuat cabang baru maka akan menyalin semua kodenya ke cabang baru, sehingga memakan waktu dan tidak efisien. Selain itu, penghapusan dan penggabungan cabang di CVCS rumit dan memakan waktu. Tetapi manajemen cabang dengan Git sangat sederhana. Hanya perlu beberapa detik untuk membuat, menghapus, dan menggabungkan cabang.

Terminologi DVCS

Repositori Lokal

Setiap alat VCS menyediakan tempat kerja pribadi sebagai copy pekerjaan. Pengembang membuat perubahan di tempat kerja pribadi mereka dan setelah komit, perubahan ini menjadi bagian dari repositori. Git mengambil satu langkah lebih jauh dengan memberi mereka salinan pribadi dari seluruh repositori. Pengguna dapat melakukan banyak operasi dengan repositori ini seperti menambah file, menghapus file, mengganti nama file, memindahkan file, melakukan perubahan, dan banyak lagi.

Direktori Kerja dan Area Pementasan atau Indeks

Direktori kerja adalah tempat file diperiksa. Di CVCS lain, pengembang biasanya membuat modifikasi dan mengkomit perubahan mereka langsung ke repositori. Tapi Git menggunakan strategi yang berbeda. Git tidak melacak setiap file yang dimodifikasi. Setiap kali Anda melakukan suatu operasi, Git mencari file yang ada di area staging. Hanya file yang ada di staging area yang dipertimbangkan untuk komit dan tidak semua file yang dimodifikasi.

Mari kita lihat alur kerja dasar Git.

Step 1 - Anda mengubah file dari direktori kerja.

Step 2 - Anda menambahkan file ini ke area pementasan.

Step 3- Anda melakukan operasi komit yang memindahkan file dari area pementasan. Setelah operasi push, itu menyimpan perubahan secara permanen ke repositori Git.

Misalkan Anda memodifikasi dua file, yaitu "sort.c" dan "search.c" dan Anda menginginkan dua komit yang berbeda untuk setiap operasi. Anda dapat menambahkan satu file di staging area dan melakukan commit. Setelah komit pertama, ulangi prosedur yang sama untuk file lain.

# First commit
[bash]$ git add sort.c # adds file to the staging area [bash]$ git commit –m “Added sort operation”

# Second commit
[bash]$ git add search.c # adds file to the staging area [bash]$ git commit –m “Added search operation”

Blob

Blob adalah singkatan dari Binary Large Oblelucon. Setiap versi file diwakili oleh blob. Blob menyimpan data file tetapi tidak berisi metadata apa pun tentang file tersebut. Ini adalah file biner, dan dalam database Git, ini dinamai sebagai hash SHA1 dari file itu. Di Git, file tidak dialamatkan dengan nama. Semuanya ditujukan pada konten.

Pohon

Pohon adalah sebuah objek, yang merepresentasikan sebuah direktori. Ini menampung blob serta sub-direktori lainnya. Pohon adalah file biner yang menyimpan referensi ke gumpalan dan pohon yang juga dinamai sebagaiSHA1 hash dari objek pohon.

Komit

Komit memegang status repositori saat ini. Komit juga dinamai olehSHA1hash. Anda dapat mempertimbangkan objek komit sebagai simpul dari daftar tertaut. Setiap objek komit memiliki penunjuk ke objek komit induk. Dari komit yang diberikan, Anda dapat melintasi kembali dengan melihat penunjuk induk untuk melihat riwayat komit. Jika komit memiliki beberapa komit induk, maka komit khusus itu telah dibuat dengan menggabungkan dua cabang.

Ranting

Cabang digunakan untuk membuat jalur pengembangan lain. Secara default, Git memiliki cabang master, yang sama dengan trunk di Subversion. Biasanya, cabang dibuat untuk mengerjakan fitur baru. Setelah fitur selesai, itu digabungkan kembali dengan cabang master dan kami menghapus cabang tersebut. Setiap cabang direferensikan oleh HEAD, yang menunjuk ke komit terbaru di cabang tersebut. Setiap kali Anda membuat komit, HEAD diperbarui dengan komit terbaru.

Tag

Tag memberikan nama yang bermakna dengan versi tertentu di repositori. Tag sangat mirip dengan cabang, tetapi perbedaannya adalah bahwa tag tidak dapat diubah. Artinya, tag adalah cabang, yang tidak ingin diubah oleh siapa pun. Setelah tag dibuat untuk komit tertentu, bahkan jika Anda membuat komit baru, itu tidak akan diperbarui. Biasanya, pengembang membuat tag untuk rilis produk.

Klon

Operasi klon membuat instance dari repositori. Operasi klon tidak hanya memeriksa copy pekerjaan, tetapi juga mencerminkan repositori lengkap. Pengguna dapat melakukan banyak operasi dengan repositori lokal ini. Satu-satunya saat jaringan terlibat adalah ketika instance repositori sedang disinkronkan.

Tarik

Operasi pull menyalin perubahan dari instance repositori jarak jauh ke yang lokal. Operasi tarik digunakan untuk sinkronisasi antara dua instance repositori. Ini sama dengan operasi pembaruan di Subversion.

Dorong

Operasi push menyalin perubahan dari instance repositori lokal ke yang jauh. Ini digunakan untuk menyimpan perubahan secara permanen ke dalam repositori Git. Ini sama dengan operasi komit di Subversion.

KEPALA

HEAD adalah penunjuk, yang selalu menunjuk ke komit terbaru di cabang. Setiap kali Anda membuat komit, HEAD diperbarui dengan komit terbaru. Kepala cabang disimpan di.git/refs/heads/ direktori.

[CentOS]$ ls -1 .git/refs/heads/ master [CentOS]$ cat .git/refs/heads/master
570837e7d58fa4bccd86cb575d884502188b0c49

Revisi

Revisi mewakili versi kode sumber. Revisi di Git diwakili oleh komit. Komit ini diidentifikasi olehSHA1 hash aman.

URL

URL mewakili lokasi repositori Git. Git URL disimpan dalam file config.

[tom@CentOS tom_repo]$ pwd /home/tom/tom_repo [tom@CentOS tom_repo]$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = [email protected]:project.git
fetch = +refs/heads/*:refs/remotes/origin/*

Sebelum Anda dapat menggunakan Git, Anda harus menginstal dan melakukan beberapa perubahan konfigurasi dasar. Berikut adalah langkah-langkah untuk menginstal klien Git di Ubuntu dan Centos Linux.

Pemasangan Git Client

Jika Anda menggunakan distribusi GNU / Linux dasar Debian, maka apt-get perintah akan melakukan yang dibutuhkan.

[ubuntu ~]$ sudo apt-get install git-core [sudo] password for ubuntu: [ubuntu ~]$ git --version
git version 1.8.1.2

Dan jika Anda menggunakan distribusi GNU / Linux berbasis RPM, maka gunakan yum perintah seperti yang diberikan.

[CentOS ~]$
su -
Password:

[CentOS ~]# yum -y install git-core

[CentOS ~]# git --version
git version 1.7.1

Sesuaikan Lingkungan Git

Git menyediakan alat konfigurasi git, yang memungkinkan Anda menyetel variabel konfigurasi. Git menyimpan semua konfigurasi global di.gitconfigfile, yang terletak di direktori home Anda. Untuk menyetel nilai konfigurasi ini sebagai global, tambahkan--global opsi, dan jika Anda menghilangkan --global opsi, maka konfigurasi Anda khusus untuk repositori Git saat ini.

Anda juga dapat mengatur konfigurasi seluruh sistem. Git menyimpan nilai-nilai ini di file/etc/gitconfigfile, yang berisi konfigurasi untuk setiap pengguna dan repositori di sistem. Untuk menyetel nilai-nilai ini, Anda harus memiliki hak root dan menggunakan--system pilihan.

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Mengatur nama pengguna

Informasi ini digunakan oleh Git untuk setiap komit.

[jerry@CentOS project]$ git config --global user.name "Jerry Mouse"

Mengatur id email

Informasi ini digunakan oleh Git untuk setiap komit.

[jerry@CentOS project]$ git config --global user.email "[email protected]"

Hindari menggabungkan komitmen untuk menarik

Anda menarik perubahan terbaru dari repositori jarak jauh, dan jika perubahan ini berbeda, maka secara default Git membuat komit gabungan. Kami dapat menghindari ini melalui pengaturan berikut.

jerry@CentOS project]$ git config --global branch.autosetuprebase always

Sorotan warna

Perintah berikut mengaktifkan penyorotan warna untuk Git di konsol.

[jerry@CentOS project]$ git config --global color.ui true [jerry@CentOS project]$ git config --global color.status auto

[jerry@CentOS project]$ git config --global color.branch auto

Mengatur editor default

Secara default, Git menggunakan editor default sistem, yang diambil dari variabel lingkungan VISUAL atau EDITOR. Kita dapat mengkonfigurasi yang berbeda dengan menggunakan git config.

[jerry@CentOS project]$ git config --global core.editor vim

Menyetel alat penggabung default

Git tidak menyediakan alat penggabung default untuk mengintegrasikan perubahan yang bertentangan ke dalam pohon kerja Anda. Kita dapat mengatur alat penggabung default dengan mengaktifkan pengaturan berikut.

[jerry@CentOS project]$ git config --global merge.tool vimdiff

Mendaftar pengaturan Git

Untuk memverifikasi pengaturan Git Anda dari repositori lokal, gunakan git config –list perintah seperti yang diberikan di bawah ini.

[jerry@CentOS ~]$ git config --list

Perintah di atas akan menghasilkan hasil sebagai berikut.

user.name=Jerry Mouse
[email protected]
push.default=nothing
branch.autosetuprebase=always
color.ui=true
color.status=auto
color.branch=auto
core.editor=vim
merge.tool=vimdiff

Pada bab ini, kita akan membahas siklus hidup Git. Di bab selanjutnya, kita akan membahas perintah Git untuk setiap operasi.

Alur kerja umum adalah sebagai berikut -

  • Anda mengkloning repositori Git sebagai copy pekerjaan.

  • Anda mengubah copy pekerjaan dengan menambahkan / mengedit file.

  • Jika perlu, Anda juga memperbarui copy pekerjaan dengan mengambil perubahan pengembang lain.

  • Anda meninjau perubahan sebelum berkomitmen.

  • Anda melakukan perubahan. Jika semuanya baik-baik saja, maka Anda mendorong perubahan ke repositori.

  • Setelah melakukan, jika Anda menyadari ada yang salah, maka Anda memperbaiki komit terakhir dan mendorong perubahan ke repositori.

Di bawah ini adalah representasi bergambar dari alur kerja.

Di bab ini, kita akan melihat cara membuat repositori Git jarak jauh; mulai sekarang, kami akan menyebutnya sebagai Git Server. Kami membutuhkan server Git untuk memungkinkan kolaborasi tim.

Buat Pengguna Baru

# add new group
[root@CentOS ~]# groupadd dev

# add new user
[root@CentOS ~]# useradd -G devs -d /home/gituser -m -s /bin/bash gituser

# change password
[root@CentOS ~]# passwd gituser

Perintah di atas akan menghasilkan hasil sebagai berikut.

Changing password for user gituser.
New password:
Retype new password:
passwd: all authentication token updated successfully.

Buat Repositori Telanjang

Mari kita inisialisasi repositori baru dengan menggunakan init perintah diikuti oleh --barepilihan. Ini menginisialisasi repositori tanpa direktori kerja. Secara konvensi, repositori telanjang harus dinamai sebagai.git.

[gituser@CentOS ~]$ pwd /home/gituser [gituser@CentOS ~]$ mkdir project.git

[gituser@CentOS ~]$ cd project.git/ [gituser@CentOS project.git]$ ls

[gituser@CentOS project.git]$ git --bare init Initialized empty Git repository in /home/gituser-m/project.git/ [gituser@CentOS project.git]$ ls
branches config description HEAD hooks info objects refs

Hasilkan Pasangan Kunci RSA Publik / Pribadi

Mari kita telusuri proses mengkonfigurasi server Git, ssh-keygen utilitas menghasilkan pasangan kunci RSA publik / pribadi, yang akan kita gunakan untuk otentikasi pengguna.

Buka terminal dan masukkan perintah berikut dan cukup tekan enter untuk setiap input. Setelah berhasil diselesaikan, itu akan membuat file.ssh direktori di dalam direktori home.

tom@CentOS ~]$ pwd /home/tom [tom@CentOS ~]$ ssh-keygen

Perintah di atas akan menghasilkan hasil sebagai berikut.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/tom/.ssh/id_rsa): Press Enter Only
Created directory '/home/tom/.ssh'.
Enter passphrase (empty for no passphrase): ---------------> Press Enter Only
Enter same passphrase again: ------------------------------> Press Enter Only
Your identification has been saved in /home/tom/.ssh/id_rsa.
Your public key has been saved in /home/tom/.ssh/id_rsa.pub.
The key fingerprint is:
df:93:8c:a1:b8:b7:67:69:3a:1f:65:e8:0e:e9:25:a1 tom@CentOS
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
|
.
|
| Soo |
| o*B. |
| E = *.= |
| oo==. . |
| ..+Oo
|
+-----------------+

ssh-keygen telah menghasilkan dua kunci, yang pertama adalah pribadi (mis., id_rsa) dan yang kedua adalah publik (mis., id_rsa.pub).

Note: Jangan pernah membagikan KUNCI PRIBADI Anda dengan orang lain.

Menambahkan Kunci ke authorized_keys

Misalkan ada dua developer yang mengerjakan sebuah proyek, yaitu Tom and Jerry. Kedua pengguna telah membuat kunci publik. Mari kita lihat bagaimana menggunakan kunci ini untuk otentikasi.

Tom menambahkan kunci publiknya ke server dengan menggunakan ssh-copy-id perintah seperti yang diberikan di bawah ini -

[tom@CentOS ~]$ pwd /home/tom [tom@CentOS ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

Perintah di atas akan menghasilkan hasil sebagai berikut.

[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

Demikian pula, Jerry menambahkan kunci publiknya ke server dengan menggunakan perintah ssh-copy-id.

[jerry@CentOS ~]$ pwd /home/jerry [jerry@CentOS ~]$ ssh-copy-id -i ~/.ssh/id_rsa [email protected]

Perintah di atas akan menghasilkan hasil sebagai berikut.

[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

Dorong Perubahan ke Repositori

Kami telah membuat repositori kosong di server dan mengizinkan akses untuk dua pengguna. Mulai sekarang, Tom and Jerry dapat memasukkan perubahan mereka ke repositori dengan menambahkannya sebagai remote.

Perintah Git init membuat .git direktori untuk menyimpan metadata tentang repositori setiap kali ia membaca konfigurasi dari .git/config mengajukan.

Tom membuat direktori baru, menambahkan file README, dan melakukan perubahannya sebagai komit awal. Setelah komit, dia memverifikasi pesan komit dengan menjalankangit log perintah.

[tom@CentOS ~]$ pwd /home/tom [tom@CentOS ~]$ mkdir tom_repo

[tom@CentOS ~]$ cd tom_repo/ [tom@CentOS tom_repo]$ git init
Initialized empty Git repository in /home/tom/tom_repo/.git/

[tom@CentOS tom_repo]$ echo 'TODO: Add contents for README' > README [tom@CentOS tom_repo]$ git status -s
?? README

[tom@CentOS tom_repo]$ git add . [tom@CentOS tom_repo]$ git status -s
A README

[tom@CentOS tom_repo]$ git commit -m 'Initial commit'

Perintah di atas akan menghasilkan hasil sebagai berikut.

[master (root-commit) 19ae206] Initial commit
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 README

Tom memeriksa pesan log dengan menjalankan perintah git log.

[tom@CentOS tom_repo]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut.

commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Tom melakukan perubahannya ke repositori lokal. Sekarang, saatnya untuk mendorong perubahan ke repositori jarak jauh. Tetapi sebelum itu, kita harus menambahkan repositori sebagai remote, ini adalah operasi satu kali. Setelah ini, dia dapat dengan aman mendorong perubahan ke repositori jarak jauh.

Note- Secara default, Git hanya mendorong ke cabang yang cocok: Untuk setiap cabang yang ada di sisi lokal, sisi jarak jauh diperbarui jika cabang dengan nama yang sama sudah ada di sana. Dalam tutorial kami, setiap kali kami mendorong perubahan keorigin master cabang, gunakan nama cabang yang sesuai dengan kebutuhan Anda.

[tom@CentOS tom_repo]$ git remote add origin [email protected]:project.git [tom@CentOS tom_repo]$ git push origin master

Perintah di atas akan menghasilkan hasil sebagai berikut.

Counting objects: 3, done.
Writing objects: 100% (3/3), 242 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
master −> master

Sekarang, perubahan berhasil dilakukan ke repositori jarak jauh.

Kami memiliki repositori kosong di server Git dan Tom juga mendorong versi pertamanya. Sekarang, Jerry dapat melihat perubahannya. Operasi Clone membuat instance dari repositori jarak jauh.

Jerry membuat direktori baru di direktori rumahnya dan melakukan operasi klon.

[jerry@CentOS ~]$ mkdir jerry_repo [jerry@CentOS ~]$ cd jerry_repo/

[jerry@CentOS jerry_repo]$ git clone [email protected]:project.git

Perintah di atas akan menghasilkan hasil sebagai berikut.

Initialized empty Git repository in /home/jerry/jerry_repo/project/.git/
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), 241 bytes, done.
remote: Total 3 (delta 0), reused 0 (delta 0)

Jerry mengubah direktori menjadi repositori lokal baru dan mencantumkan isi direktorinya.

[jerry@CentOS jerry_repo]$ cd project/

[jerry@CentOS jerry_repo]$ ls
README

Jerry mengkloning repositori dan memutuskan untuk mengimplementasikan operasi string dasar. Jadi dia membuat file string.c. Setelah menambahkan konten, string.c akan terlihat seperti berikut -

#include <stdio.h>

int my_strlen(char *s)
{
   char *p = s;

   while (*p)
      ++p;

   return (p - s);
}

int main(void)
{
   int i;
   char *s[] = 
   {
      "Git tutorials",
      "Tutorials Point"
   };

   for (i = 0; i < 2; ++i)
      
   printf("string lenght of %s = %d\n", s[i], my_strlen(s[i]));

   return 0;
}

Dia menyusun dan menguji kodenya dan semuanya bekerja dengan baik. Sekarang, dia dapat dengan aman menambahkan perubahan ini ke repositori.

Operasi penambahan Git menambahkan file ke area pementasan.

[jerry@CentOS project]$ git status -s
?? string
?? string.c

[jerry@CentOS project]$ git add string.c

Git menunjukkan tanda tanya sebelum nama file. Jelasnya, file-file ini bukan bagian dari Git, dan itulah sebabnya Git tidak tahu apa yang harus dilakukan dengan file-file ini. Itulah sebabnya, Git menampilkan tanda tanya sebelum nama file.

Jerry telah menambahkan file ke area simpanan, perintah git status akan menampilkan file yang ada di area pementasan.

[jerry@CentOS project]$ git status -s
A string.c
?? string

Untuk melakukan perubahan, dia menggunakan perintah git commit diikuti dengan opsi –m. Jika kita menghilangkan opsi –m. Git akan membuka editor teks di mana kita dapat menulis pesan komit multiline.

[jerry@CentOS project]$ git commit -m 'Implemented my_strlen function'

Perintah di atas akan menghasilkan hasil sebagai berikut -

[master cbe1249] Implemented my_strlen function
1 files changed, 24 insertions(+), 0 deletions(-)
create mode 100644 string.c

Setelah berkomitmen untuk melihat detail log, dia menjalankan perintah git log. Ini akan menampilkan informasi dari semua komit dengan ID komit mereka, penulis komit, tanggal komit danSHA-1 hash dari komit.

[jerry@CentOS project]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut -

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Implemented my_strlen function


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Setelah melihat detail komit, Jerry menyadari bahwa panjang string tidak boleh negatif, itulah mengapa dia memutuskan untuk mengubah jenis kembalian fungsi my_strlen.

Jerry menggunakan git log perintah untuk melihat detail log.

[jerry@CentOS project]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut.

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Implemented my_strlen function

Jerry menggunakan git showperintah untuk melihat detail komit. Perintah git show mengambilSHA-1 komit ID sebagai parameter.

[jerry@CentOS project]$ git show cbe1249b140dad24b2c35b15cc7e26a6f02d2277

Perintah di atas akan menghasilkan hasil sebagai berikut -

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Implemented my_strlen function


diff --git a/string.c b/string.c
new file mode 100644
index 0000000..187afb9
--- /dev/null
+++ b/string.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+
+int my_strlen(char *s)
+{
   +
   char *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p -s );
   +
}
+

Dia mengubah tipe kembalian fungsi dari int menjadi size_t. Setelah menguji kode, dia meninjau perubahannya dengan menjalankangit diff perintah.

[jerry@CentOS project]$ git diff

Perintah di atas akan menghasilkan hasil sebagai berikut -

diff --git a/string.c b/string.c
index 187afb9..7da2992 100644
--- a/string.c
+++ b/string.c
@@ -1,6 +1,6 @@
#include <stdio.h>

-int my_strlen(char *s)
+size_t my_strlen(char *s)
{
   char *p = s;
   @@ -18,7 +18,7 @@ int main(void)
};
for (i = 0; i < 2; ++i)
{
   - printf("string lenght of %s = %d\n", s[i], my_strlen(s[i]));
   + printf("string lenght of %s = %lu\n", s[i], my_strlen(s[i]));
   return 0;
}

Git diff menunjukkan '+' tanda sebelum baris, yang baru ditambahkan dan '−' untuk baris yang dihapus.

Jerry telah melakukan perubahan dan dia ingin mengoreksi komitmen terakhirnya. Pada kasus ini,git amendoperasi akan membantu. Operasi ubah mengubah komit terakhir termasuk pesan komit Anda; itu membuat ID komit baru.

Sebelum operasi amandemen, dia memeriksa log komit.

[jerry@CentOS project]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut.

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Implemented my_strlen function


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Jerry melakukan perubahan baru dengan - mengubah operasi dan melihat log komit.

[jerry@CentOS project]$ git status -s M string.c ?? string [jerry@CentOS project]$ git add string.c

[jerry@CentOS project]$ git status -s M string.c ?? string [jerry@CentOS project]$ git commit --amend -m 'Changed return type of my_strlen to size_t'
[master d1e19d3] Changed return type of my_strlen to size_t
1 files changed, 24 insertions(+), 0 deletions(-)
create mode 100644 string.c

Sekarang, git log akan menampilkan pesan komit baru dengan ID komit baru -

[jerry@CentOS project]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut.

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 memodifikasi komit terakhirnya dengan menggunakan operasi amandemen dan dia siap untuk mendorong perubahan. Operasi Push menyimpan data secara permanen ke repositori Git. Setelah operasi push berhasil, pengembang lain dapat melihat perubahan Jerry.

Dia menjalankan perintah git log untuk melihat detail komit.

[jerry@CentOS project]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut:

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

Sebelum operasi push, dia ingin meninjau perubahannya, jadi dia menggunakan git show perintah untuk meninjau perubahannya.

[jerry@CentOS project]$ git show d1e19d316224cddc437e3ed34ec3c931ad803958

Perintah di atas akan menghasilkan hasil sebagai berikut:

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

diff --git a/string.c b/string.c
new file mode 100644
index 0000000..7da2992
--- /dev/null
+++ b/string.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+
+size_t my_strlen(char *s)
+
{
   +
   char *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p -s );
   +
}
+
+int main(void)
+
{
   + int i;
   + char *s[] = 
   {
      + "Git tutorials",
      + "Tutorials Point"
      +
   };
   +
   +
   +
   for (i = 0; i < 2; ++i)
   printf("string lenght of %s = %lu\n", s[i], my_strlen(s[i]));
   +
   +
   return 0;
   +
}

Jerry senang dengan perubahannya dan dia siap untuk mendorong perubahannya.

[jerry@CentOS project]$ git push origin master

Perintah di atas akan menghasilkan hasil sebagai berikut:

Counting objects: 4, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 517 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
19ae206..d1e19d3 master −> master

Perubahan Jerry telah berhasil didorong ke repositori; sekarang pengembang lain dapat melihat perubahannya dengan melakukan operasi klon atau pembaruan.

Ubah Fungsi yang Ada

Tom melakukan operasi klon dan menemukan file string baru. C. Dia ingin tahu siapa yang menambahkan file ini ke repositori dan untuk tujuan apa, jadi, dia mengeksekusi filegit log perintah.

[tom@CentOS ~]$ git clone [email protected]:project.git

Perintah di atas akan menghasilkan hasil sebagai berikut -

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)

Operasi Clone akan membuat direktori baru di dalam direktori kerja saat ini. Dia mengubah direktori ke direktori yang baru dibuat dan menjalankan filegit log perintah.

[tom@CentOS ~]$ cd project/

[tom@CentOS project]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut -

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

Setelah mengamati log, dia menyadari bahwa file string.c telah ditambahkan oleh Jerry untuk mengimplementasikan operasi string dasar. Dia penasaran dengan kode Jerry. Jadi dia membuka string.c di editor teks dan segera menemukan bug. Dalam fungsi my_strlen, Jerry tidak menggunakan penunjuk konstan. Jadi, dia memutuskan untuk mengubah kode Jerry. Setelah modifikasi, kodenya terlihat sebagai berikut -

[tom@CentOS project]$ git diff

Perintah di atas akan menghasilkan hasil sebagai berikut -

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;
}

Setelah pengujian, dia melakukan perubahannya.

[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

Perintah di atas akan menghasilkan hasil sebagai berikut -

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 menggunakan perintah git push untuk mendorong perubahannya.

[tom@CentOS project]$ git push origin master

Perintah di atas akan menghasilkan hasil sebagai berikut -

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

Tambahkan Fungsi Baru

Sementara itu, Jerry memutuskan untuk menerapkannya string compareKegunaan. Jadi dia memodifikasi string.c. Setelah modifikasi, file tersebut terlihat seperti berikut -

[jerry@CentOS project]$ git diff

Perintah di atas akan menghasilkan hasil sebagai berikut -

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;
   }
}

Setelah pengujian, dia siap untuk mendorong kembaliannya.

[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(-)

Sebelum operasi push, dia memverifikasi komit dengan melihat pesan log.

[jerry@CentOS project]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut -

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 senang dengan perubahan tersebut dan dia ingin mendorong perubahannya.

[jerry@CentOS project]$ git push origin master

Perintah di atas akan menghasilkan hasil sebagai berikut -

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.

Tapi Git tidak mengizinkan Jerry untuk memaksakan perubahannya. Karena Git mengidentifikasi bahwa repositori jarak jauh dan repositori lokal Jerry tidak sinkron. Karena itu, dia bisa kehilangan sejarah proyek tersebut. Untuk menghindari kekacauan ini, Git gagal dalam operasi ini. Sekarang, Jerry harus memperbarui repositori lokal terlebih dahulu dan baru setelah itu, dia dapat menerapkan perubahannya sendiri.

Ambil Perubahan Terbaru

Jerry menjalankan perintah git pull untuk menyinkronkan repositori lokalnya dengan yang jauh.

[jerry@CentOS project]$ git pull

Perintah di atas akan menghasilkan hasil sebagai berikut -

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

Setelah operasi penarikan, Jerry memeriksa pesan log dan menemukan detail komit Tom dengan ID komit cea2c000f53ba99508c5959e3e12fff493ba6f69

[jerry@CentOS project]$ git log

Perintah di atas akan menghasilkan hasil sebagai berikut -

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

Sekarang, repositori lokal Jerry sepenuhnya tersinkronisasi dengan repositori jarak jauh. Jadi dia bisa dengan aman mendorong perubahannya.

[jerry@CentOS project]$ git push origin master

Perintah di atas akan menghasilkan hasil sebagai berikut -

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

Misalkan Anda menerapkan fitur baru untuk produk Anda. Kode Anda sedang diproses dan tiba-tiba eskalasi pelanggan datang. Karena itu, Anda harus mengesampingkan fitur baru Anda untuk bekerja selama beberapa jam. Anda tidak dapat menggunakan kode parsial Anda dan juga tidak dapat membuang perubahan Anda. Jadi, Anda memerlukan beberapa ruang sementara, tempat Anda dapat menyimpan perubahan parsial dan kemudian mengkomitnya.

Di Git, operasi simpanan mengambil file terlacak Anda yang dimodifikasi, tahapan perubahan, dan menyimpannya di tumpukan perubahan yang belum selesai yang dapat Anda ajukan kembali kapan saja.

[jerry@CentOS project]$ git status -s
M string.c
?? string

Sekarang, Anda ingin beralih cabang untuk eskalasi pelanggan, tetapi Anda tidak ingin melakukan apa yang telah Anda kerjakan; jadi Anda akan menyembunyikan perubahan. Untuk mendorong simpanan baru ke tumpukan Anda, jalankangit stash perintah.

[jerry@CentOS project]$ git stash
Saved working directory and index state WIP on master: e86f062 Added my_strcpy function
HEAD is now at e86f062 Added my_strcpy function

Sekarang, direktori kerja Anda bersih dan semua perubahan disimpan di tumpukan. Mari kita verifikasi dengangit status perintah.

[jerry@CentOS project]$ git status -s
?? string

Sekarang Anda dapat dengan aman berpindah cabang dan bekerja di tempat lain. Kami dapat melihat daftar perubahan yang disimpan dengan menggunakangit stash list perintah.

[jerry@CentOS project]$ git stash list
stash@{0}: WIP on master: e86f062 Added my_strcpy function

Misalkan Anda telah menyelesaikan eskalasi pelanggan dan Anda kembali ke fitur baru mencari kode setengah jadi, cukup jalankan git stash pop perintah, untuk menghapus perubahan dari tumpukan dan menempatkannya di direktori kerja saat ini.

[jerry@CentOS project]$ git status -s ?? string [jerry@CentOS project]$ git stash pop

Perintah di atas akan menghasilkan hasil sebagai berikut:

# On branch master
# Changed but not updated:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
#
modified: string.c
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
#
string
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (36f79dfedae4ac20e2e8558830154bd6315e72d4)

[jerry@CentOS project]$ git status -s
M string.c
?? string

Seperti namanya, operasi pemindahan memindahkan direktori atau file dari satu lokasi ke lokasi lain. Tom memutuskan untuk memindahkan kode sumber kesrcdirektori. Struktur direktori yang dimodifikasi akan muncul sebagai berikut -

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

[tom@CentOS project]$ ls README string string.c [tom@CentOS project]$ mkdir src

[tom@CentOS project]$ git mv string.c src/ [tom@CentOS project]$ git status -s
R string.c −> src/string.c
?? string

Untuk membuat perubahan ini permanen, kita harus mendorong struktur direktori yang dimodifikasi ke repositori jarak jauh sehingga pengembang lain dapat melihatnya.

[tom@CentOS project]$ git commit -m "Modified directory structure" [master 7d9ea97] Modified directory structure 1 files changed, 0 insertions(+), 0 deletions(-) rename string.c => src/string.c (100%) [tom@CentOS project]$ git push origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 320 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
e86f062..7d9ea97 master −> master

Di repositori lokal Jerry, sebelum operasi penarikan, ini akan menampilkan struktur direktori lama.

[jerry@CentOS project]$ pwd /home/jerry/jerry_repo/project [jerry@CentOS project]$ ls
README string string.c

Tetapi setelah operasi penarikan, struktur direktori akan diperbarui. Sekarang, Jerry bisa melihatsrc direktori dan file yang ada di dalam direktori itu.

[jerry@CentOS project]$ git pull remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From git.server.com:project e86f062..7d9ea97 master −> origin/master First, rewinding head to replay your work on top of it... Fast-forwarded master to 7d9ea97683da90bcdb87c28ec9b4f64160673c8a. [jerry@CentOS project]$ ls
README src string

[jerry@CentOS project]$ ls src/
string.c

Sampai sekarang, baik Tom dan Jerry menggunakan perintah manual untuk menyusun proyek mereka. Sekarang, Jerry memutuskan untuk membuat Makefile untuk proyek mereka dan juga memberikan nama yang tepat untuk file "string.c".

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

[jerry@CentOS project]$ ls README src [jerry@CentOS project]$ cd src/

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

[jerry@CentOS src]$ git status -s
A Makefile
R string.c −> string_operations.c

Git sedang ditampilkan R sebelum nama file untuk menunjukkan bahwa file telah diubah namanya.

Untuk operasi komit, Jerry menggunakan -a flag, yang membuat git komit secara otomatis mendeteksi file yang dimodifikasi.

[jerry@CentOS src]$ git commit -a -m 'Added Makefile and renamed strings.c to
string_operations.c '

[master 94f7b26] Added Makefile and renamed strings.c to string_operations.c
1 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 src/Makefile
rename src/{string.c => string_operations.c} (100%)

Setelah komit, dia mendorong perubahannya ke repositori.

[jerry@CentOS src]$ git push origin master

Perintah di atas akan menghasilkan hasil sebagai berikut -

Counting objects: 6, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 396 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
7d9ea97..94f7b26 master −> master

Sekarang, pengembang lain dapat melihat modifikasi ini dengan memperbarui repositori lokalnya.

Tom memperbarui repositori lokalnya dan menemukan biner terkompilasi di file srcdirektori. Setelah melihat pesan komit, dia menyadari bahwa biner yang dikompilasi telah ditambahkan oleh Jerry.

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

[tom@CentOS src]$ ls Makefile string_operations string_operations.c [tom@CentOS src]$ file string_operations
string_operations: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses
shared libs), for GNU/Linux 2.6.18, not stripped

[tom@CentOS src]$ git log
commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary

VCS digunakan untuk menyimpan kode sumber saja dan bukan biner yang dapat dieksekusi. Jadi, Tom memutuskan untuk menghapus file ini dari repositori. Untuk operasi lebih lanjut, dia menggunakangit rm perintah.

[tom@CentOS src]$ ls
Makefile string_operations string_operations.c

[tom@CentOS src]$ git rm string_operations rm 'src/string_operations' [tom@CentOS src]$ git commit -a -m "Removed executable binary"

[master 5776472] Removed executable binary
1 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100755 src/string_operations

Setelah komit, dia mendorong perubahannya ke repositori.

[tom@CentOS src]$ git push origin master

Perintah di atas akan menghasilkan hasil sebagai berikut.

Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 310 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
29af9d4..5776472 master −> master

Untuk berbuat salah adalah manusia. Jadi setiap VCS menyediakan fitur untuk memperbaiki kesalahan hingga suatu titik tertentu. Git menyediakan fitur yang bisa kita gunakan untuk membatalkan modifikasi yang telah dilakukan pada repositori lokal.

Misalkan pengguna secara tidak sengaja melakukan beberapa perubahan pada repositori lokalnya dan kemudian ingin membatalkan perubahan ini. Dalam kasus seperti itu, filerevert operasi memainkan peran penting.

Kembalikan Perubahan yang Belum Dilakukan

Mari kita anggap Jerry secara tidak sengaja memodifikasi file dari repositori lokalnya. Tapi dia ingin membatalkan modifikasinya. Untuk menangani situasi ini, kita dapat menggunakangit checkoutperintah. Kita dapat menggunakan perintah ini untuk mengembalikan konten file.

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

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

[jerry@CentOS src]$ git status –s

Selanjutnya, kita bisa menggunakan git checkoutperintah untuk mendapatkan file yang dihapus dari repositori lokal. Misalkan Tom menghapus file dari repositori lokal dan kami ingin file ini kembali. Kami dapat mencapai ini dengan menggunakan perintah yang sama.

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

[tom@CentOS src]$ ls -1 Makefile string_operations.c [tom@CentOS src]$ rm string_operations.c

[tom@CentOS src]$ ls -1 Makefile [tom@CentOS src]$ git status -s
D string_operations.c

Git menunjukkan surat itu Dsebelum nama file. Ini menunjukkan bahwa file tersebut telah dihapus dari repositori lokal.

[tom@CentOS src]$ git checkout string_operations.c [tom@CentOS src]$ ls -1
Makefile
string_operations.c

[tom@CentOS src]$ git status -s

Note - Kami dapat melakukan semua operasi ini sebelum berkomitmen.

Hapus Perubahan dari Staging Area

Kita telah melihat bahwa ketika kita melakukan operasi penambahan, file dipindahkan dari repositori lokal ke area status. Jika pengguna secara tidak sengaja mengubah file dan menambahkannya ke dalam staging area, dia dapat mengembalikan perubahannya, dengan menggunakangit checkout perintah.

Di Git, ada satu penunjuk HEAD yang selalu menunjuk ke komit terbaru. Jika Anda ingin membatalkan perubahan dari staged area, Anda dapat menggunakan perintah git checkout, tetapi dengan perintah checkout, Anda harus memberikan parameter tambahan, yaitu penunjuk HEAD. Parameter penunjuk komit tambahan menginstruksikan perintah git checkout untuk mengatur ulang pohon kerja dan juga untuk menghapus perubahan bertahap.

Mari kita anggap Tom memodifikasi file dari repositori lokalnya. Jika kita melihat status dari file ini, maka akan terlihat bahwa file tersebut telah dimodifikasi tetapi tidak ditambahkan ke dalam staging area.

tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
# Unmodified file

[tom@CentOS src]$ git status -s # Modify file and view it’s status. [tom@CentOS src]$ git status -s
M string_operations.c

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

Status Git menunjukkan bahwa file ada di area pementasan, sekarang kembalikan dengan menggunakan perintah git checkout dan lihat status dari file yang dikembalikan.

[tom@CentOS src]$ git checkout HEAD -- string_operations.c

[tom@CentOS src]$ git status -s

Pindahkan Pointer HEAD dengan Git Reset

Setelah melakukan beberapa perubahan, Anda dapat memutuskan untuk menghapus perubahan ini. Perintah Git reset digunakan untuk mengatur ulang atau mengembalikan perubahan. Kami dapat melakukan tiga jenis operasi reset.

Diagram di bawah ini menunjukkan representasi bergambar dari perintah reset Git.

Lembut

Setiap cabang memiliki penunjuk HEAD, yang menunjuk ke komit terbaru. Jika kita menggunakan perintah reset Git dengan opsi --soft diikuti oleh ID komit, maka itu akan mengatur ulang penunjuk HEAD hanya tanpa merusak apa pun.

.git/refs/heads/masterfile menyimpan ID komit dari penunjuk HEAD. Kami dapat memverifikasinya dengan menggunakangit log -1 perintah.

[jerry@CentOS project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1

Sekarang, lihat ID komit terbaru, yang akan cocok dengan ID komit di atas.

[jerry@CentOS project]$ git log -2

Perintah di atas akan menghasilkan hasil sebagai berikut.

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

Removed executable binary


commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary

Mari kita setel ulang penunjuk HEAD.

[jerry@CentOS project]$ git reset --soft HEAD~

Sekarang, kita hanya mengatur ulang penunjuk HEAD kembali dengan satu posisi. Mari kita periksa isi dari.git/refs/heads/master file.

[jerry@CentOS project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62

ID Komit dari file diubah, sekarang verifikasi dengan melihat pesan komit.

jerry@CentOS project]$ git log -2

Perintah di atas akan menghasilkan hasil sebagai berikut.

commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary


commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:08:01 2013 +0530

Added Makefile and renamed strings.c to string_operations.c

Campuran

Git reset dengan opsi --mixed mengembalikan perubahan tersebut dari staging area yang belum dilakukan. Ini mengembalikan perubahan dari area pementasan saja. Perubahan aktual yang dibuat pada copy pekerjaan file tidak terpengaruh. Git reset default setara dengan git reset - mixed.

keras

Jika Anda menggunakan opsi --hard dengan perintah Git reset, ini akan menghapus area pementasan; itu akan mengatur ulang penunjuk HEAD ke komit terbaru dari ID komit tertentu dan menghapus perubahan file lokal juga.

Mari kita periksa ID komit.

[jerry@CentOS src]$ pwd /home/jerry/jerry_repo/project/src [jerry@CentOS src]$ git log -1

Perintah di atas akan menghasilkan hasil sebagai berikut.

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

Removed executable binary

Jerry memodifikasi file dengan menambahkan komentar satu baris di awal file.

[jerry@CentOS src]$ head -2 string_operations.c
/* This line be removed by git reset operation */
#include <stdio.h>

Dia memverifikasinya dengan menggunakan perintah git status.

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

Jerry menambahkan file yang dimodifikasi ke staging area dan memverifikasinya dengan perintah git status.

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

Perintah di atas akan menghasilkan hasil sebagai berikut.

# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
#
modified: string_operations.c
#

Status Git menunjukkan bahwa file tersebut ada di area pementasan. Sekarang, setel ulang HEAD dengan - opsi keras.

[jerry@CentOS src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1

HEAD is now at 5776472 Removed executable binary

Perintah reset git berhasil, yang akan mengembalikan file dari area pementasan serta menghapus semua perubahan lokal yang dibuat pada file.

[jerry@CentOS src]$ git status -s

Status Git menunjukkan bahwa file telah dikembalikan dari area pementasan.

[jerry@CentOS src]$ head -2 string_operations.c
#include <stdio.h>

Perintah head juga menunjukkan bahwa operasi reset juga menghapus perubahan lokal.

Operasi tag memungkinkan pemberian nama yang bermakna ke versi tertentu di repositori. Misalkan Tom dan Jerry memutuskan untuk menandai kode proyek mereka sehingga mereka nanti dapat mengaksesnya dengan mudah.

Buat Tag

Mari kita menandai HEAD saat ini dengan menggunakan git tagperintah. Tom memberikan nama tag dengan opsi -a dan memberikan pesan tag dengan opsi –m.

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

[tom@CentOS project]$ git tag -a 'Release_1_0' -m 'Tagged basic string operation code' HEAD

Jika Anda ingin menandai komit tertentu, gunakan ID COMMIT yang sesuai sebagai ganti penunjuk HEAD. Tom menggunakan perintah berikut untuk mendorong tag ke dalam repositori jarak jauh.

[tom@CentOS project]$ git push origin tag Release_1_0

Perintah di atas akan menghasilkan hasil sebagai berikut -

Counting objects: 1, done.
Writing objects: 100% (1/1), 183 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
* [new tag]
Release_1_0 −> Release_1_0

Lihat Tag

Tom membuat tag. Sekarang, Jerry dapat melihat semua tag yang tersedia dengan menggunakan perintah Git tag dengan opsi –l.

[jerry@CentOS src]$ pwd /home/jerry/jerry_repo/project/src [jerry@CentOS src]$ git pull
remote: Counting objects: 1, done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (1/1), done.
From git.server.com:project
* [new tag]
Release_1_0 −> Release_1_0
Current branch master is up to date.

[jerry@CentOS src]$ git tag -l
Release_1_0

Jerry menggunakan perintah Git show diikuti dengan nama tagnya untuk melihat detail lebih lanjut tentang tag.

[jerry@CentOS src]$ git show Release_1_0

Perintah di atas akan menghasilkan hasil sebagai berikut -

tag Release_1_0
Tagger: Tom Cat <[email protected]>
Date: Wed Sep 11 13:45:54 2013 +0530

Tagged basic string operation code


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

Removed executable binary

diff --git a/src/string_operations b/src/string_operations
deleted file mode 100755
index 654004b..0000000
Binary files a/src/string_operations and /dev/null differ

Hapus Tag

Tom menggunakan perintah berikut untuk menghapus tag dari lokal serta repositori jarak jauh.

[tom@CentOS project]$ git tag Release_1_0 [tom@CentOS project]$ git tag -d Release_1_0
Deleted tag 'Release_1_0' (was 0f81ff4)
# Remove tag from remote repository.

[tom@CentOS project]$ git push origin :Release_1_0
To [email protected]:project.git
- [deleted]
Release_1_0

Patch adalah file teks, yang isinya mirip dengan Git diff, tetapi bersama dengan kode, ia juga memiliki metadata tentang komit; misalnya, ID komit, tanggal, komit pesan, dll. Kita bisa membuat tambalan dari komit dan orang lain bisa menerapkannya ke repositori mereka.

Jerry mengimplementasikan fungsi strcat untuk proyeknya. Jerry dapat membuat jalur kodenya dan mengirimkannya ke Tom. Kemudian, dia dapat menerapkan patch yang diterima ke kodenya.

Jerry menggunakan Git format-patchperintah untuk membuat tambalan untuk komit terbaru. Jika Anda ingin membuat tambalan untuk komit tertentu, gunakanCOMMIT_ID dengan perintah format-patch.

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

[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 my_strcat function" [master b4c7f09] Added my_strcat function 1 files changed, 13 insertions(+), 0 deletions(-) [jerry@CentOS src]$ git format-patch -1
0001-Added-my_strcat-function.patch

Perintah di atas membuat .patchfile di dalam direktori kerja saat ini. Tom dapat menggunakan tambalan ini untuk mengubah file-nya. Git menyediakan dua perintah untuk menerapkan tambalangit amdan git apply, masing-masing. Git apply memodifikasi file lokal tanpa membuat komit, sementara git am memodifikasi file dan membuat komit juga.

Untuk menerapkan patch dan membuat komit, gunakan perintah berikut -

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

[tom@CentOS src]$ git status –s [tom@CentOS src]$ git apply 0001-Added-my_strcat-function.patch

[tom@CentOS src]$ git status -s
M string_operations.c
?? 0001-Added-my_strcat-function.patch

Tambalan berhasil diterapkan, sekarang kita dapat melihat modifikasi dengan menggunakan git diff perintah.

[tom@CentOS src]$ git diff

Perintah di atas akan menghasilkan hasil sebagai berikut -

diff --git a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..f282fcf 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,5 +1,16 @@
#include <stdio.h>
+char *my_strcat(char *t, char *s)
diff --git a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..f282fcf 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,5 +1,16 @@
#include <stdio.h>
+char *my_strcat(char *t, char *s)
+
{
   +
   char *p = t;
   +
   +
   +
   while (*p)
   ++p;
   +
   while (*p++ = *s++)
   + ;
   + return t;
   +
}
+
size_t my_strlen(const char *s)
{
   const char *p = s;
   @@ -23,6 +34,7 @@ int main(void)
   {

Operasi cabang memungkinkan pembuatan jalur pengembangan lain. Kita dapat menggunakan operasi ini untuk membagi proses pengembangan menjadi dua arah yang berbeda. Misalnya, kami merilis produk untuk versi 6.0 dan kami mungkin ingin membuat cabang sehingga pengembangan fitur 7.0 dapat dipisahkan dari perbaikan bug 6.0.

Buat Cabang

Tom membuat cabang baru menggunakan perintah git branch <branch name>. Kita dapat membuat cabang baru dari yang sudah ada. Kita dapat menggunakan komit atau tag tertentu sebagai titik awal. Jika ada ID komit khusus tidak disediakan, maka cabang akan dibuat dengan HEAD sebagai titik awalnya.

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

Cabang baru dibuat; Tom menggunakan perintah git branch untuk mendaftar cabang yang tersedia. Git menunjukkan tanda asterisk sebelum cabang yang sedang diperiksa.

Representasi gambar dari operasi create branch ditunjukkan di bawah ini -

Beralih antar Cabang

Jerry menggunakan perintah git checkout untuk beralih antar cabang.

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

Pintasan untuk Membuat dan Beralih Cabang

Dalam contoh di atas, kami telah menggunakan dua perintah untuk membuat dan beralih cabang, masing-masing. Git menyediakan–bopsi dengan perintah checkout; operasi ini membuat cabang baru dan segera beralih ke cabang baru.

[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

Hapus Cabang

Sebuah cabang dapat dihapus dengan menyediakan opsi –D dengan perintah git branch. Tetapi sebelum menghapus cabang yang ada, beralihlah ke cabang lain.

Jerry saat ini aktif test_branchdan dia ingin menghapus cabang itu. Jadi dia mengganti cabang dan menghapus cabang seperti yang ditunjukkan di bawah ini.

[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).

Sekarang, Git hanya akan menampilkan dua cabang.

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

Ubah nama Cabang

Jerry memutuskan untuk menambahkan dukungan untuk karakter lebar dalam proyek operasi stringnya. Dia sudah membuat cabang baru, tetapi nama cabang tidak sesuai. Jadi dia mengubah nama cabang dengan menggunakan–m opsi diikuti dengan old branch name dan new branch name.

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

Sekarang, perintah git branch akan menampilkan nama cabang baru.

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

Gabungkan Dua Cabang

Jerry mengimplementasikan fungsi untuk mengembalikan panjang string dari string karakter lebar. Baru kode tersebut akan muncul sebagai berikut -

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

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

Perintah di atas menghasilkan hasil sebagai berikut -

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);
   +
}

Setelah pengujian, dia berkomitmen dan mendorong perubahannya ke cabang baru.

[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(-)

Perhatikan bahwa Jerry mendorong perubahan ini ke cabang baru, itulah sebabnya dia menggunakan nama cabang wchar_support dari pada master cabang.

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

Perintah di atas akan menghasilkan hasil sebagai berikut.

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

Setelah melakukan perubahan, cabang baru akan muncul sebagai berikut -

Tom ingin tahu tentang apa yang dilakukan Jerry di cabang pribadinya dan dia memeriksa log dari wchar_support cabang.

[tom@CentOS src]$ pwd /home/tom/top_repo/project/src [tom@CentOS src]$ git log origin/wchar_support -2

Perintah di atas akan menghasilkan hasil sebagai berikut.

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

Dengan melihat pesan komit, Tom menyadari bahwa Jerry mengimplementasikan fungsi strlen untuk karakter yang luas dan dia menginginkan fungsi yang sama di cabang master. Alih-alih menerapkan ulang, dia memutuskan untuk mengambil kode Jerry dengan menggabungkan cabangnya dengan cabang master.

[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(-)

Setelah operasi penggabungan, cabang master akan muncul sebagai berikut -

Sekarang, cabangnya wchar_supporttelah digabungkan dengan cabang master. Kita dapat memverifikasinya dengan melihat pesan komit atau dengan melihat modifikasi yang dilakukan ke dalam 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 
      

Perintah di atas akan menghasilkan hasil sebagai berikut.

#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);
}

Setelah pengujian, dia mendorong perubahan kodenya ke cabang master.

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

Cabang Rebase

Perintah Git rebase adalah perintah gabungan cabang, tetapi perbedaannya adalah perintah itu mengubah urutan komit.

Perintah Git merge mencoba untuk meletakkan komit dari cabang lain di atas HEAD cabang lokal saat ini. Misalnya, cabang lokal Anda memiliki komit A−> B−> C−> D dan cabang gabungan memiliki A−> B−> X−> Y, maka git merge akan mengubah cabang lokal saat ini menjadi seperti A−> B−> C−> D−> X−> Y

Perintah Git rebase mencoba mencari tahu nenek moyang yang sama antara cabang lokal saat ini dan cabang gabungan. Kemudian mendorong komit ke cabang lokal dengan mengubah urutan komit di cabang lokal saat ini. Misalnya, jika cabang lokal Anda memiliki A−> B−> C−> D dan cabang gabungan memiliki A−> B−> X−> Y, maka rebase Git akan mengubah cabang lokal saat ini menjadi sesuatu seperti A− > B−> X−> Y−> C−> D.

Saat beberapa pengembang bekerja pada satu repositori jarak jauh, Anda tidak dapat mengubah urutan komit di repositori jarak jauh. Dalam situasi ini, Anda bisa menggunakan operasi rebase untuk meletakkan komit lokal Anda di atas komit repositori jarak jauh dan Anda bisa mendorong perubahan ini.

Lakukan Perubahan di Cabang wchar_support

Jerry sedang mengerjakan wchar_supportcabang. Dia mengubah nama fungsi dan setelah pengujian, dia melakukan perubahannya.

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

Perintah di atas menghasilkan hasil sebagai berikut -

diff --git a/src/string_operations.c b/src/string_operations.c
index 8fb4b00..01ff4e0 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,7 +1,7 @@
#include <stdio.h>
#include <wchar.h>
-size_t w_strlen(const wchar_t *s)
+size_t my_wstrlen(const wchar_t *s)
{
   const wchar_t *p = s;

Setelah memverifikasi kode, dia melakukan perubahannya.

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

[jerry@CentOS src]$ git add string_operations.c [jerry@CentOS src]$ git commit -m 'Changed function name'
[wchar_support 3789fe8] Changed function name
1 files changed, 1 insertions(+), 1 deletions(-)

[jerry@CentOS src]$ git push origin wchar_support

Perintah di atas akan menghasilkan hasil sebagai berikut -

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 409 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
64192f9..3789fe8 wchar_support -> wchar_support

Lakukan Perubahan di Cabang Utama

Sementara itu di cabang master, Tom juga mengubah nama dari fungsi yang sama dan mendorong perubahannya ke cabang master.

[tom@CentOS src]$ git branch
* master
[tom@CentOS src]$ git diff

Perintah di atas menghasilkan hasil sebagai berikut -

diff --git a/src/string_operations.c b/src/string_operations.c
index 8fb4b00..52bec84 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,7 +1,8 @@
#include <stdio.h>
#include <wchar.h>
-size_t w_strlen(const wchar_t *s)
+/* wide character strlen fucntion */
+size_t my_wc_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

Setelah memverifikasi perbedaan, dia melakukan perubahannya.

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

[tom@CentOS src]$ git add string_operations.c [tom@CentOS src]$ git commit -m 'Changed function name from w_strlen to my_wc_strlen'
[master ad4b530] Changed function name from w_strlen to my_wc_strlen
1 files changed, 2 insertions(+), 1 deletions(-)

[tom@CentOS src]$ git push origin master

Perintah di atas akan menghasilkan hasil sebagai berikut -

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 470 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
64192f9..ad4b530 master -> master

Di wchar_supportBranch, Jerry mengimplementasikan fungsi strchr untuk string karakter lebar. Setelah pengujian, dia berkomitmen dan mendorong perubahannya kewchar_support cabang.

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

Perintah di atas menghasilkan hasil sebagai berikut -

diff --git a/src/string_operations.c b/src/string_operations.c
index 01ff4e0..163a779 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,6 +1,16 @@
#include <stdio.h>
#include <wchar.h>
+wchar_t *my_wstrchr(wchar_t *ws, wchar_t wc)
+
{
   +
   while (*ws) 
   {
      +
      if (*ws == wc)
      +
      return ws;
      +
      ++ws;
      + 
   }
   + return NULL;
   +
}
+
size_t my_wstrlen(const wchar_t *s)
{
   const wchar_t *p = s;

Setelah memverifikasi, dia melakukan perubahannya.

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

[jerry@CentOS src]$ git add string_operations.c [jerry@CentOS src]$ git commit -m 'Addded strchr function for wide character string'
[wchar_support 9d201a9] Addded strchr function for wide character string
1 files changed, 10 insertions(+), 0 deletions(-)

[jerry@CentOS src]$ git push origin wchar_support

Perintah di atas akan menghasilkan hasil sebagai berikut -

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 516 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
3789fe8..9d201a9 wchar_support -> wchar_support

Atasi Konflik

Tom ingin melihat apa yang dilakukan Jerry di cabang pribadinya, jadi, dia mencoba menarik perubahan terbaru dari wchar_support cabang, tetapi Git membatalkan operasi dengan pesan kesalahan berikut.

[tom@CentOS src]$ git pull origin wchar_support

Perintah di atas menghasilkan hasil sebagai berikut -

remote: Counting objects: 11, done.
63Git Tutorials
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.
From git.server.com:project
* branch
wchar_support -> FETCH_HEAD
Auto-merging src/string_operations.c
CONFLICT (content): Merge conflict in src/string_operations.c
Automatic merge failed; fix conflicts and then commit the result.

Selesaikan Konflik

Dari pesan error tersebut, terlihat jelas bahwa terdapat konflik di src / string_operations.c. Dia menjalankan perintah git diff untuk melihat detail lebih lanjut.

[tom@CentOS src]$ git diff

Perintah di atas menghasilkan hasil sebagai berikut -

diff --cc src/string_operations.c
index 52bec84,163a779..0000000
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@@ -1,8 -1,17 +1,22 @@@
#include <stdio.h>
#include <wchar.h>
++<<<<<<< HEAD
+/* wide character strlen fucntion */
+size_t my_wc_strlen(const wchar_t *s)
++=======
+ wchar_t *my_wstrchr(wchar_t *ws, wchar_t wc)
+
{
   +
   +
   while (*ws) 
   {
      if (*ws == wc)
      +
      return ws;
      +
      ++ws;
      + 
   }
   + return NULL;
   +
}
+
+ size_t my_wstrlen(const wchar_t *s)
++>>>>>>>9d201a9c61bc4713f4095175f8954b642dae8f86
{
   const wchar_t *p = s;

Karena Tom dan Jerry mengubah nama untuk fungsi yang sama, Git berada dalam kebingungan dan meminta pengguna untuk menyelesaikan konflik secara manual.

Tom memutuskan untuk tetap menggunakan nama fungsi yang disarankan oleh Jerry, tapi dia tetap menambahkan komentarnya, sebagaimana adanya. Setelah menghapus penanda konflik, git diff akan terlihat seperti ini.

[tom@CentOS src]$ git diff

Perintah di atas menghasilkan hasil sebagai berikut.

diff --cc src/string_operations.c
diff --cc src/string_operations.c
index 52bec84,163a779..0000000
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@@ -1,8 -1,17 +1,18 @@@
#include <stdio.h>
#include <wchar.h>
+ wchar_t *my_wstrchr(wchar_t *ws, wchar_t wc)
+
{
   +
   while (*ws) 
   {
      +
      if (*ws == wc)
      +
      return ws;
      +
      ++ws;
      + 
   }
   + return NULL;
   +
}
+
+/* wide character strlen fucntion */
- size_t my_wc_strlen(const wchar_t *s)
+ size_t my_wstrlen(const wchar_t *s)
{
   const wchar_t *p = s;

Karena Tom telah memodifikasi file, dia harus melakukan perubahan ini terlebih dahulu dan setelah itu, dia dapat menarik perubahan tersebut.

[tom@CentOS src]$ git commit -a -m 'Resolved conflict' [master 6b1ac36] Resolved conflict [tom@CentOS src]$ git pull origin wchar_support.

Tom telah menyelesaikan konflik, sekarang operasi penarikan akan berhasil.

GNU / Linux dan Mac OS menggunakan line-feed (LF), atau baris baru sebagai karakter akhir baris, sedangkan Windows menggunakan line-feed and carriage-return (LFCR) kombinasi untuk mewakili karakter akhir baris.

Untuk menghindari komit yang tidak perlu karena perbedaan akhir baris ini, kita harus mengkonfigurasi klien Git untuk menulis baris yang sama yang diakhiri dengan repositori Git.

Untuk sistem Windows, kita dapat mengkonfigurasi klien Git untuk mengonversi akhiran baris menjadi CRLF format saat check out, dan konversikan kembali ke LFformat selama operasi komit. Pengaturan berikut akan melakukan yang diperlukan.

[tom@CentOS project]$ git config --global core.autocrlf true

Untuk GNU / Linux atau Mac OS, kita dapat mengkonfigurasi klien Git untuk mengubah akhir baris CRLF untuk LF saat melakukan operasi pembayaran.

[tom@CentOS project]$ git config --global core.autocrlf input

GitHubadalah layanan hosting berbasis web untuk proyek pengembangan perangkat lunak yang menggunakan sistem kontrol revisi Git. Ini juga memiliki aplikasi GUI standar yang tersedia untuk diunduh (Windows, Mac, GNU / Linux) langsung dari situs web layanan. Tapi di sesi ini, kita hanya akan melihat bagian CLI.

Buat Repositori GitHub

Buka github.com . Jika Anda sudah memilikiGitHubakun, lalu masuk menggunakan akun itu atau buat yang baru. Ikuti langkah-langkah dari situs github.com untuk membuat repositori baru.

Operasi Dorong

Tom memutuskan untuk menggunakan GitHubserver. Untuk memulai proyek baru, dia membuat direktori baru dan satu file di dalamnya.

[tom@CentOS]$ mkdir github_repo [tom@CentOS]$ cd github_repo/

[tom@CentOS]$ vi hello.c [tom@CentOS]$ make hello
cc hello.c -o hello

[tom@CentOS]$ ./hello

Perintah di atas akan menghasilkan hasil sebagai berikut:

Hello, World !!!

Setelah memverifikasi kodenya, dia menginisialisasi direktori dengan perintah git init dan melakukan perubahannya secara lokal.

[tom@CentOS]$ git init
Initialized empty Git repository in /home/tom/github_repo/.git/

[tom@CentOS]$ git status -s ?? hello ?? hello.c [tom@CentOS]$ git add hello.c

[tom@CentOS]$ git status -s A hello.c ?? hello [tom@CentOS]$ git commit -m 'Initial commit'

Setelah itu, dia menambahkan file GitHub URL repositori sebagai asal jarak jauh dan mendorong perubahannya ke repositori jarak jauh.

[tom@CentOS]$ git remote add origin https://github.com/kangralkar/testing_repo.git [tom@CentOS]$ git push -u origin master

Operasi push akan diminta GitHubnama pengguna dan kata sandi. Setelah otentikasi berhasil, operasi akan berhasil.

Perintah di atas akan menghasilkan hasil sebagai berikut:

Username for 'https://github.com': kangralkar
Password for 'https://[email protected]': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 214 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/kangralkar/test_repo.git
 * [new branch]      master −> master
 Branch master set up to track remote branch master from origin.

Mulai sekarang, Tom dapat menerapkan perubahan apa pun ke GitHubgudang. Dia dapat menggunakan semua perintah yang dibahas dalam bab ini denganGitHub gudang.

Operasi Tarik

Tom berhasil mendorong semua perubahannya ke GitHubgudang. Sekarang, pengembang lain dapat melihat perubahan ini dengan melakukan operasi klon atau memperbarui repositori lokalnya.

Jerry membuat direktori baru di direktori home-nya dan mengkloning file GitHub repositori dengan menggunakan perintah git clone.

[jerry@CentOS]$ pwd /home/jerry [jerry@CentOS]$ mkdir jerry_repo

[jerry@CentOS]$ git clone https://github.com/kangralkar/test_repo.git

Perintah di atas menghasilkan hasil sebagai berikut:

Cloning into 'test_repo'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.

Dia memverifikasi isi direktori dengan menjalankan perintah ls.

[jerry@CentOS]$ ls
test_repo

[jerry@CentOS]$ ls test_repo/
hello.c