# Git Recipes ## Git cơ bản Set username cho folder hiện tại `$ git config user.name "longdh"` Add và commit luôn - hơi bịp `$ git commit -a -m "Initial commit"` Xem lịch sử commit `$ git log` Xem tất cả các thể loại command trong git `$ git help --all` Tạo branch mới nhưng không switch sang `$ git branch <branch-name>` Fetch tất cả thay đổi ở origin `$ git fetch origin` Đổi tên cái origin thành cái khác `$ git remote rename origin new_origin` Thay đổi remote `$ git remote set-url origin https://oauth2:glpat-F121Q3Xep_gs223giY-s@gitlab.com/long.daohai4894/tools-bt.git` Show git log nhưng chỉ 1 line mỗi commit `$ git log --oneline` Revert commit cuối `$ git revert HEAD` Sửa commit message `$ git commit --amend -m "Nội dung muôn sửa"` ## Tạo và add ssh key 1. Kiểm tra xem máy có ssh key chưa ``` $ ls -la ~/.ssh ``` 2. Sinh một SSH key mới *(Enter liên tục là xong)* ``` $ ssh-keygen -t rsa -b 4096 -C "email_cua_ban@example.com" ``` 3. Thêm key vào ssh-agent ``` eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa ``` 4. Cuối cùng thêm ssh public key vào tài khoản trên server Gitlab/Github/Bitbucket trong mục setting account ## Trick: Cách CHMOD 400 trên window ``` $ icacls.exe .\<key_path> /reset $ icacls.exe .\<key_path> /grant:r "$($env:username):(r)" $ icacls.exe .\<key_path> /inheritance:r ``` ## Cấp quyền cho User truy cập bằng ssh **Mô tả:** tương đương với việc user có thể sử dụng ``` $ ssh user_name@hosting_ip ``` để truy cập trực tiếp server 1. Add new User ``` $ sudo adduser any_user or $ sudo adduser any_user --disabled-password # no password ``` 2. Chuyển sang quyền user mới ``` $ su any_user ``` 3. Tạo file authorized_keys trong thư mục .ssh với nội dung là publish_key của máy local ``` $ mkdir .ssh $ nano authorized_keys # thêm publish_key tại bước này rồi Ctrl+X và y và Enter để save ``` 4. Test xem connect được chưa ``` $ ssh new_user@103.216.114.131 ``` ## Xử lý với file gitignore 1. Giải thoát file đó ra khỏi git cache ``` $ git rm -r --cached /path/to/file_or_folder ``` 2. Reset lại hết project để .gitignore hoạt động đúng xóa bỏ hết đồ đệ của git cache ``` $ git rm -r --cached . $ git add . ``` ## Revert lại previous commit ``` $ git log ``` > commit a867b4af366350be2e7c21b8de9cc6504678a61b` Author: Me <me@me.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <me@me.com> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah… ``` $ git checkout 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 ``` ## Quy trình merge code khi bị conflict 1. Checkout sang nhánh đích (master, test, dev,...) ``` $ git merge master # fix conflict tại bước này ``` 2. Git add, commit ``` $ git add . $ git commit -m "fix conflict" ``` 3. Push lên git ``` $ git push origin test:merge/test ``` ## Cách cherry pick một MR 1. Tại MR đã merge, click sang tab commit, bấm copy Commit SHA ![](https://i.imgur.com/LFZE6qY.png) 2. Ở local, pull nhánh muốn merge về (VD develop, master) và checkout sang branch mới ``` $ git checkout -b cherry-pick-hotfix/abc ``` 3. Cherry pick và fix conflict nếu cần ``` $ git cherry-pick dd0285f21e0d5fb73f5f80640d33af42903d4f44 ``` 4. Commit & push lên git + tạo MR ## Xử lý với git remote (trong TH sử dụng từ 2 git trở lên) - Show list remote ``` $ git remote -v ``` - Add remote ``` $ git remote add prod http://gitlab.com/longdao.hai/... ``` - Change remote origin ``` $ git remote set-url origin new.git.url/here ``` - Push/Pull code sử dụng remote ``` $ git push prod master $ git pull prod master ``` ## GIT STASH - Checkout sang branch mới nhưng không commit ``` $ git stash # phục hồi lại nhánh như ban đầu & lưu change ở trong stash $ git checkout ... # checkout các kiểu $ git stash list # xem các stash đã lưu $ git stash apply # lấy code đã được lưu trong stash ra $ git stash pop # lấy code đã được lưu trong stash & xóa stash ``` ## Merge nhiều commit vào 1 commit Check log các commit `$ git log` Đếm số lượng commit muốn gộp & rebase ``` $ git rebase -i HEAD~3 # 3 là số lượng commit, thay 3 bằng số theo ý ``` Ở màn hình sẽ hiển thị file để rebase, press key `i` để edit, thay các chữ `pick` thành `s` (giữ nguyên chữ `pick` đầu tiên) Sửa xong thì `ESC` -> `:wq` -> `Enter` ![](https://i.imgur.com/SmvWj5k.png) Tiếp theo sẽ hiển thị file để thay đổi mô tả commit. Comment hết tất cả các commit cũ đi, thay bằng nội dung mới nhất. Sửa xong thì `ESC` -> `:wq` -> `Enter` ![](https://i.imgur.com/hxVm1GC.png) Cuối cùng thì ghi đè commit trên git bằng cách ``` $ git push -f origin feature/ABC ``` ## Cách revert commit Sử dụng trong TH lỡ tay merge code vào master hay vào đâu đó - Option1: sử dụng git reset => sẽ xóa n commit trước đó, coi như ko có commit nào vào branch ``` $ git reset --hard HEAD~5 # thay 5 bằng số n tương ứng $ git clean -fd $ git push -f ``` - Option2: sử dụng git revert => sẽ tạo thêm n commit revert tương ứng với n commit muốn revert ``` $ git revert (commit_hash) $ git add . $ git push origin master # thay master bằng branch tương ứng ``` --------------------------------------- # Gilab CI ## Install Gilab Runner ### Install on Ubuntu/Debian ``` $ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash $ sudo apt-get install gitlab-runner $ sudo service gitlab-runner status ``` ### Install on CentOS 7 ``` $ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash $ export GITLAB_RUNNER_DISABLE_SKEL=true; sudo -E yum install gitlab-runner $ sudo service gitlab-runner status ``` If installation is success: ![](https://i.imgur.com/6W0eRfv.png) ## Install Docker (if use Docker via runner) ## Register a runner 1. Open gilab project Settings => CI/CD => Runners ![](https://i.imgur.com/pP8uS5r.png) 2. In server gitlab-runner, run command with input from **Set up a specific Runner manually** ``` $ gitlab-runner register ``` ![](https://i.imgur.com/Ijqy8ar.png) 3. Verify Runner ``` $ gitlab-runner verify ``` 4. Recheck in **Runners activated for this project** ![](https://i.imgur.com/nbaG0NV.png) ## Config .gitlab-ci.yml