Việc quản lý version là một việc rất quan trọng trong quá trình phát triển phần mềm, nhưng phần lớn các kỹ sư lại có nhận thức không đúng khi bắt tay vào sử dụng.
Trong bài viết này tôi sẽ giới thiệu khái quát về tất tần tật những câu lệnh Git mà tôi sử dụng hằng ngày và phân chúng theo từng khái niệm và từng trường hợp sử dụng.
Tôi cũng sẽ đề cập tới những vấn đề mà nhiều bạn junior gặp phải khi dùng Git và cách để tránh chúng. Tôi nhận thấy rằng việc dạy về Git tại nhiều trường đại học (kể cả trường tôi tốt nghiệp) khá kém, nên tôi đã thấy nhiều trường hợp sử dụng Git một cách mơ hồ trong quá trình làm việc. Vì vậy, bạn hãy cùng tôi tìm hiểu và học cách sử dụng Git một cách chỉnh chu hơn và giữ cho team của bạn cảm thấy vui vẻ hơn khi làm việc cùng nhau.
Pushing Code Changes
Những thay đổi trong việc push code (đưa code lên)
Status
Git sẽ liên tục theo dõi những thay đổi khi bạn thực hiện các thay đổi trên môi trường local. Để biết được những điểm thay đổi đó trông như thế nào, bạn sẽ thực hiện command dưới đây:
Git status
Command này rất quan trọng, bởi vì nó sẽ ảnh hưởng đến những gì bạn làm với 2 commands tiếp theo, tức là add (thêm) và commit (lưu trữ các thay đổi mà bạn đã add vào hệ thống quản lý Git). Status này thường đại diện cho các file bạn đã thay đổi mà Git phát hiện trong toàn dự án của bạn.
Diff
Lệnh Diff sẽ cho bạn biết chính xác những thay đổi trong code mà Git phát hiện ở hiệm tại và commit (lưu trữ) sẽ trông như thế nào sau khi bạn add/commit nội dung gì đó. Đây sẽ là cách bạn thực hiện:
git diff FILE_PATH
Lệnh này sẽ hiển thị những dòng code mà bạn đã add/ đã xoá trong file đó. Nếu lệnh diff không đáp ứng kỳ vọng của bạn, bạn sẽ phải lưu lại vào ứng dụng IDE or text editor mà bạn đang sử dụng. Bạn cũng có thể chỉ cần thực hiện 1 lệnh giff, nó sẽ cho bạn bạn thấy tất tần tật những thay đổi mà bạn đã làm gần đây.
Add
Lệnh git status sẽ trả về các tệp trong kho lưu trữ ở local của bạn thành 2 danh mục: untracked và tracked. Tracked files là những tệp mà Git nhận dạng được và có khả năng đã được commit trước đó. Untracked files là những tệp mà bạn chưa chạy lệnh add. Lệnh add sẽ cho Git biết rằng file đó là file bạn muốn committ và cuối cùng là push lên remote. Nhiều người (bao gồm cả khi tôi còn là tấm chiếu mới) thường sẽ nhìn thấy quy trình push của GIt như sau:
git add . <-- Try not to do this!
git commit some_message_here
git push
Lệnh Git add tức là thêm tệp mà Git phát hiện có thay đổi để chuẩn bị cho một commit. Điều này là mối mối nguy hiểm nếu có nhiều đoạn code mà bạn đã tạo ra thực sự là mã được tạo ra tự động, và file .gitignore của bạn không đủ để cover chúng. Điều này sẽ dẫn đến việc nhiều rác được đẩy lên remote của bạn, tạo ra nhiễu loạn liên tục trong các yêu cầu pull. Chỉ chạy git add . nếu mọi thứ dưới phần untracked files là những thứ bạn muốn đưa lên remote. Cuối cùng, bạn có thể an tâm bằng cách chỉ chạy lệnh git add trên các tệp cá nhân mà bạn quan tâm. Cuối cùng, bạn thường chỉ làm việc trên các tệp đã tồn tại nên bạn hiếm khi chạy git add, điều này sẽ được mô tả chi tiết ở phần tiếp theo.
Commit
Đây thực sự là lệnh commit duy nhất của Git mà tôi sử dụng hiệu quả, và đây là lí sao tại sao bạn thực sự không cần chạy “git add”
git commit -am ‘YOUR_COMMIT_MESSAGE’
Flag -am chỉ định 2 tham số dòng lệnh:
- a (add) - Làm cho nó gói gọn tất cả các thay đổi bạn đã thực hiện vào các tệp đã tồn tại vào commit của bạn. Đây là lý do tại sao bạn hầu như không bao giờ chạy git add.
- m (message) - Cho phép bạn đính kèm message liên quan đến commit từ dòng lệnh. Nếu bạn không sử dụng flag này, git sẽ mở một trình Vim để bạn nhập mesage commit, điều mà tôi cá nhân thấy rất nặng nề, đặc biệt khi tôi mới bắt đầu. Vim tuyệt vời nhưng có thể rất khó hiểu đối với các nhà phát triển mới.
Push
Đây là cách để đưa mã của bạn lên remote (thường là GitHub). Thông thường, chỉ cần là:
git push
Tuy nhiên, lệnh push thực sự được cấu trúc như sau:
git push REMOTE_NAME BRANCH_NAME
Mặc định, Git sẽ đẩy lên remote ở vị trí origin. Nó cũng sẽ đẩy tất cả các nhánh local không khớp với nhánh remote của chúng, với sự khớp được xác định bằng một tên đơn giản. Hãy nhớ những ghi chú này khi bạn đang đẩy lên remote không phải origin và trường hợp hiếm khi nhánh local của bạn không có cùng tên với nhánh remote bạn đang cập nhật.
Nếu bạn muốn xác định rõ và đẩy một nhánh cụ thể lên một remote cụ thể, bạn có thể sử dụng lệnh sau:
git push remote_name my_local_branch_name:remote_branch_name
Dealing With Other People’s Code
Fetch
Fetch thực hiện việc lấy mã nguồn mới từ remote để bạn có thể thử nghiệm nó trên môi trường local (rebase, cherry-pick, check out a new branch, v.v). Khác với git pull, nó không làm gì với mã nguồn local của bạn; bạn sẽ nắm toàn quyền kiểm soát. Đây là lý do tại sao git pull là một mối rủi ro. "Git pull" là một trong những điều mà trường học dạy bạn để bạn nhanh chóng làm quen với git với ít lệnh nhất có thể (tôi thường xuyên sử dụng git pull khi còn ở trường đại học). Nói một cách ngắn gọn, git pull thực hiện một fetch và sau đó là một merge, điều này khiến bạn kiểm soát ít hơn về cách bạn muốn code mới được tích hợp vào code hiện tại của bạn. Dưới đây là cách thực hiện fetch:
git fetch REMOTE_NAME
Fetch mặc định sẽ lấy từ remote origin trong kho git của bạn (nếu bạn không chỉ định một remote, git fetch = git fetch origin). Tôi sẽ giải thích về remotes sau.
Cherry Pick
Hãy giả sử có một commit duy nhất mà bạn muốn test/thao tác trực tiếp trên đó. Tuy nhiên, không có một nhánh nào để bạn có thể merge/rebase để chỉ lấy commit đó. Đây là lúc bạn sử dụng cherry pick. Giả sử bạn thực sự muốn get code tôi đã viết trong commit này: https://github.com/Gear61/PADFriendFinder-Android/commit/d6ea8da972343c954b2e235f85e000cbda73fcf9
Mỗi commit đều có một ID duy nhất. Bạn có thể thấy từ cuối URL và từ trang web ở phía trên bên phải rằng ID commit cho commit liên kết là:
d6ea8da972343c954b2e235f85e000cbda73fcf9
Cherry pick được cấu trúc như sau:
git cherry-pick COMMIT_ID
Vì vậy, để thêm code của tôi cho 2 đoạn test đó vào môi trường/nhánh local của bạn, bạn làm như sau:
git cherry-pick 1925560490f66c473cd811e3485594484c6900a2
Stash
Lệnh thứ hai mà tôi muốn giới thiệu là stash. Stash chủ yếu liên quan khi bạn đang merge code. Git sẽ nổi giận khi bạn có những thay đổi trong code chưa commit trong tình huống này vì nó không biết cách liên kết những thay đổi của bạn với đoạn đang đến. Điều stash làm là ẩn code đang làm việc của bạn vào một nơi an toàn và bạn có thể đưa nó trở lại bất cứ khi nào. Dưới đây là 3 lệnh chính cho điều đó:
git stash — This “hides away” your code
git stash apply — This brings back your most recently “hidden away” code
git stash list — shows you the list of stashes you have locally (yup, you can have multiple stashes, Git is great)
Vì vậy, quy trình phổ biến nếu bạn đang theo mô hình forking như sau:
git fetch main - Get the latest changes from the main repo
git stash - Put away your local changes temporarily so you can merge
git merge remotes/main/master - Update your local master against that of the main repo
git stash apply - Put your local changes on top of your updated master branch and resolve any merge conflicts
Branches
Xác định bạn đang ở nhánh nào cũng như tất cả các nhánh local
git branch
Xác định những nhánh nào tồn tại (cả local và remote)
git branch -av
Nếu bạn thiếu một nhánh, bạn cần chuyển đổi một nhánh remote thành nhánh local và/hoặc thực hiện một fetch.
Bắt đầu làm việc trên một nhánh khác
git checkout BRANCH_NAME
Tạo một nhánh mới
git checkout -b BRANCH_NAME
Nhánh mới sẽ là một bản sao của nhánh bạn đang ở.
Remotes
Remote là nơi mã nguồn được lưu trữ trực tuyến. Đối với hầu hết mọi người, đó là một kho GitHub, được biểu thị bằng một URL. Đây là một ví dụ về remote:
[[email protected]:Gear61/PADFriendFinder-Android.git](http://[email protected]:Gear61/PADFriendFinder-Android.git)
(Liên kết này tương ứng với ứng dụng Android mà tôi xây dựng để tìm bạn bè trong Puzzle&Dragons)
Add Remote
Hãy nói rằng tôi đang làm việc trên PAD Friend Finder và tôi muốn một số thay đổi code mà anh trai Jonathan của tôi đã viết và đẩy lên fork của anh ấy mà chưa được hợp nhất vào main repo. Để làm điều đó, tôi cần làm cho kho Git local của mình biết rằng nó thậm chí tồn tại. Để làm điều đó, tôi phải thêm fork của Jonathan như một remote.
Thêm remotes có cấu trúc như sau:
git remote add NAME_OF_REMOTE REMOTE_URL
Vì vậy, để bắt đầu truy cập code trên fork của anh trai tôi bằng cách thêm nó làm remote, tôi sẽ chạy lệnh này:
git remote add [email protected]
Và sau đó, tôi sẽ chạy lệnh này để lấy thay đổi code trên đó mà tôi hiện không có local:
git fetch jonathan
Kiểm tra Remote hiện tại của bạn
Đôi khi bạn quên tên của các remote của bạn. Trong những tình huống đó, bạn thực hiện:
git remote -v
Điều này cung cấp cho bạn danh sách tất cả các remotes mà bạn có và các URL tương ứng.
Nguồn:
https://www.jointaro.com/blog/git-commands-every-engineer-should-know-stop-using-version-control-incorrectly/?fbclid=IwAR2cu8o1zD5m5U_x7ARLo84wC8z-KFbOvOG5yI7O34rcX_hYu67-YyCaTJk