# 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