git add

git commit

git push

git fetch

git checkout

git merge

git pullgit add

git commit

git push

git fetch

git checkout

git merge

git pullGit Internal

เมื่อมีการ commit Git จะทำการสร้าง ชุดตัวเลขอ้างอิง สำหรับในการอ้างอิง โดยใช้รูปแบบของ SHA-1 ชุดตัวเลขมีความยาว 40 ตัวอักษร

ใน linux/unix system สามารถทดสอบในการสร้าง รหัส SHA-1

$ echo -n "Enjoy Git Training!!! OpenSource Day" | openssl sha1
echo -n "Enjoy Git Trainingsudo dnf update -y! OpenSource Day" | openssl sha1
(stdin)= fea0de6bb1581966d97527a92350aec1cea78593

จะเป็นว่าผลที่แสดงออกมา "fea0de6bb1581966d97527a92350aec1cea78593" มีค่าไม่เปลี่ยนแปลงเมื่อนำไป รันบนเครื่องอื่น เพราะผลลัพท์คือ ค่าของ SHA-1 ที่แทนค่า String นั้นเอง

SHA-1 บนชุดข้อมูล HASH

สำหรับ Git นั้นการ commit ในแต่ละครั้งจะมี ชุดข้อมูลชุดหนึ่ง เป็น metadata ยกตัวอย่าง pseudo code ที่ git จะสร้าง SHA-1 บน metadata

sha1(
    meta data
        commit message
        commiter
        commit date
        author
        authoring date
    Hash-Of-Entire-Working-Directory (bear, with me!)
)

Example

$ mkdir lab1
$ cd lab1
$ git init
Initialized empty Git repository in /home/mee/Gitlab/lab1/.git/

คำสั่ง git init จะสร้าง .git directory พร้อม directory ย่อย (Subdirectory) ว่างๆ

[lab1]$ tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

ทดสอบสร้าง File แล้ว add file สู่ Staging Area

[lab1]$ echo "This is my First File" > firstfile.txt
[lab1]$ git add firstfile.txt
[lab1]$ tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── objects
│   ├── b9
│   │   └── 832edeaea03f8a3562042a45fbf33cde53d845
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

จะเป็นว่ามีการสร้าง blob file ใน objects sub-directory ที่ path .git/objects/b9/832edeaea03f8a3562042a45fbf33cde53d845

[lab1]$ git cat-file -p b9832edeaea03f8a3562042a45fbf33cde53d845
This is my First File

[lab1]$ git cat-file -t b9832edeaea03f8a3562042a45fbf33cde53d845
blob

git จะเอา อักษร 2 ตัวเลขเป็น sub-directory ในตัวอย่างข้างต้น คือ b9

ต่อมา ให้ทำการ Commit ด้วย Option -m แล้ว ตามด้วย Commit message

[lab1]$ git commit -m "Commit First File message"
[master (root-commit) 4a448b8] Commit First File message
 1 file changed, 1 insertion(+)
 create mode 100644 firstfile.txt

[lab1]$ git log
commit 4a448b849b54fac405fb8d5a3a6b22d152d03b2f (HEAD -> master)
Author: Sawangpong Muadphet <[email protected]>
Date:   Wed Nov 29 16:06:59 2017 +0700

    Commit First File message

ต่อมา ลองดู ภายในฐานข้อมูลดูว่า git สร้างอะไรบ้าง

lab1]$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 05
│   │   └── 132c6238f7cf3f5e12ee713a80b24073323634
│   ├── 4a
│   │   └── 448b849b54fac405fb8d5a3a6b22d152d03b2f
│   ├── b9
│   │   └── 832edeaea03f8a3562042a45fbf33cde53d845
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

15 directories, 22 files

ตรวจสอบชนิดของ object

[lab1]$ git cat-file -t 05132c6238f7cf3f5e12ee713a80b24073323634
tree

[lab1]$ git cat-file -t 4a448b849b54fac405fb8d5a3a6b22d152d03b2f
commit

[lab1]$ git cat-file -t b9832edeaea03f8a3562042a45fbf33cde53d845
blob

ตรวจสอบ content ของ object

[lab1]$ git cat-file -p 4a448b849b54fac405fb8d5a3a6b22d152d03b2f
tree 05132c6238f7cf3f5e12ee713a80b24073323634
author Sawangpong Muadphet <[email protected]> 1511946419 +0700
committer Sawangpong Muadphet <[email protected]> 1511946419 +0700

Commit First File message

เมื่อนำมาสร้างเป็น Graph จะแสดงผลได้ดังนี้

สร้าง Directory ชื่อ assets และสร้าง app.css ภายใน folder

[lab1]$ mkdir assests
[lab1]$ touch assests/app.css
[lab1]$ git add .
[lab1]$ git commit -m "Commit assests folder & app.css"
[master 4419339] Commit assests folder & app.css
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 assests/app.css

ตรวจสอบ การเปลี่ยนแปลงภายใน Git

lab1]$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 05
│   │   └── 132c6238f7cf3f5e12ee713a80b24073323634
│   ├── 44
│   │   └── 193391a5fce000efe6023868a17563220a5af9
│   ├── 4a
│   │   └── 448b849b54fac405fb8d5a3a6b22d152d03b2f
│   ├── 50
│   │   └── baa5e568df5577d90c22d6b7dd2250c09a4861
│   ├── 51
│   │   └── 0739532f9b0b004ae0dbcea6163df01176c80a
│   ├── b9
│   │   └── 832edeaea03f8a3562042a45fbf33cde53d845
│   ├── e6
│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

19 directories, 26 files

ตรวจสอบ HEAD พบว่าชี้ไป 44193391a5fce000efe6023868a17563220a5af9

[lab1]$ cat .git/logs/refs/heads/master
0000000000000000000000000000000000000000 4a448b849b54fac405fb8d5a3a6b22d152d03b2f Sawangpong Muadphet <[email protected]> 1511946419 +0700    commit (initial): Commit First File message
4a448b849b54fac405fb8d5a3a6b22d152d03b2f 44193391a5fce000efe6023868a17563220a5af9 Sawangpong Muadphet <[email protected]> 1511960271 +0700    commit: Commit assests folder & app.css


[lab1]$ git cat-file -t  44193391a5fce000efe6023868a17563220a5af9
commit

lab1]$ git cat-file -p  44193391a5fce000efe6023868a17563220a5af9
tree 510739532f9b0b004ae0dbcea6163df01176c80a
parent 4a448b849b54fac405fb8d5a3a6b22d152d03b2f
author Sawangpong Muadphet <[email protected]> 1511960271 +0700
committer Sawangpong Muadphet <[email protected]> 1511960271 +0700

Commit assests folder & app.css

ภายใน object 44193391a5fce000efe6023868a17563220a5af9 ประกอบด้วย 2 object

1 tree 510739532f9b0b004ae0dbcea6163df01176c80a
2 parent 4a448b849b54fac405fb8d5a3a6b22d152d03b2f

ซึ่ง object parant ก็จะชี้ไปยัง commit ก่อนหน้า ส่วน object tree หมายถึง directory ที่ภายใน จะประกอบด้วย ข้อมูลด้านล่าง

[lab1]$ git cat-file -p  510739532f9b0b004ae0dbcea6163df01176c80a
040000 tree 50baa5e568df5577d90c22d6b7dd2250c09a4861    assests
100644 blob b9832edeaea03f8a3562042a45fbf33cde53d845    firstfile.txt

[lab1]$ git cat-file -p 50baa5e568df5577d90c22d6b7dd2250c09a4861
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    app.css

กลับไปยังจุด 4a448b8 ด้วยคำสั่ง git checkout

[lab1]$ git checkout 4a448b8
Note: checking out '4a448b8'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4a448b8... Commit First File message
[lab1]$ tree .
.
└── firstfile.txt

0 directories, 1 file

Git Snapshot

Git จะจัดเก็บข้อมูลในลักษณะที่เป็น snapshot ของโปรเจคของเราในทุกๆ ครั้งที่เรามีการ commit การเก็บแบบ snapshot จะได้ไฟล์ที่ครบถ้วนถูกต้องในแต่ละ commit ลดปัญหาที่เกิดจากความซับซ้อน บริหารจัดการได้ง่ายกว่า

Git Status

ไฟล์ของเราที่อยู่ใน Git จะมีสถานะแตกต่างการ

  1. untrack ยังไม่เพิ่มใน Git
  2. modified ถูกแก้ไข
  3. staged อยู่ในขั้นตอนและพร้อมที่จะ Commit สู่ git repository เมื่อมีการ commit ในครั้งต่อไป
  4. committed ยืนยันว่าได้เก็บเข้าสู่ Repository เรียบร้อยแล้ว

คำสั่งของ Git ที่ใช้สำหรับการบริหารจัดการได้แก่

  1. git add
  2. git commit
  3. git push
  4. git fetch
  5. git checkout
  6. git merge
  7. git pull

results matching ""

    No results matching ""