Giới thiệu

Bài viết này sẽ hướng dẫn, cung cấp cách tiếp cận từng bước để hiểu và sử dụng hiệu quả Git (phần mềm quản lý phiên bản mã nguồn phân tán) và Github (hệ thống quản lý dự án và phiên bản mã nguồn).
*phiên bản: bản sao của bản gốc (ví dụ: get 4.6.5 trong này "4" là thay đổi chính, "6" là thay đổi phụ, "5" là lần sửa lỗi)

Yêu cầu

Để bài viết có thể hiệu quả nhất, bạn hãy đảm bảo:

  • Bạn đã có tài khoản GitHub
  • Git đã được cài trên máy của bạn
  • Bạn có trình soạn thảo văn bản (Visual Studio Code, Visual Studio, IntelliJ,…)

Các lệnh thao tác với Git

  • branch: Sử dụng lệnh git branch để tạo nhánh mới hoặc xem danh sách các nhánh hiện có.
  • Commit: Lệnh git commit được dùng để ghi lại các thay đổi đã được staged trong kho lưu trữ của bạn.
  • Stage: Lệnh git add để thêm các thay đổi vào khu vực staging(một không gian tạm thời nơi bạn có thể thêm các thay đổi mà bạn muốn chuẩn bị cho một lần commit) trước khi commit.
  • Merge: Lệnh git merge để tích hợp các thay đổi từ một nhánh khác vào nhánh hiện tại.
  • Pull Request: Đề xuất một yêu cầu pull trên GitHub để yêu cầu tích hợp các thay đổi từ nhánh của bạn vào một nhánh khác.
  • Fork: Tạo một bản sao của repository từ người khác về tài khoản GitHub của bạn.
  • Clone: Lệnhgit clone để sao chép một repository từ xa về máy tính của bạn.
  • Remote: Sử dụng git remote để quản lý các kết nối đến các repository từ xa.
  • Origin: Thường là tên mặc định cho repository từ xa mà bạn đã clone về.
  • Upstream: Repository gốc mà từ đó bạn đã fork hoặc clone repository.
  • Master/Main: Tên của nhánh chính của dự án, chứa mã nguồn chính thức.
  • Repository: Kho lưu trữ chứa toàn bộ mã nguồn và lịch sử phiên bản của dự án.
  • Working Directory: Thư mục trên máy tính nơi bạn thực hiện các thay đổi.
  • Staging Area/Index: Khu vực tạm thời nơi các thay đổi được chuẩn bị cho commit.
  • HEAD: Tham chiếu đến commit cuối cùng trong nhánh hiện tại.
  • Checkout: Lệnh git checkout để chuyển đổi giữa các nhánh hoặc phiên bản cụ thể.
  • Push: Lệnh git push để gửi commit của bạn lên repository từ xa.
  • Pull: Lệnh git pull để kéo các thay đổi từ repository từ xa và gộp chúng vào nhánh hiện tại.
  • Fetch: Lệnh git fetch để lấy các cập nhật từ repository từ xa mà không thực hiện merge ngay lập tức.
  • Stash: Lệnh git stash trong Git được sử dụng để lưu lại các thay đổi hiện tại trong thư mục làm việc và khu vực staging mà không cần phải commit.
  • Status: Lệnh git status trong Git được sử dụng để hiển thị trạng thái hiện tại của thư mục làm việc và khu vực staging.

Tạo một kho lưu trữ bằng trang web Github

Để có thể lưu trữ code của bạn ở Github, bạn cần tạo 1 repository trên trang web Github. Sau đây là các bước tạo 1 repository trên trang web Github:

  • Bạn truy cập vào mục your repository bằng cách ấn đúp vào logo tài khoản của bạn ở góc cùng bên phải.

picRepo

  • Sau đó chọn New ở ô màu xanh bên góc phải

picRepoNew

Nhập tên dự án mà bạn muốn tạo, hiện tại github mặc định dự án khởi tạo Public tức là ai cũng có thể truy cập và xem dự án này của bạn. Còn nếu bạn muốn nó riêng tư, không được bạn phân quyền truy cập thì sẽ không thấy thì chọn lại vào ô Private, cuối cùng nhấp đúp vào Create repository để tạo dự án trên Github.

picCreateRepo

Sau khi bạn tạo dự án, Github sẽ có giao diện như sau:

picCreatedRepo

Kết nối kho lưu trữ từ local với kho lưu trữ từ xa (dự án trên Github).

  • Ở terminal của dự án, bạn nhập lệnh git init để khởi tạo dự án git

gitInit

  • git add README.md : Lệnh này thêm tệp README.md vào khu vực staging, chuẩn bị để commit. Lệnh này có nghĩa là bạn đã sẵn sàng để Git theo dõi thay đổi trong tệp README.md.

gitadd

  • git commit -m "first commit": Lệnh này tạo một commit mới với thông điệp “first commit”. Commit này ghi lại tất cả các thay đổi đã được staged (ở đây là README.md).

gitCommit

  • git branch -M main: lệnh này tạo 1 nhánh để bạn có thể đẩy code và lưu trữ code ở đây.

gitBranchMain

  • git remote add origin https://github.com/nguyendao2101/GitAndGitHub.git: Lệnh này thêm một remote repository với tên origin, liên kết đến URL của repository GitHub mà bạn đã tạo (địa chỉ URL này là nơi bạn sẽ đẩy mã nguồn của mình lên).

gitRemote

  • git push -u origin main: Lệnh này đẩy các commit trên nhánh main lên remote repository origin

gitMain

Cách kéo các thay đổi code từ xa (Github) về kho lưu trữ cục bộ (local)

Ở đây nếu dự án của bạn có nhiều branch khác nhau thì bạn nên kiểm tra xem bạn đang ở branch nào có đúng là branch mà bạn muốn kéo code về hay không.

gitbranch

Như ở đây hiện tôi đang ở branch “new_main”, nhưng lại muốn kéo code từ nhánh “main” về thì phải chuyển sang nhánh “main” mới có thể kéo code về được. Để chuyển nhánh, bạn nhập lệnh git checkout main

gitcheckoutmain

Cuối cùng, bạn nhập lệnh git pull để kéo các thay đổi code từ xa (Github) về máy của mình (local).

gitpull

Cách kiểm tra trạng thái của nhánh hiện tại

Lệnh hiển thị trạng thái của nhánh hiện tại, bao gồm mọi thay đổi đã được thực hiện đối với các tệp trong kho lưu trữ. Nó cung cấp thông tin về các tệp nào đã được sửa đổi, tệp nào đã được dàn dựng và tệp nào không được theo dõi.

git status

gitstatus

Cách thêm tệp vào khu vực staging(nơi lưu tạm thời trước khi commit)

Bạn có thể thêm toàn bộ file bằng cách sử dụng git add .hoặc git add để thêm từng file một

git add .

git add <file name>

Cách commit tệp

Lệnh commit này ghi lại tất cả các thay đổi đã được staged (đã được lưu ở staging trước đó)

git commit -m "commit file name"

gitCommitM

ở đây “-m” có nghĩa là tạo 1 commit với thêm một thông điệp.

Cách đẩy code lên kho lưu trữ từ xa

Lệnh push này sẽ đẩy các code mà bạn đã commit trước đó lên kho lưu trữ từ xa (Github)

git push origin HEAD:main

gitpushorigin

Ở đây, “origin” là tên của remote repository mà bạn muốn đẩy mã nguồn đến, bạn có thể tự tạo 1 remote này của riêng mình. “HEAD” là một con trỏ đặc biệt trong Git, nó chỉ đến commit hiện tại trên nhánh hiện tại mà bạn đang làm việc.

Cách tạo nhánh

Phân nhánh là một khái niệm cơ bản trong Git. Nó cho phép bạn chuyển hướng khỏi dòng phát triển chính và tiếp tục làm việc mà không ảnh hưởng đến cơ sở mã chính.

Các cách tạo nhánh:
Cách 1: Sử dụng câu lệnh git branch <tên nhánh mới> . Tuy nhiên nếu bạn sử dụng câu lệnh này thì bạn vẫn sẽ ở branch mà bạn đang tiến hành tạo branch mới mà không tự chuyển sang branch mà bạn vừa tạo. Nếu muốn chuyển sang branch mới tạo bạn phải sử dụng thêm lệnh git checkout <tên nhánh mới>.

git branch chat_bot

gitbranch1

Cách 2: Sử dụng câu lệnh git checkout -b <tên nhánh mới>. Ở câu lệnh này thì sẽ git sẽ tự động chuyển sang nhánh mới mà bạn vừa tạo.

git checkout -b add_conttacts

gitbranch2

Cách xóa nhánh

Giống như tạo nhánh, xóa nhánh cũng là một khái niệm cơ bản trong Git. Nó cho phép bạn có thể xóa những nhánh không còn sử dụng cũng như không cần thiết nữa.
Sử dụng câu lệnh git branch -d <tên nhánh xóa>, ở câu lệnh này sẽ xóa đi nhánh mà không còn sử dụng nữa một cách đơn giản. Lưu ý bạn không xóa được nếu bạn đang ở branch mà bạn muốn xóa, tức là bạn phải checkout sang 1 nhánh khác thì mới có thể xóa.

git branch -d <tên nhánh xóa>

gitbranchD

Cách tạo pull request

Pull request là một đề xuất hợp nhất các thay đổi từ nhánh này sang nhánh khác. Đó là một phương pháp được sử dụng rộng rãi để tạo và xem xét mã. Trong phần này, mình sẽ hướng dẫn bạn quá trình tạo pull request bằng cách sử dụng trang web GitHub.

Tạo 1 branch mới

git checkout -b new_main

Thay đổi trong file Readme.md

readme.md

Đẩy code lên Github

git add .
git commit -m "update file Readme.md"
git push orgin HEAD:new_main

Khi này bạn truy cập vào dự án của bạn trên github sẽ có thông báo như sau:

pullrequest

Bạn chọn vào Compare & pull request

detailPullrequet

Ở đây bạn có thể thêm các description. Sau đó bạn chỉ cần kéo xuống và chọnCreate pull request như vậy là đã thành công.

createpullrequest

Cách hợp nhất một Pull Request

Hợp nhất một pull request biểu thị sự tích hợp các thay đổi từ nhánh này sang nhánh khác, thường là nhánh chính. Bước này là mấu chốt trong quy trình làm việc cộng tác, cho phép đồng hóa các sửa đổi vào cơ sở mã chính.

Sau khi bạn đã tạo được pull request, Github sẽ hướng bạn đến màn hình như sau:

createpullrequest

Ở đây bạn chỉ cần kích đúp vào Merge pull requestConfirm merge

successMerge

Cách thêm “upstream” Remote

Nếu như dự án của bạn được fork từ một dự án khác, đây được gọi là “upstream”. Bạn cần thêm upstream remote chỉ đến repository gốc này.

git remote add upstream <URL của repository gốc>

git remote add upstream git@github.com:nguyendao2101/freechat.git

Cách lấy code mới nhất từ “upstream”

Sau khi đã thêm upstream remote, bạn cần lấy các thay đổi mới nhất từ repository gốc về máy local của mình.

git fetch upstream

Lệnh này sẽ lấy tất cả các nhánh (branches) và cập nhật chúng từ repository gốc, nhưng không thay đổi bất kỳ nhánh nào trong local repository của bạn.

Cập nhật nhánh local với “upstream”

Để cập nhật nhánh local của bạn với các thay đổi từ upstream, bạn cần thực hiện merge

git checkout main
git merge upstream/main

Lệnh này sẽ kết hợp các thay đổi từ upstream/main vào nhánh main của bạn.

Đẩy code từ local lên remote repository của bạn

Sau khi cập nhật nhánh local của bạn với upstream, bạn có thể đẩy các thay đổi này lên remote repository của bạn (thường được gọi là origin):

git push origin main

Lệnh này sẽ đẩy các thay đổi từ nhánh main của bạn lên repository trên GitHub mà bạn đang làm việc.

Tổng kết

Trong suốt hướng dẫn này, mình đã đi sâu vào các khái niệm cốt lõi của Git và GitHub, trang bị cho bạn sự hiểu biết mạnh mẽ về kiểm soát phiên bản và thực tiễn hợp tác. Chúc các bạn thành công.