Git là gì ?
Tổng quan
Git
là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS), là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. Git
cung cấp cho mỗi lập trình viên kho lưu trữ (repository) riêng chứa toàn bộ lịch sử thay đổi.
Lợi ích khi dùng
Các dự án thực tế thường có nhiều lập trình viên làm việc song song. Vì vậy, một hệ thống kiểm soát phiên bản như Git là cần thiết để đảm bảo không có xung đột code giữa các lập trình viên.
Ngoài ra, các yêu cầu trong các dự án như vậy thay đổi thường xuyên. Vì vậy, một hệ thống kiểm soát phiên bản cho phép các nhà phát triển revert và quay lại phiên bản cũ hơn của code.
Một số ưu điểm của Git:
- Dễ sử dụng, thao tác nhanh, gọn, lẹ, an toàn.
- Dễ dàng kết hợp các phân nhánh (branch), có thể giúp quy trình làm việc code theo nhóm đơn giản hơn.
- Chỉ cần clone mã nguồn từ kho chứa hoặc clone một phiên bản thay đổi nào đó từ kho chứa, hoặc một nhánh nào đó từ kho chứa là có thể làm việc ở mọi lúc mọi nơi.
- Deployment sản phẩm một cách dễ dàng.
3 trạng thái trong Git
Working Directory
Có thể hiểu là 1 bản sao phiên bản của dự án, nơi chúng ta đang thao tác các thay đổi với dữ liệu tại local . Ở đây, ta thay đổi file nhưng chưa commit vào cơ sở dữ liệu. Có thể hiểu chúng ta sẽ có các file data, nếu có bất kỳ thay đổi (thêm mới/chỉnh sửa/xóa bỏ) thì nó sẽ ở trạng thái “Modified”.
Staging Area
Đây là vùng chứa thông tin về những gì sẽ được commit trong lần commit sắp tới. Hiểu là vùng để chúng ta tổ chức các file thay đổi, đánh dấu (tracking) các file thay đổi sẽ được lưu lại thành 1 version khi commit. Nó như là cách để chúng ta giới hạn các file chúng ta cần quan tâm hoặc “suy nghĩ lại” có nên lưu trữ trong phiên bản sắp tới hay không.
Để đưa các file “Modified” vào vùng này thì chúng ta phải “Staged” bằng lệnh:
# Staged các file xác định:
$ git add <file name/path file>
ví dụ: git add helloWorld.txt
# Staged tất cả các file thay đổi/thêm mới hiện tại:
$ git add .
# Staged tất cả các file thay đổi/thêm mới/xóa bỏ hiện có:
$ git add -A
Git directory
Git Directory nơi Git lưu trữ các metadata và cơ sở dữ liệu cho dự án của bạn.
Để có được vùng này yêu cầu chúng ta phải khởi tạo (git init) ở tại thư mục làm việc mong muốn. Để đưa các file “staged” vào vùng này thì chúng ta phải thực hiện “commit”.
Cài đặt Git
Cài đặt trên Linux sử dụng Ubuntu
$ apt-get install git
Xem thêm hướng dẫn chi tiết tại trang download của GIT
Cấu hình danh tính của bạn
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
Một số khái niệm của Git
1. Repository
Repository là một kho chứa, lưu trữ dữ liệu của bạn
- Local repository: Là repository được lưu tại cục bộ (máy tính của bạn)
- Server repository (Remote repository): Là repository nhưng được lưu tại server của các hosting-service sử dụng Git (ví dụ: Github, GitLab, Bitbucket …)
Tạo một git repository:
$ git init
Sao chép Repository đã tồn tại:
$ git clone [url]
ví dụ: git clone https://github.com/example/hello.git
2. Commit
Commit: ghi lại Thay Đổi vào git repository. một version mới được tạo ra bằng cách tạo một “commit” cho các sự thay đổi của dữ liệu.
Tạo mới một commit:
$ git commit -m "Nội dung commit"
Lưu lại thay đổi nhưng ghi đè lên commit trước đó:
$ git commit --amend -m "Nội dung mới nếu có thay đổi"
Xem lại danh sách commit đã tạo, mỗi commit trên một dòng:
$ git log --oneline
Kiểm tra trạng thái của file:
$ git status
# On branch master
nothing to commit, working directory clean
Theo Dõi Các Tập file mới:
$ git add <file_name>
Xem thay đổi giữa working với stage:
$ git diff
Bỏ qua các file
Đưa danh sách các file không muốn theo dõi vào .gitignore.
3. Branch
Branch: Một nhánh trong Git là một con trỏ (index) có khả năng di chuyển được, trỏ đến một trong những commit.
Tạo mới branch:
$ git branch <branch_name>
vd: git branch testing
Để chuyển sang một nhánh đang tồn tại:
$ git checkout <branch_name>
vd: git checkout master
Để tạo một nhánh và chuyển sang nhánh đó đồng thời:
$ git checkout -b <branch_name>
vd: git checkout -b brand123
Xóa một nhánh:
$ git branch -d <branch_name>
vd: git branch -d brand123
4. Remote
Mỗi tham chiếu đến server repository được gọi là một remote
Mỗi remote sẽ có các thông tin:
- Tên remote
- URL: đường link của server repository (cung cấp 2 giao thức http hoặc ssh)
Thêm một remote:
$ git remote add <remote_name> <url>
vd: git remote add example git@github.com:sun/example.git
Xem danh sách remote:
$ git remote -v
Thay đổi url của remote:
$ git remote set-url <remote_name> <remote_url>
vd: git remote set-url example https://github.com/framgia/example.git
Thay đổi tên của remote:
$ git remote rename <old_name> <new_name>
vd: git remote rename example1 example2
Xóa một remote:
$ git remote remove <remote_name>
vd: git remote remove example
Một số lệnh cơ bản trong Git
1. Tạo mới một local repository
git init
2. Sao chép một Repository
Tạo bản sao hoạt động của kho lưu trữ cục bộ:
git clone /path/to/repository
vd: git clone example/MyProject
Đối với máy chủ từ xa, hãy sử dụng:
git clone username@host:/path/to/repository
vd: git clone git@github.com:example/project.git
3. Commit
Commit các thay đổi đối với head (nhưng chưa đến remote repository):
git commit -m "Commit message"
Commit bất kỳ tệp nào bạn đã thêm bằng git add và cũng commit bất kỳ tệp nào bạn đã thay đổi kể từ đó:
git commit -a
4. Push
Gửi các thay đổi đến nhánh master của remote repository:
git push origin master
5. Status
Liệt kê các tệp bạn đã thay đổi và những file bạn vẫn cần add hoặc commit
git status
6. Kết nối với một remote repository
Nếu bạn chưa kết nối local repository với máy chủ từ xa, hãy thêm máy chủ để có thể đẩy đến nó:
git remote add origin <server>
Liệt kê tất cả các remote repository:
git remote -v
7. Branch
Tạo một nhánh mới và chuyển sang nó:
git checkout -b <branchname>
vd git checkout -b branch1
Chuyển từ nhánh này sang nhánh khác:
git checkout <branchname>
vd: git checkout branch1
Liệt kê tất cả các nhánh trong repo của bạn và cũng cho bạn biết bạn hiện đang ở nhánh nào:
git branch
Xóa một nhánh
git branch -d <branchname>
Push nhánh vào remote repository để những người khác có thể sử dụng nó
git push origin <branchname>
Đẩy tất cả các nhánh vào kho lưu trữ từ xa của bạn:
git push --all origin
Xóa một nhánh trên remote reposiroty của bạn:
git push origin :<branchname>
8. Cập nhật từ remote repository
fetch và merge các thay đổi từ remote repo về thư mục làm việc của bạn:
git pull
merge một nhánh khác vào nhánh hiện tại của bạn
git merge <branchname>
Xem tất cả merge conflicts
git diff
Xem các conflict với file cơ sở:
git diff --base <filename>
Xem trước các thay đổi, trước khi merge
git diff <sourcebranch> <targetbranch>
9. Hoàn tác các thay đổi ở local
Nếu bạn làm lộn xộn, bạn có thể thay thế các thay đổi trong cây làm việc của mình bằng nội dung cuối cùng trong đầu: Các thay đổi đã được thêm vào chỉ mục, cũng như các tệp mới, sẽ được giữ lại.
git checkout -- <filename>
Để loại bỏ tất cả các commit và thay đổi ở local của bạn, hãy fetch code mới nhất từ server và trỏ nhánh master của bạn vào đó, hãy làm như sau:
git fetch origin
git reset --hard origin/master
10. Stash
Cho phép bạn chuyển nhánh khách khi đang làm việc mà không cần tạo commit để lưu lại sự thay đổi.
Để lưu lại những thay đổi đang làm dở, ta sử dụng lệnh:
$ git stash save
hay
$ git stash
Một số lệnh với stash:
- Xem danh sách stash:
git stash list
- Apply stash gần nhất và xóa stash đó:
git stash pop
- Apply stash:
git stash apply stash@{<index>}
- Xem nội dung stash:
git stash show stash@{<index>}
- Xóa stash:
git stash drop stash@{<index>}
Xóa toàn bộ stash:
git stash clear
11. git reset
Phân biệt git reset, git reset –hard, git reset –soft.
git reset.
Câu lệnh:
git reset HEAD~<index>
hoặc
git reset <commit_id>
Chức năng:
- Di chuyển HEAD về vị trí comit reset.
- Giữ nguyên tất cả các thay đổi của file đến vị trí hiện tại.
- Loại bỏ các thay đổi khỏi stage.
git reset –hard.
Câu lệnh:
git reset --hard HEAD~<index>
hoặc
git reset --hard <commit_id>
Chức năng:
- Di chuyển HEAD về vị trí commit reset.
- Loại bỏ tất cả sự thay đổi của file sau thời điểm commit reset.
git reset –soft
Câu lệnh:
git reset --soft HEAD~<index>
hoặc
git reset --soft <commit_id>
Chức năng:
- Di chuyển HEAD về vị trí commit reset.
- Giữ nguyên tất cả các thay đổi của file đến vị trí hiện tại. Giữ nguyên các thay đổi ở stage.
- Lệnh này chỉ di chuyển HEAD về vị trí commit. Trạng thái của stage và tất cả sự thay đổi của file sẽ được giữ nguyên.
Kết luận
Hy vọng với bài viết này bạn sẽ có thêm những thông tin hữu ích về GIT là gì? Và Các lệnh git cơ bản mà mọi lập trình viên nên biết.
Nếu có điều gì trong bài viết còn thiếu sót, mình mong nhận được những góp ý từ các bạn. Xin cảm ơn mọi người. 🥰😍🤩
Nguồn tham khảo
Nguồn: viblo.asia