Tôi học lại Git từ đầu [Phần 1]
Châm ngôn của mình là học để kiếm tiền.
Vì thế mình build các khóa học của mình để giúp anh em tiến bộ nhanh hơn x10 lần , để kiếm được nhiều tiền hơn
- 🏆 React.js Super: Trở thành React.js Developer trong 7 ngày với mức thu nhập 20 triệu/tháng
- 🏆 Node.js Super: Giúp bạn học cách phân tích, thiết kế, deploy 1 API Backend bằng Node.js
- 🏆 Next.js Super: Mình sẽ chia sẻ từ A-Z kiến thức về Next.js, thứ giúp mình kiếm hơn 1 tỉ/năm
Target bài này là các bạn sẽ nắm được Git căn bản, có thể tự quản lý code của bản thân.
Còn muốn làm việc ở các cty, doanh nghiệp ở ngoài thì các bạn đọc tiếp phần 2 nhé, chúng ta sẽ đi sâu hơn về git nâng cao.
Cho bạn nào chưa biết thì Git là một phần mềm quản lý mã nguồn - tức là quản lý code đấy.
Git khác Github nha, Github là dịch vụ tích hợp Git, nếu chỉ sử dụng Git thôi thì chúng ta chỉ có thể quản lý mã nguồn trên máy tính cá nhân thôi, còn kết hợp với Github thì có thể quản lý được trên server của Github nữa (2 phiên bản => an toàn hơn).
💡 Mẹo:
Git và Github cũng như Porn và Pornhub vậy 🤭
Ok, let's go!!!
🥇1. Khởi tạo Repository trên máy tính với git init
Repository (Repo) là nơi chứa mã nguồn dự án của bạn. Để khởi tạo một Git Repo trên local thì dùng câu lệnh
git init
Sau khi khởi tạo thì bạn sẽ thấy một thư mục ẩn tên là .git
.
💡 Mẹo:
Lưu ý: Code của bạn phải nằm chung thư mục chứa folder
.git
thì code của bạn mới được quản lý bởi Git!
Có 2 loại repository:
- Local repository: Repo trên máy tính
- Remote repository: Repo trên server như Github
🥇2. Config name và email cho git với git config
Git có 2 loại config đó là local
và global
. Local là dành riêng cho dự án, còn Global là cho cả máy tính, nếu không config local thì Git sẽ tự động dùng config của global.
Để xem các config ở local (bạn phải ở trong thư mục được quản lý bởi git thì mới có thể chạy câu lệnh này)
git config --local --list
- Để xem các config ở global
git config --global --list
- Đầu tiên thì chúng ta cần config cho git biết chúng ta là ai khi mà đưa code lên
git config --global user.name "Du Thanh Duoc"
git config --global user.email duthanhduoc@gmail.com
💡 Mẹo:
Lưu ý: Với terminal sử dụng Git bash thì khi dùng tiếng Việt với Unikey nó sẽ dễ bị lỗi. Nên chuyển Unikey sang tiếng Anh nhé.
Github nó sẽ dựa vào email mà bạn config ở local để định danh bạn khi bạn thay đổi code trên Github. Vậy nên khi bạn config một email không giống email mà bạn đăng ký trên Github thì khi gửi code lên Github bạn sẽ thấy một user khác chứ không phải bạn!
🥇3. Hiển thị trạng thái với git status
git status
Câu lệnh git status
này sẽ hiển thị
- Bạn đang ở branch nào
- Trạng thái branch của bạn so với origin như thế nào (cái này nhiều lúc không chính xác vì dữ liệu đã được thay đổi trên origin, muốn chính xác thì phải
git fetch
để tải về dữ liệu mới nhất) - Trạng thái các file trong dự án, file nào đang được git track (theo dõi)
🥇4. Các khu vực làm việc với Git
Chúng ta sẽ có các khu vực theo thứ tự dưới đây
- Khu vực làm việc: Chính là nơi chúng ta đang code, vẫn ở local
- Khu vực staging: Sau khi dùng
git add
thì file sẽ được đưa lên khu vực này, vẫn ở trên local - Khu vực committed: Sau khi dùng
git commit
thì file từ staging sẽ được đưa lên đây, cũng vẫn ở trên local - Khu vực remote (gọi origin cũng được): Sau khi dùng
git push
sẽ file ở commited lên đây, bây giờ file của bạn đã đưa lên trên server
🥇5. Thêm file vào khu vực Staging với git add
Câu lệnh dưới đây sẽ thêm một hoặc nhiều file (đã thay đổi) vào khu vực Staging.
Thêm 1 file
git add index.html
💡 Mẹo:
Lưu ý: Các file của bạn phải thay đổi gì đó thì mới add vào được nha
Thêm nhiều file
git add index.html app.js
Thêm tất cả các file.
git add .
💡 Mẹo:
Lưu ý nếu bạn ở thư mục con thì nó chỉ thêm tất cả các file ở thư mục con thôi.
🥇6. Khôi phục những file ở khu vực Staging về khu vực code với git reset
Ngược lại với git add
thì git reset
sẽ đưa một hoặc nhiều file ở khu vực Staging trở về khu vực code.
Khôi phục 1 file từ staging về khu vực code
git reset index.html
Khôi phục nhiều file
git reset index.html app.js
Khôi phục tất cả các file.
git reset .
🥇7. Commit code với git commit
Câu lệnh dưới đây sẽ đính kèm các title khi bạn thực hiện những thay đổi trong dự án. Nó có tác dụng với những file trong khu vực Staging.
git commit -m "Tôi thay đổi dòng này vì nó xảy ra tình trạng vòng lặp vô tận"
💡 Mẹo:
Lưu ý có một số terminal bắt buộc bạn phải dùng dấu nháy kép "" chứ không được dùng dấu nháy đơn ''. Còn một số terminal thì dùng cả 2 đều được.
Trong trường hợp bạn muốn đính kèm thêm description để mô tả thêm cho title thì bạn có thể dùng 2 cách
Cách 1:
git commit -m "Title" -m "Description"
Cách 2: Bạn gõ thiếu dấu "
khi kết thúc mô tả commit dòng đầu và nhấn Enter, nó sẽ cho bạn xuống dòng, tiếp theo bạn sẽ gõ tiếp mô tả và kết thúc bằng dấu "
là được.
git commit -m "Title
> Description"
🥇8. Tạo và clone remote repo với HTTPS và SSH
Clone nghĩa là download repo ở remote về máy tính cá nhân.
🥈8.1. Clone với Https
Mở remote repo trên github lên, click vào "Code" chọn "HTTPS" và copy đường link
Mở terminal lên paste đường link đó kèm với câu lệnh
git clone
, ví dụ:bashgit clone https://github.com/dreact04072022/git-can-ban.git
Trong trường hợp repo đó ở chế độ public thì không sao, nếu repo đó ở chế độ private hoặc ở public nhưng bạn muốn có quyền push code lên remote repo đó thì bạn phải nhập username và mật khẩu vào khi clone. Ví dụ:
bashgit clone https://username:password@github.com/dreact04072022/git-can-ban.git
🥈8.2. Clone với SSH
Clone với SSH thì bạn cần làm 2 thứ
Tạo SSH key và add vào github (xem phần tiếp theo)
Copy đường link SSH trên Github repo rồi chạy câu lệnh
git clone
là được
git clone git@github.com:dreact04072022/git-can-ban.git
Clone với SSH tiện lợi hơn giao thức HTTPS vì bạn không cần nhập username và mật khẩu mỗi khi clone, (https dễ làm lộ thông tin). Bạn cũng chỉ cần tạo SSH key và add vào 1 lần duy nhất, những lần sau chỉ cần chạy git clone
là được rồi.
🥈8.3. Tạo SSH key
- Đầu tiên mở terminal Gish Bash lên
- Paste text bên dưới, thay thế email là địa chỉ email Github của bạn
ssh-keygen -t ed25519 -C "your_email@example.com"
Điều này sẽ tạo một SSH key mới, sử dụng email đã được cung cấp như một nhãn trong SSH key (bạn có thể mở public key của SSH key lên sẽ thấy email trong đó)
Nó sẽ yêu cầu bạn nhập tên file để lưu, nếu bạn enter thì nó sẽ lấy tên file mặc định như trong dấu (). Lưu ý là khi nhập tên file phải nhập đầy đủ đường dẫn lưu file tương tự như trong dấu () nhé.
Enter file in which to save the key (/c/Users/dutha/.ssh/id_ed25519):
Tiếp theo nó sẽ yêu cầu bạn nhập passphrase (tương tự password thôi). Cá nhân mình thì không nhập, cứ Enter thôi vì khi nhập sau này mỗi khi làm việc với Git phải nhập passphrase khá mệt
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Sau khi tạo thành công thì nó sẽ sinh ra cho bạn 2 file là private key và public key theo đường dẫn mà bạn nhập tên file. File chứa public key sẽ có đuôi .pub
phía sau.
Your identification has been saved in /c/Users/dutha/.ssh/id_ed25519
Your public key has been saved in /c/Users/dutha/.ssh/id_ed25519.pub
Để đọc nội dung public SSH key thì bạn chỉ có khá nhiều cách, bạn dùng cách nào dưới đây cũng được. Ví dụ file public key của mình bên trên là id_ed25519.pub
- Copy đường dẫn này
c:/Users/dutha/.ssh/id_ed25519.pub
bỏ lên Chrome thì nó sẽ ra nội dung của public key - Dùng git bash gõ
cat /c/Users/dutha/.ssh/id_ed25519.pub
Lưu ý: Nếu mọi người đổi tên file khác tên mặc định thì có thể Git nó sẽ không tự động tham chiếu đến cái file đó mỗi khi nó cần xác thực ssh key. Một số tên ssh key mặc định như: id_ed25519
, id_rsa
Lúc này mọi người cần tạo thêm 1 file tên là config
(không có đuôi mở rộng) nằm trong thư mục .ssh
có dạng như sau.
Ví dụ như dưới đây, sửa id_duthanhduoc10
thành tên file private ssh key của bạn là được
#Default GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_duthanhduoc10
🥈8.4. Tiến hành thêm SSH key vào Github
Github, Gitlab hay Bitbucket đều có chỗ thêm SSH public key vào.
Thêm vào là để mỗi lần clone repo từ Github ở máy tính cá nhân của chúng ta thì chúng ta không cần nhập username hay password, vì Github nó tự xác thực qua ssh.
Copy SSH public key
Nếu SSH public key có một tên khác thì nhớ sửa lại cho đúng nhé. Khi copy đừng thêm bất cứ dòng mới hay khoảng trắng nào
Mình dùng git bash để copy
bashclip < ~/.ssh/id_ed25519.pub
💡 Mẹo:
Tips: Câu lệnh trên sẽ copy public key và clipboard, nếu
clip
không hoạt động, anh em có thể mở file ssh public key trong folder.ssh
bằng text edior rồi copy cũng được.Click vào góc phải trên cùng của avatar trang github của các bạn, sau đó chọn Settings
Trong khu vực sidebar "Access", click chọn SSH và GPG keys.
Click New SSH key hoặc Add SSH key
Nhập mô tả bất ký cho trường "Title", ví dụ "Laptop cá nhân"
Chọn loại key tại "Key Type", ở đây cứ để mặc định là "Authentication Key"
Paste key của bạn vào trường "Key"
Click vào Add SSH key
Nếu có hỏi gì thì xác nhận tài khoản Github là xong.
🥈8.5. Kiểm ta SSH key đã kết nối github thành công hay chưa
Mở Git bash
Nhập dòng này vào và enter
ssh -T git@github.com
Có thể bạn sẽ thấy cảnh báo này, cứ gõ "yes" và enter thôi.bash> The authenticity of host 'github.com (IP ADDRESS)' can't be established. > RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. > Are you sure you want to continue connecting (yes/no)?
Xác nhận fingerprint có giống lúc tạo shh key hay không. Nếu đúng thì gõ
yes
:bashHi username You've successfully authenticated, but GitHub does not provide shell access.
Kiểm tra lại coi thông báo có đúng username tài khoản github của bạn hay không. Nếu đúng thì đã thành công, nếu sai thì kiểm tra lại public key bạn add vào github có thể bị sai.
🥈8.6. Trường hợp bạn tạo SSH key với passphrases
Với SSH key, nếu ai đó truy cập được vào máy tính của bạn thì có thể truy cập được vào github và thay đổi mã nguồn của bạn. Bạn cũng có thể thêm passphrase vào SSH key của bạn để tăng cường tính bảo mật. Khi bạn thêm như vậy thì mỗi lần bạn push code thì nó Git đều yêu cầu bạn nhập passphrase, bạn cũng có thể dùng ssh-agent
để chỉ nhập passphrase 1 lần trong phiên làm việc đó thôi.
Thông tin đầy đủ về làm việc với SSH key passphrase tại đây
🥉Thêm hoặc thay đổi passphrase
Nếu bạn tạo SSH key với passphrase thì không cần quan tâm cái này, còn nếu lúc tạo bạn không có passphrase, giờ muốn thêm hoặc thay đổi thì chỉ cần gõ theo lệnh dưới
Lưu ý thay thế tên id_ed25519
cho đúng tên file private key của bạn nhé
$ ssh-keygen -p -f ~/.ssh/id_ed25519
> Enter old passphrase: [Type old passphrase]
> Key has comment 'your_email@example.com'
> Enter new passphrase (empty for no passphrase): [Type new passphrase]
> Enter same passphrase again: [Repeat the new passphrase]
> Your identification has been saved with the new passphrase.
Nếu key của bạn có passphrase, bạn sẽ bị yêu cầu enter passphrase cũ trước khi có thể thay đổi
🥉Thêm SSH key vào ssh-agent
Để khởi động ssh-agent thì có 2 cách đó là mỗi lần mở Git bash thì bạn phải khởi động nó hoặc bạn setting cho nó tự khởi động mỗi khi bạn mở Git bash
Khởi động ssh-agent
Mở Git bash lên và chạy câu lệnh dưới
bash$ eval "$(ssh-agent -s)" > Agent pid 59566
Tiến hành thêm SSH private key vào ssh-agent. Thay thế tên
id_ed25519
cho đúng với tên private key của bạn nhé.bashssh-add ~/.ssh/id_ed25519
Tiến hành thêm SSH key vào tài khoản Github của bạn. Nếu bạn đã thêm rồi thì thôi.
💡 Mẹo:
Tip: Câu lệnh
ssh-add
sẽ tương đươngssh-add ~/.ssh/id_rsa
. Đôi lúc muốn check ssh-agent có đang chạy hay chưa thì chỉ cần chạy câu lệnhssh-add ~/.ssh/id_ed25519
(nhớ thay đường dẫn cho đúng với private key của bạn nhé) nếu kết quả nó làCould not open a connection to your authentication agent.
thì ssh-agent chưa chạy, còn nếu nó yêu cầu nhập passphrase hay "Identity added..." thì nghĩa là đã chạy rồi.
🥇9. Dùng nhiều tài khoản Github trên cùng một máy tính
Tạo 1 file tên là config
trong thư mục ~/.ssh/
Viết nội dung file này tương tự như nội dung bên dưới
#Default GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
#React-Awesome duthanhduoc06
Host github-duthanhduoc06.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_duthanhduoc06
Ở trên thì mình có dùng 2 tài khoản Github, cái đầu tiên dùng với private key là id_rsa
với Host là github.com
, cái thứ hai là id_rsa_duthanhduoc06
với Host là github-duthanhduoc06.com
.
Khi mình clone những repo thuộc quyền của tài khoản github đầu tiên thì mình vẫn giữ nguyên link github.com nhưng nếu mình clone những repo thuộc quyền sở hữu của tài khoản thứ hai thì mình phải thay đổi thành như thế này
git clone git@github-duthanhduoc06.com:dreact04072022/git-can-ban.git
Tương tự với những câu lệnh như git remote add origin git@github-duthanhduoc06.com:dreact04072022/git-can-ban.git
🥇10. Đẩy code lên git server với git push
Muốn đẩy code của bạn lên server thì local repo phải được liên kết với remote repo. Có 2 cách để bạn liên kết:
- Bạn chưa có local repo, bạn tiến hành clone một remote repo về máy tính thì lúc này bạn sẽ có được local repo
- Bạn có local repo nhưng chưa có remote repo, lúc này bạn cần tiến hành tạo một remote repo mới hoàn toàn và tiến hành liên kết nó với local repo của bạn.
Nếu bạn đang ở nhánh master, câu lệnh dưới đây sẽ đẩy code của bạn lên nhánh master ở remote repo (hay còn gọi là origin master)
git push origin master
💡 Mẹo:
Mặc định đối với nhánh master thì bạn chỉ cần
git push
là được rồi vì git nó tự hiểu là bạn đang push lên orgin master.
🥇11. Hiển thị log commit với git log
Hiển thị những thông tin commit gần đây. Các bạn nhân phím "q" để quit (thoát)
git log
Một số phím chức năng bạn có thể nhập đề điều hướng và tìm kiếm trong log như:
- Enter - dòng tiếp theo
- w - trang tiếp
- spacebar - trang trước
- ?pattern - tìm kiếm, với pattern là mẫu tìm kiếm (keyword)
- /pattern - giống ?pattern
- n - đến vị trí tìm kiếm phía dưới
- N - đến kết quả tìm kiếm phía trước
- q - thoát
Nếu muốn nhìn thấy thông tin rút gọn thì
git log --oneline
🥇12 Kéo code từ remote repo về với git pull
Trong những trường hợp code trên remote repo có những thay đổi và cập nhật, bạn có thể cập nhật những thay đổi này trên local repo của bạn cho giống như trên remote repo.
Câu lệnh dưới đây sẽ pull code từ nhánh master về nhánh hiện tại của bạn ở local
git pull orgin master
💡 Mẹo:
Mặc định đối với nhánh master thì bạn chỉ cần
git pull
là được rồi vì git nó tự hiểu là bạn đang pull từ orgin master.
🥇13 Bỏ qua file với .gitignore
Có những file chúng ta không muốn bị git giám sát thì chỉ cần tạo file .gitignore
và thêm các file và folder vào file .gitignore
này.
.gitignore
# Comment
node_modules/
.logs
Những trường hợp phổ biến dùng .gitignore
- ignore thư mục node_modules vì thư mục này rất nặng gây tốn thời gian pull và push code. Ngoài ra còn tốn tài nguyên git, ai muốn có node_modules thì chỉ cần chạy npm hoặc yarn là có ngay.
- ignore các thư mục build như
dist
. Ai muốn có các file build thì chỉ cần chạy câu lệnh build là được, không cần gửi lên git thư mục này làm gì - ignore các file cấu hình trên máy tính cá nhân mà không muốn xuất hiện ở các máy thành viên khác
Cách viết .gitignore
- Comment thì dùng
#
- Ignore file:
example.exe
- Ignore cả thư mục:
folder/
, tất nhiên là bạn dùngfolder
cũng được nhưng nên thêm/
để phân biệt với file - Phủ định thì thêm
!
:!folder/file.exe
- Ignore tất cả các file có đuôi là
.exe
:*.exe
- Ignore tất cả các file có tên bắt đầu là log:
log*
- Ignore tất cả các file có đuôi là
.exe
ở theo đường dẫnfolder/file.exe
(các file ở đường dẫnfolder/sub/file.exe
sẽ không bị ignore):folder/**.exe
- Ignore tất cả các file có đuôi là
.exe
ở thư mụcfolder
dù cho có nằm ở sub-folder đi chăng nữa:folder/**/**.exe
- Ignore mọi thứ bên trong thư mục folder:
folder/**
🥈Xử lý Git cache
Trong một số trường hợp bạn code một thời gian rồi, push pull các kiểu rồi, sau đó bạn mới thêm các file vào .gitignore
, lúc này những file đó có thể không bị ignore vì nó đã bị git cache từ trước và git nó vẫn quản lý những file này. Cách giải quyết là hãy xóa những file đó ra khỏi cache
git rm -r --cached /đường-dẫn-file-hoặc-folder
🥇14. Tạo file README.md
ReadMe là file giới thiệu về dự án, cũng là file mô tả cấu trúc hoặc doc của dự án.
Để tạo và sử dụng ReadMe file thì bạn chỉ cần
- Tạo file có tên là
README.md
trong thư mục root của repo - Thêm nội dung cho file với cú pháp Markdown.
- Khi hoàn thành thì có thể push lên remote repo và xem thành quả
🥈Markdown là gì?
Markdown là ngôn ngữ đánh dấu với cú pháp khá tương đồng với HTML. Nó có thể dễ dàng chuyển thành HTML và nhiều định dạng khác. Markdown rất thân thiện với developer và viết markdown cũng rất dễ.
Tham khảo cách viết tại: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax
🥇15. Giải quyết conflict code
Code bị conflict khi code trên local branch khác xung đột với remote branch, vấn đề này xảy ra khi có ai đó đã cập nhật 1 đoạn code trên remote branch và bạn cũng cập nhật đoạn đó trên local branch.
Lúc này git sẽ không cho phép bạn push code lên, bạn phải pull code trên remote branch về và lựa chọn xem nên chọn những đoạn code nào.
Thứ tự thường dùng:
- Pull code mới nhất trên remote branch về bằng
git pull
- Giải quyết conflict bằng tay, thảo luận với những người liên quan đoạn code xung đột nên chọn cái nào.
- Add file xung đột vào khu vực staging
git add TenFile
. Hoặc có thểgit add .
cũng được - Commit cho những file xung đột đó và push code lên
Kiến thức trong khóa học Next.js này đã giúp mình kiếm hơn 1 tỉ đồng/năm
Phew! Cuối cùng bạn cũng đã đọc xong. Bài viết này có hơi dài một tí vì mình muốn nó đầy đủ nhất có thể 😅
Website bạn đang đọc được viết bằng Next.js TypeScript và tối ưu từng chi tiết nhỏ như SEO, hiệu suất, nội dung để đảm bảo bạn có trải nghiệm tốt nhất.
Với lượt view trung bình là 30k/tháng (dù website rất ít bài viết). Website này đem lại doanh thu 1 năm vừa qua là hơn 1 tỉ đồng
Đó chính là sức mạnh của SEO, sức mạnh của Next.js.
Mình luôn tin rằng kiến thức là chìa khóa giúp chúng ta đi nhanh nhất.
Mình đã dành hơn 6 tháng để phát triển khóa học Next.js Super | Dự án quản lý quán ăn & gọi món bằng QR Code. Trong khóa này các bạn sẽ được học mọi thứ về framework Next.js, các kiến thức từ cơ bản cho đến nâng cao nhất, mục đích của mình là giúp bạn chinh phục mức lương 25 - 30 triêu/tháng
Nếu bạn cảm thấy bài viết này của mình hữu ích, mình nghĩ bạn sẽ thích hợp với phong cách dạy của mình. Không như bài viết này, khóa học là sự kết hợp giữa các bài viết, video, bài tập nhỏ và dự án lớn có thể xin việc được ngay. Học xong mình đảm bảo bạn sẽ lên tay ngay. 💪🏻