Introduction to Git

Overview

  • Git - một trợ thủ đắc lực của lập trình viên trong việc quản lí source code và làm dự án theo nhóm hiệu quả. Hầu hết các công ty phần mềm đều yêu cầu kĩ năng sử dụng Git với nhân viên của mình. Vậy Git là gì và tại sao nó lại phổ biến đến vậy? Chúng ta hãy cùng tìm hiểu sâu hơn về Git, cũng như các dịch vụ liên quan như GitHub và GitLab trong workshop lần này nhé!

Introduction to Git

What are the Version Control System and Git?

  • Version Control System (VCS) là gì?

    Version Control System hay còn gọi là Source Control Management là một công cụ giúp theo dõi và quản lý các thay đổi trong toàn bộ cấu trúc của một chương trình. Version Control sẽ lưu giữ tất cả phiên bản ứng với từng thay đổi trong các file code, văn bản, hình ảnh,... và cho phép quay lại phiên bản mong muốn cũng như so sánh giữa các phiên bản.

    Có hai loại Version Control System:

    • Centralized Version Control System (hệ thống quản lý phiên bản tập trung): tất cả các thư mục, tệp trong dự án sẽ nằm trung tại một server duy nhất. Cách lưu trữ này sẽ gặp rủi ro cao nếu server chính gặp sự cố.
    Hình 1
    • Distributed Version Control System (hệ thống quản lý phiên bản phân tán): Khác với kiểu trên, hệ thống phân tán cho phép mỗi cá nhân tải về toàn bộ dự án về local repository (có thể hiểu nôm na là kho chứa cục bộ).
    Hình 2
  • Tại sao VCS lại cần thiết?

    VCS giúp cho việc hợp tác giữa nhiều lập trình viên trong cùng một dự án trở nên dễ dàng, tiết kiệm thời gian và hạn chế được nhiều rủi ro. Không những vậy đối với những dự án cá nhân VCS cũng phát huy đáng kể chức năng của mình.

  • Git là gì?

    Git là một Distributed Version Control System (hệ thống quản lý phiên bản phân tán) miễn phí và có mã nguồn mở (open source).

    Git được phát triển bởi Linus Torvalds - người sáng tạo ra hệ điều hành Linux vào năm 2005 và dẫn trở thành một version control system phổ biến nhất. Trong một khảo sát thực hiện về version control được các lập trình viên sử dung trên Stack Overflow năm 2018 Git nhận được tới 88.4% trong tổng số 74,298 lượt phản hồi (hình 3).

    Hình 3
    Hình 4

Behind the scenes

Sau khi nắm được khái niệm về Git chúng ta sẽ tìm hiểu về cách hoạt động của Git cũng như khái niệm Staging area thường được nhắc đến khi sử dụng Git.

  • Git’s data model

    Đầu tiên để dễ dàng tiếp cận, sau đây là một số thuật ngữ đặc trưng trong Git (ngoài ra có một số thuật ngữ khác sẽ được giới thiệu sau trong lúc tìm hiểu):

    • Blob: chỉ tệp (file)
    • Tree: chỉ thư mục (directory), chứa blob và tree
    • Snapshot: top-level tree được ghi nhận (tracked), ví dụ ở hình 5 khi đang ở thư mục "root" (root tree) snapshot sẽ chỉ vào tree foo và blob baz.txt.
    • Commit: cũng chính là những snapshot, hay có thể hiểu commit chỉ hành động tạo ra snapshot của tree (thư mục đang làm việc).
    Hình 5

    Modeling history

    Để lưu một “lịch sử” Git sử dụng một đồ thị định hướng không tuần hoàn (directed acyclic graph - DAG) của các snapshot/commit, trong đó mỗi commit sẽ là một tree.

    Mỗi lần commit ta sẽ tạo ra một tree mới. Ví dụ ở hình 7, khi ta thay đổi trong blob2 và thực hiện commit, một tree mới sẽ được tạo "trỏ" tới blob1 (cũ) và blob2 mới. Ngoài ra một commit còn chứa những thông tin khác như thời gian commit, người thực hiện commit và lời nhắn nhủ cho commit.

    Hình 6
    Hình 7

    Pseudocode

    Ta có thể hình dung rõ hơn về các cấu trúc dữ liệu trong Git thông qua pseudocode sau:

    // a file is a bunch of bytes
            type blob = array<byte>
            
            // a directory contains named files and directories
            type tree = map<string, tree | blob>
            
            // a commit has parents, metadata, and the top-level tree
            type commit = struct {
                parents: array<commit>
                author: string
                message: string
                snapshot: tree
            }

    Nhìn chung, một object trong Git có thể là một blob, tree hoặc commit:

    type object = blob | tree | commit

    Content addressing

    Tuy nhiên, Git không thực sự chứa nội dung của các object này, thay vào đó, nó chứa những địa chỉ mã hóa của các nội dung đó. Mã được Git sử dụng là mã SHA1.

    Hình 8
    objects = map<string, object>
            
            def store(object):
                id = sha1(object)
                objects[id] = object
            
            def load(id):
                return objects[id]

    Hơn nữa vì mã SHA-1 là một chuỗi gồm 40 ký tự hệ cơ số 16 rất khó để con người có thể ghi nhớ, Git đã gán cho chúng những cái tên dễ nhớ hơn gọi là “reference”. Reference có thể được hiểu là những con trỏ trỏ đến các commit. Và không giống với object, reference có thể thay đổi dễ dàng (được cập nhật để trỏ vào những commit mới). Ví dụ: “master” reference trỏ tới commit mới nhất trong main branch.

    references = map<string, string>
            
            def update_reference(name, id):
                references[name] = id
            
            def read_reference(name):
                return references[name]
            
            def load_reference(name_or_id):
                if name_or_id in references:
                    return load(references[name_or_id])
                else:
                    return load(name_or_id)

    Tới đây ta có thể định nghĩa một thuật ngữ hay được nhắc đến là Git repository: một repository là một kho chứa các object và reference.

    Git branch

    Một khái niệm khác ta cần quan tâm khi nhắc đến Git là branch (nhánh). Branch là những phân nhánh ghi lại luồng thay đổi của lịch sử, các hoạt động trên mỗi branch sẽ không ảnh hưởng lên các branch khác. Mỗi branch sẽ được "đại diện" bởi một reference trỏ vào commit mới nhất của branch đó. Ví dụ, hình 9 chúng ta có 3 branch được đại diện bởi 3 reference là "Little Feature", "Master", "Big Feature" trỏ vào commit mới nhất của từng nhánh (hay những node lá của nhánh đó). Vì bản chất branch là một reference nên mỗi branch không phải là bản copy của thư mục chính hay chứa các commit mà nó chỉ đơn giản trỏ vào commit mới nhất và commit này lại lưu vết các commit khác thuộc branch này. Đây được xem là ưu điểm của Git so với các Version Control khác.

    Hình 9
  • Staging Area

    Staging Area là khu vực lưu trữ những thay đổi trước khi quyết định commit. Muốn commit thì những thay đổi trước hết phải được đưa vào trong khu vực này.

    Đây là một đặc trưng riêng của Git so với những Version Control System khác. Đối với những VCS khác một snapshot mới thường tạo dựa vào trạng thái hiện tại (current state). Riêng đối với Git một snapshot mới chỉ được tạo cho những thay đổi đã được đưa vào khu vực staging area.

    Điều này cho phép chia các thay đổi thành những lần commit khác nhau và lựa chọn thay đổi để commit. Ví dụ khi bạn đang thực hiện hai hàm khác nhau và muốn commit từng hàm riêng lẻ để dễ dàng truy lại. Hay khi bạn thêm những câu lệnh print để hỗ trợ quá trình debug nhưng chỉ muốn commit những câu lệnh đã fix bug thay vì những câu lệnh print vô nghĩa.

Git’s Advantages (compare to other VCS)

Một lý do hiển nhiên các lập trình viên hiện nay chọn Git vì đơn giản nó đã trở nên quá phổ biến, tuy nhiên hãy tìm hiểu lý do đằng sau sự phổ biến đó:

Nhanh, nhẹ: Đây là một ưu tiên hàng đầu của Git ngay từ lúc phát triển. Trong đa số các tác vụ Git xử lý nhanh hơn so với Subversion (SVN). Repository trong Git cũng gọn nhẹ hơn so với đa số các VCS khác.

Staging Area: Đây một vùng trung gian để lưu những thay đổi trước khi quyết định commit và là một đặc trưng của Git.

Phân tán: Git repository được chứa đồng thời trên server (remote repository) và cục bộ (local repository) trên máy của mỗi lập trình viên. Điều này nghĩa là lập trình viên có thể thao tác Git trên các tập tin offline và chỉ cần kết nối với server khi muốn push code lên remote repository. Điều này còn giúp đẩy nhanh tốc độ thao tác trong Git.

Bảo mật:  Git mã hóa các nội dung trong file sử dụng mã SHA1 và sử dụng những reference chứa những mã đó. Điều này đảm bảo tính bảo mật cho code và cho phép truy xuất lịch sử thay đổi và phục hồi chúng.

Branching model: Như đã đề cập ở phần trên, branch model trong Git hoạt động dựa trên cơ chế "reference", điều này giúp việc tạo, truy xuất và thực hiện thay đổi trên branch diễn ra dễ dàng, nhanh chóng.

Git/ Github/ Gitlab

Git Command Line Interface

Setup

Download Git: https://git-scm.com/downloads

Khi cài đặt xong Git, ta dùng lệnh sau để kiểm tra version của Git đồng thời xem nó đã được cài đặt thành công chưa:

git --version

MSI@DESKTOP-8N5NASQ MINGW64 ~
        $ git --version
        git version 2.33.1.windows.1

Sau đó, ta thiết lập tên và email cá nhân cho Git:

git config --global user.name “your name"

git config --global user.email "your@gmail.com"

MSI@DESKTOP-8N5NASQ MINGW64 ~
        $ git config --global user.name andrewlxm
        
        MSI@DESKTOP-8N5NASQ MINGW64 ~
        $ git config --global user.email lnquan.work@gmail.com

Repository

Khi làm việc với Git, ta phải làm quen với thuật ngữ “repository". “Git repository" là một vùng chứa project được quản lý bởi Git.

Local Repository/ Remote repository

Local Repository

  • Là 1 vùng được lưu trữ tách biệt ở trên máy tính, mà ở đó chúng ta có thể làm việc trên phiên bản hiện tại của project mà không làm ảnh hưởng đến project chính
  • Lịch sử làm việc đều được lưu trong thư mục khởi tạo git.

Remote Repository

  • Remote Repository: thường được lưu trữ ở trên remote server, thường được sử dụng khi làm việc theo team - đây là nơi bạn có thể chia sẻ code với nhau, xem tiến độ công việc của người khác, tích hợp vào project của bản thân, và đồng thời cũng có thể push những thay đổi của bạn lên remote repository
  • Remote repository chính thường được gọi là Origin
  • Các local clone đều liên kết đến remote.
  • Một local clone có thể có một hoặc nhiều remote.

Khởi tạo một repository

Để tạo một repository mới và theo dõi project bằng Git, ta sử dụng phần mềm Command Prompt (Windows) hoặc Terminal (Linux/ MacOS) và dẫn (change directory) đến thư mục chính của dự án, sau đó nhập lệnh sau:

git init

PS D:\Code Project\CP> git init
        Initialized empty Git repository in D:/Code Project/CP/.git/

Lệnh này sẽ tạo file .git ẩn trong thư mục dự án của bạn, file .git sẽ theo dõi lại những thay đổi trong thư mục hiện tại so với lần thay đổi gần nhất được commit và push.

Committing Code

Committing Code: là một hành động để Git lưu lại một bản chụp (snapshot) của các sự thay đổi trong thư mục làm việc, và các tập tin và thư mục được thay đổi đã phải nằm trong Staging Area. Mỗi lần commit nó sẽ được lưu lại lịch sử chỉnh sửa của mã nguồn kèm theo tên và địa chỉ email của người commit.

Kiểm tra trạng thái của tập tin

Dùng dòng lệnh sau đây để kiểm tra trạng thái tập tin trong repository:

git status

PS D:\Code Project\CP> git status
        On branch master
        
        No commits yet
        
        Changes to be committed:
          (use "git rm --cached <file>..." to unstage)

Đây là một dòng lệnh thông dụng khi ta làm việc với Git, nó hiển thị trạng thái thay đổi của từng tập tin trước khi nó được thêm vào staging area.

Tạo staging files

Trong thư mục project, chúng ta có thể sử dụng lệnh git add  để đưa tập tin vào staging area:

git add file.js file2.js file3.js

PS D:\Code Project\CP> git add test.py

Hoặc nếu ta muốn đưa tất cả tập tin và thư mục vào Staging Area thì dùng:

git add .

Tạo commit

Để commit tập tin từ Staging Area, ta dùng lệnh sau:

git commit -m "Commit message"

PS D:\Code Project\CP> git commit -m "first commit"
        [master (root-commit) 439e73b] first commit
         46 files changed, 1671 insertions(+)

Commit message nên dùng để mô tả ngắn gọn thay đổi mà bạn commit vào repository.

Lưu ý: Mỗi khi ta muốn commit một tập tin, phải đưa tập tin đó vào Staging Area trước.

Commit history

Để xem tất cả commits đã thực hiện trong project, ta dùng lệnh sau:

git log

PS D:\Code Project\CP> git log
        commit 439e73b803858061b8908cbd6bab40be133723ed (HEAD -> master)
        Author: andrewlxm <lnquan.work@gmail.com>
        Date:   Thu Nov 4 20:37:52 2021 +0700
        
            first commit

Câu lệnh sẽ hiển thị thông tin chi tiết của từng commit như: tên tác giả, thời gian và commit message.

Khi muốn chuyển sang branch khác, ta dùng lệnh:

git checkout <commit-branch>

PS D:\Code Project\CP> git checkout master
        Switched to branch 'master'

<commit-branch>: tên branch mà bạn muốn chuyển tới (được liệt kê trong git log)

Để trở về lần commit gần nhất (Hoặc phiên bản mới nhất của project), dùng lệnh:

git checkout master

Ignoring files

Bạn có thể tạo một tập tin tên .gitignore trong project và thêm vào đó đường dẫn các tập tin nếu bạn muốn chúng nào không bị track hoặc thêm vào Staging Area chẳng hạn như trong các trường hợp:

  • Các file mà IDE tự sinh ra trong quá trình build project, tránh tốn kém tài nguyên server lưu trữ project.
  • Các file cấu hình đường dẫn của máy cá nhân, gây ra việc không build được project khi checkout về ở các máy thành viên khác.
  • Các file cần phải giữ kín nếu như repository của bạn đang để public.

Branch

Branch - nhánh

  • Branch cũng là một khái niệm mới trong Git mà cần phải làm quen.
  • Branch là các version song song với nhau của Repository.
  • Người dùng làm việc trên các branch mà không làm ảnh hưởng đến live version.
  • Khi bạn khởi tạo một repository và bắt đầu commit, bạn mặc định sẽ được đưa vào branch Master

Một vài branch đặc biệt

  • Master branch mặc định, mục đích sử dụng cho môi trường Production.
  • HEAD - branch hiện tại mà người dùng đang làm việc.
  • origin/master, origin/abc, origin2/xyz là các nhánh ở remote repository.
  • Develop: Branch có mục đích sử dụng cho môi trường Development. Các branch feature sẽ được tạo từ đây.
  • Release: Branch có mục đích chuẩn bị môi trường cho những branch feature, fix-bug sẵn sàng lên production.

Tạo branch

git branch <new-branch-name>

PS D:\Code Project\CP> git branch demo1

Khi một branch mới được tạo ra sẽ trở thành trạng thái mới của repository và sẽ thực thi công việc trên branch mới đó

Trong một dự án, ta nên thực thi những thay đổi trên một nhánh riêng biệt (thường gọi là nhánh development) để tránh ảnh hưởng đến nhánh gốc (nhánh master)

Thay đổi branch

Để chuyển sang một branch khác, dùng lệnh:

git checkout <branch-name>

PS D:\Code Project\CP> git checkout demo1
        Switched to branch 'demo1'

<branch-name>: tên branch mà bạn muốn chuyển tới (được liệt kê khi thực thi lệnh git log).

Khi ta thực hiện thao tác trên branch bất kỳ thì toàn bộ công việc sẽ không ảnh hưởng tới branch khác.

Merge các branch

Sau khi bạn đã cài đặt và kiểm thử một vài tính năng mới trong source code , bạn có lẽ sẽ muốn hợp nhất những thay đổi này vào branch ổn định trong project (thường là branch master).

Để có thể merge những thay đổi từ một branch khác tới branch hiện tại, thực hiện lệnh:

git merge <branch-name>

Xóa một branch

Để có thể xóa một branch, ta thêm dùng lệnh:

git branch -d <branch-name>

PS D:\Code Project\CP> git branch -d demo2
        Deleted branch demo2 (was 439e73b).

Clone, push, pull, rebase

Git clone

Khác với git init là khởi tạo git repository cho thư mục hiện tại thì git clone sẽ clone 1 repository đã được tạo sẵn về thư mục của bạn, thông thường nhất là clone về máy 1 repo sẵn trên github/bitbucket/gitlab:

git clone <git-url>

PS D:\Code Project\CP> git clone https://github.com/andrewlxm/DemoMenu
        Cloning into 'DemoMenu'...
        remote: Enumerating objects: 14, done.
        remote: Counting objects: 100% (14/14), done.
        remote: Compressing objects: 100% (12/12), done.
        remote: Total 14 (delta 1), reused 14 (delta 1), pack-reused 0R
        Receiving objects: 100% (14/14), 10.85 KiB | 5.43 MiB/s, done.
        Resolving deltas: 100% (1/1), done.

Git push

Sau khi commit những thay đổi, repository tuy đã được cập nhật nhưng chỉ ở local, chúng ta cần gửi những thay đổi này lên remote server. Việc này sẽ được thực hiện bởi lệnh:

git push <remote>

Câu lệnh chỉ upload những gì bạn đã commit lên remote repository.

PS D:\Code Project\CP> git push https://github.com/andrewlxm/CP_Cheatsheet
        Enumerating objects: 49, done.
        Counting objects: 100% (49/49), done.
        Delta compression using up to 8 threads
        Compressing objects: 100% (43/43), done.
        Writing objects: 100% (49/49), 179.74 KiB | 4.49 MiB/s, done.
        Total 49 (delta 25), reused 0 (delta 0), pack-reused 0
        remote: Resolving deltas: 100% (25/25), done.
        remote: 
        remote: Create a pull request for 'master' on GitHub by visiting:
        remote:      https://github.com/andrewlxm/CP_Cheatsheet/pull/new/master
        remote:
        To https://github.com/andrewlxm/CP_Cheatsheet
         * [new branch]      master -> master

Git fetch

Dùng để cập nhập thông tin mới nhất từ Git remote repository nhưng chỉ là thông tin metadata ví có những branch nào, có những thay đổi nào từ Git remote repository mà chúng ta chưa cập nhập về Git local repository hay không? chứ không làm thay đổi, đồng bộ Git local repository với Git remote repository.

Git pull

Có tác dụng cập nhật những thay đổi trên remote repository về local. Nó là sự kết hợp của 2 lệnh git fetchgit merge. Cụ thể là khi pull, chúng ta cập nhật từ remote repository (git fetch) và đồng thời apply những thay đổi mới nhất vào local (git merge).

git pull <remote>

Git rebase

Git Rebase là một chức năng được dùng khi gắn nhánh đã hoàn thành công việc vào nhánh gốc . Về mặt nội dung thì là việc điều chỉnh nhánh công việc gắn vào với nhánh gốc nên các commit sẽ được đăng kí theo thứ tự gắn vào . Chính vì thế sẽ có đặc trưng là dễ nhìn hơn sau khi xác nhận commit .

Git rebase <tên nhánh>

Sau đó, ta sử dụng git status để kiểm tra trạng thái.

Sử dụng git rebase --continue để tiếp tục với các thay đổi đã thực hiện, nếu muốn bỏ qua thì sử dụng git rebase --skip

So sánh giữa merge và rebase

  • Merge

    Giả sử ta có 2 nhánh beta và master như hình:

    Khi ta sử dụng git merge beta, các commit sẽ được gộp vào nhánh master ta sẽ tiếp tục làm việc trên nhánh master, kết quả như hình bên dưới.

  • Rebase

    Cũng tương tự giả sử ta có 2 nhánh trên, khi ta thực hiện git rebase beta, thì các commit ở nhánh beta sẽ được chọn làm base, và sẽ được đưa lên phía đằng trước làm cơ sở của nhánh master, và sẽ thay đổi lại lịch sử commit, xử lý các xung đột giữa commit B2 và D1 để D1 được commit lại thành D1' như hình bên dưới

    (Trường hợp nếu chọn master làm base thì vị trí sẽ bị đảo ngược).

Trạng thái của file

  • Untracked: Trong working directory nhưng git không quản lý, đó là những file tạo mới, được copy vào, hoặc bạn vừa xóa.
  • Unmodified: Đây là những tập tin mà git quản lý, git ghi nhận rằng file đó chưa có sự thay đổi so với commit hiện tại . Có 2 cách để chuyển file vào trạng thái này đó là thêm các file untracked git add hay git commit tức là lưu sự thay đổi đó lại.
  • Modified: Là file từ trạng thái unmodified và đã bị edit, tất nhiên khi undo toàn bộ thao tác, file vẫn sẽ trở lại trạng thái unmodified.
  • Staged: là trạng thái chuẩn bị được commit, thông thường người dùng không để ý đến trạng thái này, trạng thái này được trình bày khá rõ ràng ở hình thứ 2. Một trạng thái git đã ghi nhận sự thay đổi nhưng chưa tạo commit. Để chuyển sang trạng thái staged sử dụng câu lệnh git stage.

Hướng dẫn sử dụng Git cơ bản

  • Bước đầu tiên, chúng ta sẽ tạo một Demo Repo trên Github.
  • Sau đó chúng ta clone repo về local
PS D:\Code Project\Demo Github> git clone https://github.com/andrewlxm/Github-Demo
        Cloning into 'Github-Demo'...
        remote: Enumerating objects: 6, done.remote: Counting objects: 100% (6/6), done.
        remote: Compressing objects: 100% (3/3), done.
        remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0Receiving objects: 100% (6/6), done.
  • Sau đó ta tạo 1 file mới mà ở đây tạm gọi là "helloWorld.cpp"
  • Sau đó chúng ta sử dụng lệnh git add để thêm file ta vừa tạo vào staging area.
PS D:\Code Project\Demo Github\Github-Demo> git add helloWorld.cpp
  • Kế đến sử dụng git status để kiểm tra
PS D:\Code Project\Demo Github\Github-Demo> git status
        On branch main
        Your branch is up to date with 'origin/main'.
        
        Changes to be committed:
          (use "git restore --staged <file>..." to unstage)
                new file:   helloWorld.cpp
  • Và bây giờ ta sẽ sử dụng lệnh git commit để tiến hành commit vào repo
PS D:\Code Project\Demo Github\Github-Demo> git commit -m "Add helloWorld.cpp"
        [main 22c5e66] Add helloWorld.cpp
         1 file changed, 29 insertions(+)
         create mode 100644 helloWorld.cpp
  • Ta sẽ thử xài lệnh git log và quan sát output, ở đây ta có thể thấy chi tiết tác giả đã commit và ngày tháng, thời gian họ commit.
  • Và bây giờ khi ta edit bất kỳ file nào mà ta đã commit, thì ta sẽ phải thực hiện các thao tác git add và git commit để có thể commit và sau đó là push project lên github.
  • Ví dụ, ta sẽ thực hiện 1 vài thao tác trên file README.md như thêm text vào :v. Sau đó, khi ta sử dụng lệnh git status, sẽ có thông báo là:
PS D:\Code Project\Demo Github\Github-Demo> git status
        On branch main
        Your branch is ahead of 'origin/main' by 1 commit.
          (use "git push" to publish your local commits)
        
        Changes not staged for commit:
          (use "git add <file>..." to update what will be committed)
          (use "git restore <file>..." to discard changes in working directory)
                modified:   README.md
        
        no changes added to commit (use "git add" and/or "git commit -a")
  • Vì file README.md đã bị điều chỉnh, nên sau đó chúng ta sẽ phải dùng git add:
PS D:\Code Project\Demo Github\Github-Demo> git add README.md
  • Sau đó dùng git status, ta có thể thấy file đã sẵn sàng để commit:
PS D:\Code Project\Demo Github\Github-Demo> git status
        On branch main
        Your branch is ahead of 'origin/main' by 1 commit.
          (use "git push" to publish your local commits)
        
        Changes to be committed:
          (use "git restore --staged <file>..." to unstage)
                modified:   README.md
  • Cuối cùng là để push project lên, ta sử dụng lệnh git push hoặc là git push origin main khi project của bạn có nhiều nhánh khác nhau.
PS D:\Code Project\Demo Github\Github-Demo> git push 
        Enumerating objects: 8, done.
        Counting objects: 100% (8/8), done.
        Delta compression using up to 8 threads
        Compressing objects: 100% (6/6), done.
        Writing objects: 100% (6/6), 905 bytes | 905.00 KiB/s, done.
        Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
        To https://github.com/andrewlxm/Github-Demo
           a37dfd6..460f4a2  main -> main
  • Sau đó chúng ta lên Github kiểm tra lại repo, ta có thể thấy các file ở vùng local đã được push lên vùng remote mà ở đây là github.
  • Vậy là ta đã hoàn thành việc tạo 1 workflow cơ bản nhất bằng việc sử dụng Git. Và từ đây, bạn có thể tham khảo các tài liệu và docs online về Git để có thể trở nên pro hơn.

Github

Github là gì?

  • Là dịch vụ quản lý dự án và các phiên bản code, nó hoạt động như một nền tảng mạng xã hội dành riêng cho các lập trình viên. Github cho phép các nhà phát triển hợp tác với nhau để thực hiện các thay đổi, lên kế hoạch, quản lý và làm chung các dự án.
  • Là một dịch vụ nổi tiếng cung cấp kho lưu trữ mã nguồn Git cho các dự án phần mềm. Github có đầy đủ những tính năng của Git, ngoài ra nó còn bổ sung những tính năng về social để các developer tương tác với nhau.

Tính năng của Github

Tính năng chính:

  • Wiki, issue, thống kê, đổi tên project, project được đặt vào namespace là user.
  • Watch project: theo dõi hoạt động của project của người khác. Xem quá trình người ta phát triển phần mềm thế nào, project phát triển ra sao.
  • Follow user: theo dõi hoạt động của người khác.

Tiếp cận Github

Có 2 cách:

  • Tạo project của riêng mình Contribute cho project có sẵn.
  • Fork project có sẵn của người khác, sửa đổi, sau đó đề nghị họ cập nhật sửa đổi của mình (tạo pull request).

Lợi ích của Github

Quản lý source code dễ dàng:

Khi bạn tạo một repo, toàn bộ source code của repo đó được lưu trên GitHub. Tại đây, bạn có thể coi lại quá trình mình đã làm việc thông qua các comment sau mỗi lần commit. Và cái hay ở đây, là nhiều người có thể cùng làm một repo.

Tracking sự thay đổi qua các version

Khi có nhiều member cùng thực hiện một dự án thì khá là phức tạp để theo dõi revisions – ai thay đổi cái gì, lúc nào và mấy cái file đó được stored ở đâu. Đừng lo vì GitHub đã tính đến chuyện này giúp bạn, bằng cách luôn lưu lại những thay đổi bạn đã push lên repository. Cũng tương tự với Microsoft Word hay Google Drive, bạn có một lịch sử phiên bản để phòng trường hợp các phiên bản trước đó bị mất hay không được lưu.

Markdown

Markdown là một cách định dạng text trên web. Bạn có thể chỉnh sửa cách hiển thị của document, format từ như định dạng in đậm hay in nghiêng, thêm hình và tạo list những thứ bạn có thể làm với Markdown. Hầu hết, Markdown chỉ là đoạn text đơn thuần với những ký tự đặc biệt chèn vào, như # hay *.

Github giúp khẳng định bản thân

  • Không gì hiệu quả bằng việc đưa ra sản phẩm của bản thân, cho nên hãy đầu tư một Github thật xịn bằng cách upload những project của mình lên Github của bản thân. Có rất nhiều công ty lớn trên thế giới xem đây là một yêu cầu trong quy trình tuyển dụng của họ. Nếu bạn có nhiều đóng góp cho cộng đồng hoặc có nhiều sản phẩm trên Github, sẽ là một lợi thế rất lớn so với các ứng viên khác. Vì bằng cách đăng tải các project của mình lên đây, bạn đã tạo cho mình một profile cá nhân vô cùng đáng tin cậy.
  • Vì khi nhìn vào đó, nhà tuyển dụng sẽ biết được thế mạnh của bạn là gì, và khả năng coding của bạn thế nào.

Github giúp cải thiện kỹ năng code

Với hàng vạn open source projects, hàng trăm ngàn contributors, hàng tỉ commit mỗi ngày thì chỉ bằng việc xem, so sánh, học tập từ những thay đổi đó đã đem lại cho bạn hàng tá điều hay để cải thiện kỹ năng code của bản thân mình.

Github là một kho tài nguyên tuyệt vời

  • Với chức năng Explore, bạn có thể theo dõi, tìm kiếm những open source projects theo đúng technology pattern mà bạn ưa thích. Github hỗ trợ code search không kể nó ở dưới dạng một project riêng biệt hay là website.
  • Nếu như bạn muốn học ngôn ngữ hoặc công nghệ mới, bạn có thể search từ khóa : awesome + ngôn ngữ/ công nghệ bạn muốn học . Ví dụ nếu muốn tìm hiểu về python:

Sử dụng Github

Tạo một repository

Tạo một branch

Fork một repository

  • Fork một repository (forking a repository) có nghĩa là bạn tạo một dự án mới dựa trên dự án cũ. Tức là, sao chép hoàn toàn một repository đã tồn tại, tạo ra các thay đổi cần thiết, và lưu phiên bản mới này dưới dạng một repository độc lập hoàn toàn mới và gọi nó là dự án của riêng bạn.
  • Tính năng này vô cùng tiện lợi để đẩy nhanh tiến độ dự án. Vì là một dự án hoàn toàn mới, repository chính sẽ không bị ảnh hưởng. Nếu repository master được cập nhật, bạn cũng có thể áp dụng các cập nhật đó lên bản fork của bạn.

Pull request

Để thông báo cho những người làm cùng team về những thay đổi bạn làm trên dự án, bạn sẽ cần tạo Pull Request. Việc này sẽ giúp việc làm việc nhóm trở nên dễ dàng hơn. Pull Request là cách bạn để đồng nghiệp biết các thay đổi và đánh giá chúng. Nếu những người khác trong team đồng ý về các thay đổi này, họ sẽ thực hiện merge pull request, đưa những thay đổi này vào dự án ở nhánh chính.

Gitlab

Tổng quan về gitlab:

Gitlab là gì?

Nếu như GitHub theo hướng kinh doanh, GitLab là một phần mềm có nhiệm vụ quản lý kho code Git. sở hữu các tính năng đơn giản, góp phần to lớn trong việc giúp các doanh nghiệp, cá nhân, tổ chức lưu trữ code một cách nhanh chóng vô cùng, người dùng hoàn toàn có thể truy cập mọi lúc mọi nơi miễn là có kết nối Internet.

Bạn có thể ẩn kho code của mình, không công khai chúng cho bất kỳ ai, trong trường hợp vượt quá ngưỡng miễn phí thì bạn mới phải mất phí để mua thêm dịch vụ.

Tại sao nên dùng gitlab?

Sử dụng Gitlab mang đến cho lập trình viên:

  • Sự tiện lợi. Thao tác mỗi khi cần lưu trữ, tải lên, tải xuống code dễ dàng hơn.
  • Kiểm soát các thay đổi trong code nhanh chóng, chính xác.
  • Dễ dàng quản lý, phân phối công việc, hoàn thành dự án lập trình chất lượng hơn.

Lịch sử phát triển của gitlab:

  • “Cha đẻ” của Gitlab là Dmitriy Zaporozhets. Ông là người Ukraine và là giám đốc điều hành Sytse Sijbrandij (trụ sử được đặt tại Utrecht). Thật ra, Gitlab là “đứa con tinh thần” của cả một nhóm: Sid Sijbrandij (CEO) và Dmitriy Zaporozhets (CTO).
  • Năm 2013, Gitlab “trình làng” với 2 phiên bản CE (Community Edition) miễn phí và EE (Enterprise Edition) có trả phí . Gitlab được viết bằng ngôn ngữ Ruby với giấy phép phần mềm tự do và nguồn mở MIT. Một số phần sau đó được viết bằng ngôn ngữ Go và Vue.js.
  • Tính đến thời điểm này, Gitlab đã được Alibaba Group, IBM, Spacex và Khosla Ventures, … tài trợ.
  • Trung tâm nghiên cứu Jülich Research Center, NASA, Alibaba, O’Reilly Media, Leibniz-Rechenzentrum (LRZ), CERN,… và hơn 100.000 tổ chức khác đã chọn Gitlab làm nơi lưu trữ cho mình. Hiện tại, có hơn 1000 mã nguồn mở có mặt trên Gitlab.

Các đặc điểm nổi bật của gitlab:

Các phiên bản của gitlab:

GitLab có 3 phiên bản bao gồm:

  • Gitlab community edition (CE): còn được biết đến là Gitlab phiên bản cộng đồng. Đây là phiên bản mã nguồn mở. Được cung cấp qua Git từ kho lưu trữ chứa Gitlab. Phiên bản mới nhất của Gitlab được các nhà phát triển release tại các nhánh stable và nhánh master.
  • Gitlad enterprise edition (EE): còn được biết đến là Gitlab phiên bản doanh nghiệp. Đây là phiên bản có sẵn không lâu sau khi phát hành bản CE, được cung cấp từ kho lưu trữ của gitlab.com. Một doanh nghiệp đăng ký GitLab được sự support của GitLab BV những khó khăn khi cài đặt.
  • Gitlab continuous integration (CI). Đây là một giải pháp tích hợp được thực hiện bởi nhóm phát triển Gitlab.

Protected branches:

Protected branches sẽ cho phép người dùng có thể:

  • Đọc hoặc ghi vào repository và các branches.
  • Commit và pushing code (đối với một số đối tượng nhất định)

Thông thường, một protected branch gồm 3 chức năng chặn:

  • Push từ tất cả mọi người (trừ user và master).
  • Push code lên branch từ những người không có quyền truy cập.
  • Bất kỳ ai thực hiện xóa branch.

Master branch được mặc định là protected branch. User cần được cấp ít nhất một quyền từ master branch để bảo mật branch. Đây là một chức năng cực kỳ hữu ích để các nhà phát triển có thể bảo vệ được thành quả lao động của mình.

Tầng vật lý:

  • Kho lưu trữ: là nơi xử lý các dự án trên GitLab, các dự án hoặc sản phẩm có thể được lưu tại warehouse.
  • Nginx có cách thức hoạt động giống như front-desk, người dùng đến Nginx và yêu cầu hành động được thực hiện bởi worker trong văn phòng.
  • Cơ sở dữ liệu là các file của các metal file cabinets chứa các thông tin: sản phẩm trong warehouse, người sử dụng đến front-desk (permissions), Redis, Sidekiq, A Unicorn worker, ….
  • GitLab-shell: thực hiện nhiệm vụ tạo các đơn đặt hàng từ một máy fax (SSH) thay vì front-desk (HTTP).
  • GitLab enterprise edition là tập hợp các quy trình và hoạt động kinh doanh được điều hành bởi office.

System layout:

Ứng dụng GitLab-shell được cài đặt tại thư mục: /home/git/gitlab-shell cho phép sử dụng kho dữ liệu qua SSH.

Lợi ích của việc sử dụng gitlab:

Gitlab là open core:

Đây là một ưu thế cạnh tranh dành cho GitLab khi các đối thủ của phần mềm này chủ yếu là các closed-source. GitLab Community Edition là mã nguồn mở hoàn chỉnh và phiên bản Enterprise Edition là opencore (độc quyền).

Truy cập vào mã nguồn:

Điểm vượt trội của Open core là bạn có thể xem và sửa đổi source code của GitLab Community Edition và Enterprise Edition khi nào bạn muốn. Điều này không thể thực hiện đối với phần mềm closed-source. Có thể là trên Server hoặc bằng cách giả lập kho lưu trữ của GitLab, bạn có thể thêm các tính năng và thực hiện các tùy chỉnh. GitLab khuyên bạn nên cố gắng hợp nhất các thay đổi trở lại source code chính để những người khác có thể hưởng lợi từ những thay đổi và những thay đổi này vẫn để duy trì và cập nhật.

Tính khả thi lâu dài:

Chính vì sự uy tín của GitLab, nên đã tạo ra một cộng đồng vững chắc với hàng trăm nghìn tổ chức, cá nhân sử dụng và đóng góp cho phần mềm. Việc có nhiều người cùng xây dựng giúp GitLab có khả năng sử dụng lâu dài hơn vì sẽ không đáng tin cậy nếu chỉ có duy nhất một công ty hỗ trợ cho phần mềm.

Cộng đồng phát triển:

Bởi những ý kiến đóng góp, xây dựng cùng sự phản hồi tích của của người dùng, Gitlab đang ngày một xây dựng những phiên bản tốt nhất từ ý kiến của các khách hàng để đem đến cho họ những trải nghiệm tuyệt vời nhất. Điều này góp phần tạo nên các tính năng mà các tổ chức thực sự cần, chẳng hạn như quản lý người dùng thật dễ dàng nhưng không hề kém phần mạnh mẽ.

Phiên bản ổn định mới mỗi tháng:

GitLab phát hành phiên bản ổn định mới mỗi tháng, đầy đủ các cải tiến, tính năng và bản sửa lỗi. Điều này khiến cho GitLab phát triển rất nhanh và luôn đáp ứng yêu cầu của khách hàng theo cách cực kỳ nhanh chóng.

Hướng dẫn cài đặt gitlab:

Cài đặt trên Window:

Để cài đặt Gitlab trên Windows, bạn chỉ cần thực hiện theo những bước sau đây:

  • Bước 1: Tạo một thư mục mới đặt tên GitLab-Runner trong thư mục hệ thống. Bạn nên tạo nó trong ổ đĩa cài đặt của máy thông thường là ổ C, C:GitLab-Runner.
  • Bước 2: Tải phiên bản GitLab tương ứng với hệ điều hành của máy ( 32bit hoặc 64bit tùy máy). Copy file cài vừa tải về vào thư mục đã tạo và đổi tên file gitlab-runner.exe.
  • Bước 3: Mở command prompt lên và nhập dòng code sau vào:
    • cd C:GitLab-Runner
    • .gitlab-runner.exe install
    • .gitlab-runner.exe start
  • Bước 4: Đăng ký tài khoản GitLab:
    • Dừng chương trình GitLab đang chạy bằng câu lệnh: gitlab-runner.exe stop
    • Chạy câu lệnh đăng ký tài khoản: gitlab-runner.exe register
    • Tại đây, bạn sẽ nhận thông báo lỗi với chữ đỏ, hãy dừng lệnh cài đặt bằng lệnh stop: gitlab-runner.exe register stop
    • Thông báo “Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )”. Bạn nhập địa chỉ URL vào: https://gitlab.com
    • Thông báo “Please enter the gitlab-ci token for this runner” yêu cầu nhập token. Để lấy token bạn phải đăng ký tài khoản gitlab. Sau đó, đăng nhập tài khoản chọn Setting => CI/CD, kéo thanh trượt xuống mục “Set up a specific Runner manually” để lấy token, nhập vào command prompt. xxx (token của bạn)
    • Thông báo “Please enter the gitlab-ci description for this runner”. Yêu cầu nhập mô tả cho runner: My-runner (bạn có thể dùng tên khác hoặc chỉnh sửa sau).
    • Thông báo “Please enter the gitlab-ci tags for this runner (comma separated):” nhập thẻ tag cho runner: my-tag,another-tag.
    • Thông báo cài đặt thành công “Registering Runner… succeeded”. Nhập vào Runner executor: docker.
    • Nếu chọn docker, bạn sẽ được hỏi dùng hình ảnh mặc định cho các projects: alpine:latest.

Cài đặt trên Linux:

Những câu hỏi thường gặp:

Gitlab và github có giống nhau hay không?

  • GitLab và GitHub đều là những phần mềm dịch vụ lưu trữ, song chúng hoàn toàn là hai cái tên khác nhau. GitHub ra đời trước GitLab nên mức độ phổ biến cũng rộng rãi hơn rất nhiều.

Có những loại gitlab cơ bản nào:

  • GitLab hỗ trợ người dùng với nhiều tính năng để đạt hiệu suất tối đa cho công việc, gồm có các loại chính như:
  • GitLab Login.
  • GitLab CI.
  • GitLab Runner.
  • GitLab Ssh.

Gitlab hay github, cái nào nổi trội hơn?

  • Nếu xét về yếu tố cộng đồng thì rõ ràng GitHub có phần vượt trội hơn vì sự lâu đời của mình. Hơn nữa, chính sách phát triển của GitHub là muốn hướng đến một cộng đồng bền vững và chia sẻ mã nguồn lẫn nhau. Thế nên, việc kết nối các developer như một mạng xã hội sẽ giúp GitHub có tính cộng đồng cao hơn.

Tính năng CI/CD trên gitlab hay github nổi trội hơn?

  • Đối với tính năng này của GitLab, bạn hoàn toàn có thể sử dụng miễn phí. Không tương tự như GitHub, bạn phải liên kết với bên thứ 3 như: Travis CI, CircleCI hay Codeship,…để thực hiện.

Exercises

  1. Tạo một repository trên Github, clone về máy và thêm vài file trong repository đó, thực hiện vài thay đổi và push lên remote repository.
  1. Tạo một branch trong repository ở trên, thực hiện vài thay đổi, commit và merge branch đó vào branch master.
  1. Clone repository này từ khóa học của MIT, khám phá xem ai là người cuối cùng thay đổi file README.md và message đi kèm với commit đó là gì.
  1. Fork repository này, thực hiện vài thay đổi bất kỳ và submit pull request trên Github.