Quản lý subversion là điều cần thiết và hết sức quan trọng trong việc ghi và lưu trữ lại các dòng mã. Các subsersion ra đời đã giải quyết hầu hết các nhu cầu của nhiều mã khi làm việc nhóm. Có thể kể đến các subversion nổi tiếng hiện nay được cộng đồng đông đảo dùng như git, svn, team foundation server … Ở bài viết này mình sẽ cùng các bạn tìm hiểu về cách sử dụng git với các dòng lệnh. Đương nhiên bạn vẫn có thể sử dụng git với các mini tool rất hữu ích (như source tree, tutoirse git, …). Tuy nhiên với một người lập trình viên theo hướng back end mình khuyên bạn lên sử dụng Git Command để tận dụng được tối đã cách triển khai sau này trên môi trường server 😉. Ok vậy mình sẽ cùng các bạn đi qua một số sub khối lệnh như mình đề cập dưới đây nhé
- Tổng quan về git
- Thao tác với git qua dòng lệnh
1. Tổng quan về git
- Đại loại nó là một server giúp ta quản lý phiên bản. Với các nhóm, team các mã nguồn sẽ dược quản lý dễ dàng thông qua các branch cũng như giải quyết xung đột và tránh mất code hết sức thuận lợi và dễ dàng. Hiện tại git là subversion phổ biến nhất thế giới. Tuy nhiên để sử dụng private resource thì bạn sẽ phải bỏ ra một lượng chi phí nhất định (tuy nhiên nó là rất nhỏ).
- Các biến thể của git đang được sử dụng rộng rãi như
- Bitbucket: hỗ trợ private từ 5 member trở xuống, về cơ bản alasian phát triển server riêng của họ và cách làm việc của nó giống như git. Bitbucket cũng có hỗ trợ CI, CD qua pipeline rất tuyệt vời
- Gitlap: Tương tự alasian. Có 1 điều là gitlap hỗ trợ tích hợp CI, CD rất thuận lợi
- …
- Một số từ khóa cơ bản khi làm việc với git
- clone, pull, push, remote, commit
- merge, rebase
- create pull request
- Làm thế nào để sử dụng:
- Download core nhân của git tại đây
- Đăng ký bất kỳ tài khoản nào đó của Github, hoặc GitLab, Bitbucket.
- Bật cửa sổ command và bắt đầu làm việc với git bash. Bạn có thể lựa chọn thêm Gui tool để quản lý dễ dàng hơn thay vì dùng git command. Về bản chât gui tool khi thực hiện thao tác cuối cùng chúng cũng thực hiện các lệnh y hệt như bạn làm việc với git command. Có điều bạn không phải gõ trực tiếp đoạn lệnh và dùng gui có hết các option để làm việc rồi. => Cách làm việc bạn có thể tham khảo thêm tại đây. Phần tiếp mình sẽ liệt kê một số đoạn lệnh hay dùng
2. Tổng hợp các lệnh thao tác
a. Lệnh Thao Tác Đầu Tiên
- git init: Khởi tạo 1 repository.
- git log : view lịch sử commit và must code của toàn bộ team work.
- git shortlog : view lịch sử commit của riêng mình.
- git remote remove origin: để xóa liên kết git tại project hiện có.
- git remote add origin <url>: để accept origin git cho 1 thư mục tồn tại trong hệ thống (Nếu thư mục này đã là 1 project source git tồn tại rồi bạn phải thực hiện remove origin như trên thì mới remote được).
b. Thao tác với branch
- git checkout –b <name_branch> : Checkout sang 1 nhánh mới làm việc (chú ý phải nhớ checkout từ nhanh nào để sau merge lại cho dễ).
- git branch -d <branch>: Delete branch trên local máy tính cá nhân của bạn.
- git push origin --delete <branch>: Delete branch trực tiếp lên server.
- git branch –a: Xem tất cả branch đang có trên local.
- git fetch : Tải về các branch mới được cập nhật từ các người khác trên server (để biết được đã có ai delete hoặc thêm 1 branch mới).
- git remote prune origin: Xóa toàn bộ các branch trên local mà không còn tồn tại trên server
- Cập nhật code cục bộ cho các nhánh từ xa chưa có trên local: git fetch -p.
Chú ý: khi gõ git branch -a sẽ hiển thị hết các nhánh mà bạn checkout và làm ngày xưa, vì nó là local lên có thể xáy ra trường hợp => 1 số nhanh này trên server đã có ai delete nó đi rồi mà ta vẫn cố xóa nó, nó sẽ báo lỗi => vì vậy trước khi xóa bạn lên fetch lại để biết được hiện tại còn bao nhiêu nhánh theo câu lệnh: git fetch --prune origin
Tham khảo: http://stackoverflow.com/questions/2003505/how-to-delete-a-git-branch-both-locally-and-remotelyc. Thao tác với Rebase
- Gõ gitk hoặc gitk& để mở cửa sổ quản lý các nhánh thay đổi => tiếp tục làm theo như bên dưới
- Rebase cơ bản: Giả sử có 4 commit ở 4 thời điểm khác nhau như bên dưới (được mô tả kèm cả key của commit)
- Z: 0h key: 111212xxxyuyxyxuxy1210
- A: 1h key: 111212xxxyuyxyxuxy1212
- B: 2h key: 111212xxxyuyxyxuxy1222
- C: 3h key: 111212xxxyuyxyxuxy1411
Muốn rebase C vào B thì gõ git rebase -i 111212xxxyuyxyxuxy1212 (key này là key của A) ,, rebase từ đâu thì lấy mã từ trước đó rebase C với B thì lấy key A , rebase C, B ,A thì lấy key của Z
Ngay khi bạn gõ xong câu lệnh git rebase -i .... ở trên thì trên cửa số command sẽ hiện ta các tùy chọn, bạn tiếp tục thao tác như bên dưới:
- Gõ i : để tiến hành thay đổi các nội dung trong rebase (xem các nội dung trong đó và làm theo mong muốn đã được hướng dẫn)
- Gõ esc + w + q : tiến hành đóng cửa số khi đã chấp nhận các thao tác trong cửa sổ rebase ở trên
- Git status: để xem còn gợi ý nào trên cửa số git không, nếu tất cả đều success => git push để đẩy code đã được rabase lên
- Rebase nâng cao khi pull code mới nhất về:
- git commit –m
- git pull origin <branch_cha>: nếu ko vấn đề gì => push code mới nhât lên, nếu có vấn đề (conflig) => tiến hành so sánh code => sau khi mọi thao tác trỉnh sửa đảm bảo ko còn conflig nữa rồi => git add –A để chấp nhận đoạn mã được sửa.
- Thường Khi pull code về... git sẽ thực hiện pull từng section 1, nếu gặp section nào bị lỗi thì nó sẽ dừng lại => ta sẽ fix conflig code => sau khi fix conflig xong ta gõ git add –A để thêm các thay đổi. Tiếp tục gõ git rebase –continue để server tiếp tục pull section tiếp theo về => nếu tiếp tục bị lỗi => fix conflict => Lặp lại các thao tác trên cho tới khi git status báo rằng ko còn thay đổi nào hết mọi thứ oke => git push đoạn mã đã được fix conflig qua rất nhiều section này.
d. Thao tác với commit push pull
- git commit –m <commend code> : commit code dưới local.
- git commit –am <commend_code>: commit code sẽ tự động merger commend của đoạn mã này với đoạn mã phía trước => có thể coi là nó gộp 2 commit gần nhất với nhau.
- git pull : lấy code về từ nhánh hiện tại.
- git pull origin <branch_name>: pull code từ nhánh branch_name về nhánh hiện tại (branch_name trong trường hợp hiện tại thường là branch cha).
- git push: đẩy code lên nhánh hiện tại.
- git push origin <branch_name>: push code từ nhánh hiện tại lên thẳng nhánh branch_name
- git push –force: ghi đè tất cả các thay đổi của git lên nhánh hiện tại.
- git reset –hard: reset tất cả các thay đổi về mặc định.
e. Sử dụng git trên ubuntu- linux
- git config --global user.name "your_name" : Set user name cho gitconfig
- git config -global user.email "your_email": set email cho git config
Sử dụng ssh key để đăng sử dụng github mà không cần thông qua https:
- Sau tất cả các config nhớ vào lại đường dẫn trong thư mục source: .git/config => edit file đó ra sửa lại url tại phần [remote “origin”] vể thành đường dẫn ssh có sẵn trên git hoặc bitbucket.
- Ament lâu lệnh dùng từ commend phía trước.
Pull request là một chức năng rất hay trên github. Đại loại nó giúp người quản lý code chính dễ dàng quản lý code ở nhánh chính và cũng quản lý tốt hơn việc merge các request (tránh việc merge vô tội vạ từ các member khác). Ở đây mình sẽ có 1 số chú ý khi bạn làm việc với pull request.
- Phải tạo pull request trên website quản lý git (github, bitbucket, gitlab …)
- Khi tạo pull request PBA yêu cầu merge từ nhánh B qua nhánh A thì trước khi người quản lý merge B vào A, mọi commit thay đổi và push lên B sẽ tự động tồn tại trong pull request PBA mà ko cần phải tạo lại pull request mới nữa.
- Người quản lý có thể thực hiện merge pull request, review code, comment và decline pull request (từ chối pull request)
Rebase là một chức năng rất chuyên nghiệp trên git. Đa số việc làm này là làm cho flow git của bạn tường mình, dễ dàng và dễ đọc, dễ quản lý hơn. Bạn có thể sử dụng rebase để làm một số việc sau đây.
- Gộp nhiều commit lại thành một commit:
git rebase –i <sha_id_commit_cha_gan_nhat_cac_commit_can_gop>
- Gộp nhiều commit trên local với nhau
- Gộp commit trên local với commit đã được đẩy lên server
- Gộp các commit trên server
Chú ý: (Các commit này đều nằm trên 1 nhánh thui nhé)
- Pull các section nhỏ về để rebase
h. Set branch chính khi làm việc
- bitbucket: truy cập bitbucket > select repositories > chọn tab setting > main branch > switch combobox branch need setup is main.
- github: truy cập github > select repositories > chọn tab setting > chọn branches (menu bên trái) > chọn branch default đây cũng là branch chính luôn.
- git remote prune origin: Xóa branch không tồn tại trên server (dưới local thì bạn phải tự xóa) (chi tiết tại đây)
- git push --all –u: Push tất cả các branch local lên server:
- git pull –all: update cho tất cả các nhánh được track từ một nhánh nào đó. Xem thêm tại đây
- git remote –v: hiển thị liên kết reposistory remote
- git diff: xem các thay đổi
- git log –oneline: format log dưới dạng chỉ 1 dòng
- git reset –soft HEAD^1: reset commit gần đó nhất nhưng vẫn keep file local (không xóa file đó đi)
- git reset –hard HEAD^1: reset từ HEAD local về 1 commit trước đó
- git merge branch_name: merge branch_name vào branch đang truy cập (cách merge này không thông qua pull request) hạn chế sử dụng
- Tổ hợp lệnh check và add origin
- git remote –v: xem link origin của repo
- git remote remove origin: xóa origin của repo
- git remote add origin git@github.com:user/repo.git
Tham khảo
https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/
https://git-scm.com/book/vi/v1/Ph%C3%A2n-Nh%C3%A1nh-Trong-Git-Rebasing
https://backlogtool.com/git-guide/vn/stepup/stepup2_8.html