Trong bài viết này, tôi giới thiệu một số thao tác cơ bản để làm việc với local repo và remote repo trong Git

Trước tiên, tôi tạo một repo trên Github: https://github.com/handuy/learn-git

Sau đó clone về máy, để ở Desktop:

$ git clone https://github.com/handuy/learn-git

Di chuyển vào thư mục learn-git, sau đó liệt kê tất cả các nhánh (local và remote) bằng lệnh git branch -a

$ cd learn-git
$ git branch -a
Không có branch nào
Không có branch nào

Không có branch nào là bởi trong local repo của tôi chưa có commit nào, trong khi branch về bản chất là một pointer trỏ đến một commit

Tất nhiên là ở remote repo cũng chưa có nhánh nào bởi nó chưa có commit nào, vẫn là repo rỗng

Giờ tôi sẽ tạo commit cho local repo. Có 2 cách:

- Tạo commit ở remote repo trên Github, sau đó pull về local

- Tạo trực tiếp trên local

Tôi làm theo cách 1:

Tạo file mới trên remote repo
Tạo file mới trên remote repo

 

Tạo commit ở remote repo
Tạo commit ở remote repo

Lúc này, trên remote repo đã có nhánh master:

Nhánh master mới tạo trên remote repo
Nhánh master mới tạo trên remote repo

Giờ tôi sẽ lấy commit từ remote repo về local repo. Lưu ý là lúc này local repo vẫn chưa có commit nào, chưa có branch nào:

$ git fetch origin master

Câu lệnh trên lấy toàn bộ commit ở branch master trên remote repo về local repo

Ở local repo, sau khi chạy lệnh git fetch ở trên, ta kiểm tra các nhánh bằng lệnh git branch -a:

Chỉ có nhánh origin/master, chưa có nhánh master ở local
Chỉ có nhánh origin/master, chưa có nhánh master ở local

Chưa có nhánh master ở local, đơn giản là bởi ta mới chỉ kéo commit từ nhánh master ở remote repo. Vậy các bạn hãy lưu ý: nhánh master ở remote repo khác với nhánh master ở local repo 

Giờ tôi sẽ chạy lệnh git merge origin/master, sau đó kiểm tra lịch sử commit ở local repo bằng lệnh git log

$ git merge origin/master
$ git log
Nhánh master ở local
Nhánh master ở local

Các bạn có thể thấy bây giờ ở local repo đã có nhánh master, nó đang trỏ đến commit có ID =  8a0007266, đây chính là commit mà tôi đã tạo ở remote repo trên Github:

 

Commit 8a0007266 trên Github repo
Commit 8a0007266 trên Github repo

Các bạn có thể sử dụng extension Git Graph của Visual Studio Code để xem lịch sử local repo:

2 nhánh master (local) và origin/master (remote) đều trỏ đến cùng 1 commit
2 nhánh master (local) và origin/master (remote) đều trỏ đến cùng 1 commit

 Bản chất khi chạy lệnh git merge origin/master ở trên thì git sẽ tạo một con trỏ master trỏ luôn đến commit 8a000726

Giờ tôi sẽ làm ngược lại, tạo một commit ở local repo rồi push lên remote repo trên Github

Trước tiên, tôi kiểm tra trạng thái repo learn-git:

$ git status
master (local) và origin/master(remote) đều đang trỏ trỏ đến cùng 1 commit
master (local) và origin/master(remote) đều đang trỏ trỏ đến cùng 1 commit

On branch master. Your branch is up to date with origin/master: Dòng thông báo này chỉ ra rằng 2 nhánh master (local) và origin/master(remote) đều đang trỏ đến cùng 1 commit

Giờ tôi tạo một file style.css:

$ touch style.css

và commit vào nhánh master ở local repo:

$ git add .
$ git commit -m "tạo file style.css ở local repo"

và kiểm tra trạng thái repo bằng git status:

Nhánh master (local) giờ có 2 commit trong khi origin/master(remote) vẫn chỉ có 1
Nhánh master (local) giờ có 2 commit trong khi origin/master(remote) vẫn chỉ có 1

On branch master. Your branch is ahead of origin/master by 1 commit: Thông báo này chỉ ra rằng giờ nhánh master ở local đang có 2 commit, trong khi origin/master ở remote vẫn chỉ có 1. Các bạn có thể kiểm tra bằng Git Graph:

master (local) đang trỏ đến commit b657dfc2, trong khi origin/master vẫn ở commit cũ
master (local) đang trỏ đến commit b657dfc2, trong khi origin/master vẫn ở commit cũ

Vậy làm thế nào để origin/master cũng trỏ đến commit b657dfc2, hay nói một cách "văn hoa" hơn là làm thế nào để đồng bộ hoá 2 nhánh master (local) và origin/master (remote) ? Ta sử dụng lệnh git push như sau:

$ git push origin master
Đẩy các commit ở nhánh master (local) lên origin/master (remote)
Đẩy các commit ở nhánh master (local) lên origin/master (remote)

Trong lệnh git push origin master ở trên thì:

- push: đẩy các commit từ local repo lên remote repo

- origin: địa chỉ của remote repo. Các bạn có thể kiểm tra bằng lệnh git remote -v

origin trỏ đến Github repo learn-git
origin trỏ đến Github repo learn-git

- master: nhánh master ở local

Sau khi chạy lệnh git push origin master, chúng ta lại dùng Git Graph để xem lịch sử:

origin/master (remote) giờ cũng đã trỏ đến commit b657dfc2
origin/master (remote) giờ cũng đã trỏ đến commit b657dfc2

Các bạn lên Github repo để kiểm tra:

Xem lịch sử commit trên Github repo
Commit ở local đã được đẩy lên Github

Như vậy, trong bài viết này, tôi đã sử dụng các lệnh sau để tương tác giữa local repo và remote repo:

- git clone: Download một remote repo về máy

- git branch -a: Liệt kê tất cả các branch, cả local lẫn remote

- git fetch origin master: Lấy toàn bộ các commit của nhánh master trên remote repo về local repo

- git merge origin/master: Merge các commit ở nhánh origin/master (remote) vào nhánh master (local)

- git push origin master: Cập nhật nhánh origin/master (remote) bằng cách đẩy các commit từ local repo lên remote repo