Hexa's Blog

How to verify Hostinger domains for ZeroSSL certificate using DNS(CNAME)?

10/10/2020 SSL

ZeroSSL is a free ssl certificate provider. I had follow all the instructions on their official website to configure my hostinger domain, but it’s not enough. At the domain verification step, it declared that Invalid CAA Records eventhough my CNAME record was configured correctly. Seemingly, Hostinger CCA’s default value is missing something.

[1] Invalid CCA Record
[1] Invalid CCA Record

The solution is that you need to check the CCA section belonging to DNS Zone. It’s a must to have following yellow records in your CAA list.

[2] CCA List
[2] CCA List

If you dont have those records, you need to add it manually one by one. Although, you submit new CAA records, it could take up to 30 minutes for verification.

|------+---------------------------+-------|
| name | content                   |   TTL |
|------+---------------------------+-------|
| @    | 0 issue "sectigo.com"     | 14400 |
| @    | 0 issuewild "sectigo.com" | 14400 |
|------+---------------------------+-------|

Reference: https://help.zerossl.com/hc/en-us/articles/360015629499-Verification-error-Invalid-CAA-Records

Đối mặt với SELinux

10/10/2020 Linux

SELinux một thứ rất đang để học hỏi, nhưng lại khó để thực hành. Đặc biệt là các vấn đề liên quan đến SELinux lại là thứ không phải là thứ xảy ra hàng ngày, hàng giờ. Chỉ là thi thoảng, khi triển khai máy chủ mới gặp vấn đề, lúc gặp tôi thường là có hai phương án tùy vào tình huống mà:

  • Tắt luôn SELinux
  • Đọc, hiểu lý do, viết policy và cài đặt policy cho SELinux.

Cứ mỗi lần triển khải server mới, dính vào nginx, reverse proxy là tôi lại phải nhờ anh google. Lần này tôi quyết định viết lại blog, cũng như là một cách để nhắc nhở mình cần phải làm gì khi gặp chuyện với SELinux.

I. Xác định xem có phải vấn đề thuộc về SELinux hay không

Cách dễ nhất để biết được nguyên nhân gặp phải thuộc về SELinux đó là chuyển chế độ của SELinux từ Enforce thành Permission. Đây là các lệnh liên quan

  • getenforce: xem trạng thái của SELinux. Enforce có nghĩa là chặn sạch, block sạch nếu ứng dụng không thỏa mãn luật lệ. Permissive có nghĩa là thông qua, tuy nhiên vẫn sẽ bị log ghi lại.
  • setenforce: cài đặt trạng thái của SELiux. setenforce 1, chuyển sang chế độ Enforce. setenforce 0 là chuyển sang chế độ Permissive.

Nếu mà chuyển sang chế độ Permissive mà phần mêm chạy ổn áp đúng như mong muốn thì biết lý do là SELinux rồi đấy. Bên cạnh đó, hay chú ý đến cả file log của phần mềm, cuộc đời biết đâu bất ngờ.

II. Xem và hiểu file audit.log

File /var/log/audit/audit.log này cực kì quan trọng chứa thông tin liên quan đến lý do tại sao SELinux lại ngăn chặn phần mềm làm điều này, điều kia. Tuy nhiên khi đọc bằng mắt thường sẽ rất khó hiểu. Để đọc và hiểu lý do dễ dàng, nên sử dụng lệnh audit2why.

Ví dụ như sau, tôi cat file log, tôi grep các dòng có từ khóa “denied”, tôi tiếp tục sử dụng audit2why để đọc dễ hiểu hơn.

cat  /var/log/audit/audit.log | grep denied | audit2why

Chắc chắn là khi chạy xong, thông tin sẽ tường mình hơn rất nhiều.

III. Tạo và cài đặt luật lệ để SELinux thông qua

SELinux rất hay ở chỗ nó block phần mêm những nó cũng chỉ rõ ra rằng chúng ta phải làm gì để khắc phục. Đây là một cái rất rất thú vị. Sau khi đã đọc và hiểu tại sao SELinux block, giờ là lúc bổ sung luật lệ cho SELinux. audit2allow là câu lệnh chúng ta cần.

cat  /var/log/audit/audit.log | grep denied | audit2allow -a -M my_module

Câu lệnh trên sẽ tạo ra file my_module.pp. Sử dụng lệnh sau để cài đặt module này vào SELinux.

semodule -i my_module.pp

Sau khi kiểm tra cẩn thận, hay nhớ bật chế độ Enforcing cho SELinux.

LVM, Gia tăng logical volume!

10/05/2020 Linux

I. Giới thiệu

[1] Các lớp trừa tượng - LVM

Đây là câu chuyện tôi đã trải qua khi phải bắt buộc gia tăng logical volume hệ thống. Trong quá trình phát triển, không gian dữ liệu hệ điều hành chiếm dụng bắt đầu nhiều hơn và nhiều hơn. Đã có những lúc tôi nghịch ngợm với VM, Docker, Backup file quá nhiều, kết cục là ổ cứng 500 GB của tôi dần dần cạn kiệt.

Công ty tôi còn một vài cái ổ cứng 500 GB khác. Tôi quyết định mở rộng logical volume lên thêm nữa sử dụng lợi thế của Logical Volume Manager. Với cách tiếp cận này, việc gia tăng logical volume trở nên đơn giản hơn, với khả năng mở rộng lớn, thực sự là chỉ bị hạn chế bởi số cổng SATA hỗ trợ trên bo mạch chủ.

Vì lý do công nghệ này sử dụng nhiều lớp trừu tượng trung gian. Để giúp các bạn hiểu tôi đang nói về lớp nào tôi sẽ thêm các chú thích về tầng trừu tượng [LEVEL X]. Hình số [1] có chú thích chi tiết từng tầng một.

II. Cách làm

Đây là danh sách những việc phải làm khi muốn mở rộng logical volume [LEVEL 5]. Trường hợp của tôi khá là kẹt khi mà Physical Volume Group hoàn toàn ko còn dung lượng dư. Chính vì như vậy, tôi phải gắn thêm một ổ đĩa cứng mới [LEVEL 1].

  • Gắn ổ cứng mới [LEVEL 1]
  • Tạo phân vùng (partition) với định dạng Linux LVM [LEVEL 2]
  • Tạo physical volume từ phân vùng vừa tạo [LEVEL 3]
  • Thêm physical volume vừa tạo vào volume group [LEVEL 4]
  • Thêm dung lượng cho logical volume từ dung lượng trống từ volume group [LEVEL 5]
  • Cập nhập filesystem

1. Gắn ổ cứng mới

Nghe dễ thật, nhưng tôi lại gặp một vấn đề khác.

- Cắm ổ cứng mới vào bo mạch chủ
- Bật máy tính
---> Hệ điều hành không boot lên được
- Không cắm ổ cứng mới vào bo mạch chủ vội
- Bật máy tính, vào hệ điều hành
- Bây giờ mới cắm ổ cứng vào bo mạch chủ
---> Hệ điều hành không nhận được ổ đĩa mới  (kiểm tra với lệnh `lsblk`, hoặc phần mềm `gnome-disk`)

Để hệ điều hành nhận ổ cứng mới, tôi đã phải làm theo các bước sau.

- Format toàn bộ dữ liệu của ổ cứng mới (Nó đã được sử dụng và có hệ điều hành cũ trên đó)
- Cắm ổ cứng mới vào bo mạch chủ
- Bật hệ điều hành.
---> Hệ điều hành khởi động thành công, sau khi đăng nhập nó đã nhận được ổ đĩa mới.
Như trên hình, `sdb` là ổ đĩa mới.

2. Tạo phân vùng loại Linux LVM từ ổ đĩa [LEVEL 2]

Cách làm mà tôi sử dụng là phần mềm fdisk. Đây là các chỉ mục quan trọng

  • Tạo GPG partition table
  • Tạo phân vùng mới với loại Linux LVM

a. Tạo GPG partition table Sử dụng lệnh sau với quyền root.

fdisk /dev/sdb

sdb là tên của ổ đĩa. Lưu ý là sdb chứ không phải là sdb1, hoàn toàn không có hậu tố đằng sau. Số 1 ở đây ám chỉ phân vùng chứ không phải là ổ đĩa. Nếu bạn đang gắn ổ cứng thứ 3, ổ cứng của bạn khả năng rất cao sẽ tên là sdc.

Fdisk là phần mềm có nhiều tính năng chết người, Thao tác của phần mềm khá đơn giản, chọn chỉ mục bằng phím, kết thúc bằng enter. Ví dụ để xem hướng dẫn của phần mềm, ấn phím m và kết thúc bằng enter.

Để tạo GPG partition table, hãy chọn chỉ mục có tên là create a new empty GPT partition table.

[2] Tạo GPT Partition table

b. Tạo phân vùng Linux LVM

Chọn chỉ mục có tên là add a new partition

[3] Tạo phân vùng mới

Tiếp theo, tôi sẽ bị yêu cầu nhập

  • partition number: mặc định
  • first sector: mặc định
  • last sector: mặc định
    Command (m for help): n
    Partition number (1-128, default 1): 1
    First sector (2048-4194270, default 2048): 2048
    Last sector, +sectors or +size{K,M,G,T,P} (2048-4194270, default 4194270): 4194270

    Created a new partition 1 of type 'Linux filesystem' and of size 2 GiB.

Tôi đã tạo xong phân vùng mới, tuy nhiên định dạng của nó là Linux filesystem, Cái tôi muốn là Linux LVM. Chọn chỉ mục có tên là change a partion type

[4] Đổi loại phân vùng

Phần mềm sẽ chọn phân vùng duy nhất trong trường hợp này là 1. Trong phần chọn loại phân vùng, Linux LVM có mã số là 31.

[4a] Đổi loại phân vùng

Kiểm tra lại với chỉ mục có tên print the partition table. Nó nên có phân vùng mới kèm theo là loại phân vùng có tên Linux LVM.

Kết thúc giai đoạn này với chỉ mục mang tên write table to disk and exit

[5] Lưu lại thiết lập

3. Tạo phsyical volume [LEVEL 3]

Tạo physical volume với lệnh sau:

pvcreate /dev/sdb1;

Kiểm tra xem physical volume đã tạo thành công từ /dev/sdb1 với lệnh sau:

pvs;

4. Gán physical volume vào volume group [LEVEL 4]

Tôi cần phải biết xem logical volume mà tôi cần gia tăng thuộc volume group nào. Sử dụng lệnh sau để xem danh sách logical volume hiện đang có cũng như là volume group mà nó thuộc về.

lvs;

Trong trường hợp của tôi. logical volume mà tôi muốn gia tăng dung lượng là homeroot. Cả hai logical volume này thuộc volume group có tên là fedora

Đây là lệnh để tìm xem thông tin của toàn bộ volume group. Hãy chú ý cột VFree, sau khi thêm physical volume vào volume group. giá trị của cột VFree phải tăng lên, tạo tiền đề để gia tăng các logical volume ở bước tiếp theo.

vgs;

Đây là lệnh để gán physical volume /dev/sdb1 vào volume group có tên là fedora.

vgextend fedora /dev/sdc1;

5. Gia tăng dung lượng cho logical volume [LEVEL 5]

Đây là cả chỉ mục cần quan tâm:

  • Sử dụng lệnh lvextend để gia tăng logical volume
  • Sử dụng lệnh resize2fs để cập nhật file system

Tôi cần gia tăng logical volume có tên là roothome. Cụ thể là tôi muốn tăng 400 GB cho home và 100% phần còn dư cho root. Đây là cách làm.

lvextend fedora/home --size +400GB;
lvextend fedora/root --extents +100%FREE;

Để kiểm tra, hãy sử dụng lệnh sau: lvs. Tuy nhiên filesystem thì hoàn toàn chưa được cập nhật, hãy sử dụng lệnh sau để thấy sự khác biệt df -h, chú ý cột Filesystem, Size và cột Mount on

df -h;

Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 7.8G     0  7.8G   0% /dev
tmpfs                    7.8G  245M  7.6G   4% /dev/shm
tmpfs                    7.8G   50M  7.8G   1% /run
tmpfs                    7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/mapper/fedora-root  116G  111G    0G 100% /
tmpfs                    7.8G   52K  7.8G   1% /tmp
/dev/sda1                976M  255M  655M  28% /boot
/dev/mapper/fedora-home  258G  258G    0G 100% /home

Trong trường hợp của tôi, hai filesystem mà tôi cần quan tâm là:

/dev/mapper/fedora-root
/dev/mapper/fedora-home

Để cập nhập filesystem sử dụng lệnh resize2fs

resize2fs /dev/mapper/fedora-root;
resize2fs /dev/mapper/fedora-home;

Bước cuối cùng, kiểm tra lại thông tin filesystem với df -h:

df -h;

Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 7.8G     0  7.8G   0% /dev
tmpfs                    7.8G  245M  7.6G   4% /dev/shm
tmpfs                    7.8G   50M  7.8G   1% /run
tmpfs                    7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/mapper/fedora-root  211G  111G  100G  52% /
tmpfs                    7.8G   52K  7.8G   1% /tmp
/dev/sda1                976M  255M  655M  28% /boot
/dev/mapper/fedora-home  658G  258G  400G  39% /home

Phù phù phù, đã xong rồi đó.

Phân Vùng LVM - Ý Nghĩa và Phát Triển

09/05/2020 Linux

I. Logical Volume Manager (LVM)

LVM - Phần mềm quản lý nhiều ổ cứng Logical Volume, tác dụng của LVM đó là cho phép ghép nhiều ổ đĩa cứng với nhau, sau đó tạo ra một lớp trừu tượng trước hệ điều hành. Với lợi thế này, việc gia tăng dung lượng cho hệ điều hành dễ dàng hơn bao giờ hết. Hệ điều hành có thể đang chạy trên hai ổ cứng vẫn đảm bảo được sự trơn tru, đơn giản khi vận hành như đang làm việc với một ổ cứng mà thôi.

Hệ thống từ vựng được sử dụng khi nói đến LVM hơi nhầm lẫn khi dịch qua tiếng Việt

  • volume: Là một từ trừu tượng, có thể hiểu khi là một cục nào đó chứa dữ liệu
  • partition: Phân vùng, khi nói đến phân vùng, chúng ta nói đến việc chia ổ cứng thành nhiều phần vùng
  • physical volume: Khi nói đến LVM, thì physical volume là thứ được tạo ra từ partition
  • physical volume group: Là nhóm được tạo ra từ nhiều partition
  • logical volume: Khi nói đến LVM, thì logical volume là volume được tạo ra từ physical volume group

Hiểu nôm na thì ta sẽ có sơ đồ từ vựng thứ tự của các định nghĩa như sau:

Ổ Đĩa (LEVEL 1) → Partition (LEVEL 2) → Physical Volume (LEVEL 3) → Physical Volume Group (LEVEL 4) → Logical Volume (LEVEL 5)
[1] Các Mức độ trìu tượng của LVM
[1] Các Mức độ trìu tượng của LVM

II. Các quy trình thường gặp khi làm việc với LVM

a. Tạo logical volume

  • Tạo phân vùng (partition) có định dạng là Linux LVM từ ổ cứng vật lý. [LEVEL 2]
    • Sử dụng lệnh fdisk
  • Tạo physical volume từ phân vùng (partition) vừa tạo [LEVEL 3]
    • Sử dụng lệnh pvcreate
  • Tạo physical volume group với physical volume vừa tạo [LEVEL 4]
    • Sử dụng lệnh vgcreate
  • Tạo logical volume từ physical volume group [LEVEL 5]
    • Sử dụng lệnh lvcreate

b. Gia tăng dung lượng cho logical volume

  • Xác định xem physical volume group cái tạo ra logical volume cần tăng dung lượng xem là nó có còn dung lượng trống hay không. [LEVEL 4]
    • Sử dụng lệnh vgs, vgdisplay
  • Nếu còn dung lương trống thì thêm dung lượng vào logical volume [LEVEL 5]
    • Sử dụng lệnh lvextend, resize2fs
  • Nếu không còn thì phải thêm physical volume vào physical volume group [LEVEL 3]
    • Sử dụng lệnh vgextend
  • Sau đó thì gõ lệnh thêm dung lượng vào logical volume [LEVEL 5]
    • Sử dụng lệnh lvextend, resize2fs

c. Giảm dung lượng của logical volume

Cực kì nguy hiểm!

Hãy backup trước khi làm việc này. Là người viết, tôi chưa bao giờ thử cái tính năng này. Viết cho nó có chữ thôi chứ, dùng cái tính năng của khỉ này, tôi không dám.

[2] Chắc là không sao đâu!
[2] Chắc là không sao đâu!
  • Xác định xem logical volume, bao nhiêu dung lượng đã được sử dụng, dung lượng còn lại có thể giảm được hay không. [LEVEL 5]
    • Sử dụng lệnh df -h, nó sẽ hiển thị dung lượng sử dụng.
  • Gõ lệnh để giảm dung lượng của logical volume, dung lượng được giảm sẽ về logical volume group [LEVEL 5]
    • Sử dụng lệnh lvreduce, resize2fs

III. Các câu lệnh liên quan

Command Level Ý nghĩa
lsblk Level 1, Level 2 Liệt kê danh sách các ổ cứng - hay còn gọi là block devices. Ví dụ như sda, sdb, sdc
fdisk Level 1, Level 2 Thao tác với ổ cứng ví dụ như tạo phân vùng (partition) trên ổ cứng
pvcreate Level 3 Tạo physical volume từ phân vùng(partition) trên ổ cứng
pvremove Level 3 Xóa physical volume
vgcreate Level 4 Tạo physical volume group từ một hay nhiều physical volume
vgextend Level 3, Level 4 Thêm physical volume vào physical volume group
vgreduce Level 3, Level 4 Loại bỏ physical volume khỏi physical volume group
vgremove Level 4 Xóa logical volume group
vgs, vgdisplay Level 4 Liệt kê các physical volume group đang có
lvcreate Level 5 Tạo logical volume từ physical volume group
lvs, lvdisplay Level 5 Liệt kê các logical volume đang có
lvextend Level 5 Gia tăng dung lượng cho logical volume
lvreduce Level 5 Giảm dung lượng cho logical volume
lvremove Level 5 Xóa logical volume
resize2fs Level 5 Khi thao tác gia tăng logical volume, lệnh resize2fs được sử dụng để cập nhât filesystem cho logical volume
mkfs   Định dạng cho logical volume ví dụ như là ext2, ext3, ext4 , ntfs.
Make File System

IV. Hứa hẹn

Tôi đã gặp tình huống như sau. Tôi có một Đĩa Vật Lý 500GB. Trên ổ đĩa này cài Hệ Điều Hành. Vấn đề đặt ra là làm sao để tôi có thể lắp thêm ổ cứng vật lý mới, tiếp tục sử dụng hệ điều hành bình thường và quan trọng nhất là phải sử dụng lợi thế của Logical Volume Manager.

Trong bài viết tiếp theo, tôi sẽ kể chuyện tôi đã làm như thế nào. Thực tế thì tôi đã cóng tay đến mức phải chạy nháp trên máy ảo trước khi làm thật. Có những chuyện lúc dùng VM không xảy ra, mà đến khi chạy thật mới gặp phải.

Tuy nhiên, sau tất cả thì đến bây giờ mọi thứ vẫn ổn. Tôi khá là tự tin vào cách làm này.

Mã hóa và giải mã file trên linux sử dụng GPG

09/05/2020 Linux

Bài viết này đưa ra cách nhanh nhất để mã hóa cũng như giải mã file trên linux. Việc mã hóa và giải mã sẽ sử dụng mật mã (symmetric-key - key đổi xứng)

I. Mã hóa file

gpg --symmetric tesla.org

Lệnh này sẽ mã hỏi bạn mật mã, hay ghi nhớ mật mã này. Sau khi quá trình mã hóa kết thúc, một file có tên là tesla.org.gpg sẽ xuất hiện. Đây chính là file đã được mã hóa.

II. Giải mã file

gpg tesla.org.gpg

Phần mềm sẽ yêu cầu mật mã. Sau khi quá trình giải mã kết thúc, một file có tên là tesla.org sẽ xuất hiện.

III. Lưu ý.

Nếu mà bạn mã hóa, rồi giải mã ngay lập tức. Khả năng rất cao là khi giải mã phần mềm sẽ không yêu cầu nhập mã.

CSGO, Cách lưu và chạy file config

09/01/2020 CSGO

Đây là hướng dẫn lưu và chạy file config trong game csgo. Dưới đây là ví dụ cụ thể, bạn muốn tập ném smoke, bạn chắc chắn sẽ phải gõ một đống lệnh mà bạn thậm chí không thể nhớ hết. Bạn không muốn mỗi lần tập ném smoke lại phải gõ một đống lệnh. Và ngay cả khi có copy/paste, nó cũng quá bất tiện.

Bài hướng dẫn dưới đây giúp bạn khắc phục vấn đề này. Dưới đây là chi tiết cách làm.

  1. Vào và tạo file tại thư mục
C:\Program Files (x86)\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\cfg

Tôi sẽ tạo file có tên là smk.cfg, lưu ý là đuôi file phải là .cfg

  1. Edit nội dung file và lưu lại
sv_cheats 1;
sv_infinite_ammo 1;
ammo_grenade_limit_total 5;
mp_warmup_end;
mp_freezetime 0;
mp_roundtime 60;
mp_roundtime_defuse 60;
sv_grenade_trajectory 1;
sv_grenade_trajectory_time 10;
sv_showimpacts 1;
mp_limitteams 0;
mp_autoteambalance 0;
mp_maxmoney 60000;
mp_startmoney 60000;
mp_buytime 9999;
mp_buy_anywhere 1;
mp_restartgame 1;

bind "ALT" "noclip";
  1. Trong game, vào console và chạy lệnh
exec smk

smk chính là tên file config vừa nãy tôi đã tạo.

CSGO, Thiết lập để tập ném smoke

09/01/2020 CSGO

sv_cheats 1;
sv_infinite_ammo 1;
ammo_grenade_limit_total 5;
mp_warmup_end;
mp_freezetime 0;
mp_roundtime 60;
mp_roundtime_defuse 60;
sv_grenade_trajectory 1;
sv_grenade_trajectory_time 10;
sv_showimpacts 1;
mp_limitteams 0;
mp_autoteambalance 0;
mp_maxmoney 60000;
mp_startmoney 60000;
mp_buytime 9999;
mp_buy_anywhere 1;
mp_restartgame 1;
bot_kick;
bot_stop;
bind "ALT" "noclip";
bind "i" "bot_place";
alias +jumpthrow "+jump;-attack"; alias -jumpthrow "-jump"; bind mouse5 +jumpthrow;

CSGO, Thiết lập crosshair

09/01/2020 CSGO

cl_crosshair_drawoutline "0"
cl_crosshair_dynamic_maxdist_splitratio "0.35"
cl_crosshair_dynamic_splitalpha_innermod "1"
cl_crosshair_dynamic_splitalpha_outermod "0.5"
cl_crosshair_dynamic_splitdist "7"
cl_crosshair_friendly_warning "1"
cl_crosshair_outlinethickness "0.5"
cl_crosshair_sniper_show_normal_inaccuracy "0"
cl_crosshair_sniper_width "1"
cl_crosshair_t "0"
cl_crosshairalpha "250.000000"
cl_crosshaircolor "5"
cl_crosshaircolor_b "0"
cl_crosshaircolor_g "0"
cl_crosshaircolor_r "255"
cl_crosshairdot "0"
cl_crosshairgap "-2.500000"
cl_crosshairgap_useweaponvalue "0"
cl_crosshairscale "0"
cl_crosshairsize "3.000000"
cl_crosshairstyle "4"
cl_crosshairthickness "1.150000"
cl_crosshairusealpha "1"
cl_fixedcrosshairgap "3"

Rebase hay Merge Khi muốn có thay đổi từ nhánh Master

23/11/2019 Git

I. Giới Thiệu

Khi phát triển phần mềm việc chia nhánh để phát triển độc lập, song song luôn xảy ra. Có nhánh xong trước, có nhánh sẽ hoàn thành sau. Làm sau để các nhánh chưa hoàn thành có thể có những tính năng từ nhánh chính (nhánh master) là vấn đề của bài viết này.

Kịch bản cụ thể như sau. Có 2 tính năng phát triển độc lập với nhau, theo lẽ đương nhiên, lập trình viên sẽ tạo ra 2 nhánh riêng biệt từ nhánh master. Hai nhánh này sẽ có tên lần lượt là

  • feature-1
  • feature-2
[1] Nhánh feature-1 và feature-2
[1] Nhánh feature-1 và feature-2

Nhánh feature-1 hoàn thành sớm và nhanh chóng merge vào master. Lúc này nhánh master đang có mã nguồn mới nhất từ nhánh feature-1. Vấn đề bây giờ đó là ở nhánh feature-2, nhánh feature-2 hiện tại chưa phát triển xong, tuy nhiên nhánh feature-2 muốn có các tính năng mới nhất mà hiện tại đang có ở nhánh master.

[2] Nhánh feature-1 merge vào nhánh master, và tạo ra node màu xanh dương.
[2] Nhánh feature-1 merge vào nhánh master, và tạo ra node màu xanh dương.

Sẽ có 2 cách làm trong kịch bản này:

  • Merge từ nhánh master qua nhánh feature-2
  • Rebase nhánh feature-2 đến nhánh master

Rebase dịch sang tiếng việt có nghĩa là chuyển nền, còn có thể hiểu cách khác là chuyển commit nguồn của một nhánh sang một commit khác.

Lưu ý là nhánh master đang nói ở đây cụ thể là điểm commit mới nhất, cuối cùng trên nhánh master.

Một lần nữa, vấn đề hiện tại đó là làm sao để nhánh feature-2 có các tính năng mới nhất từ nhánh master và rồi lập trình viên có thể phát triển tiếp trên nhánh feature-2.

II. Giải pháp

1. Merge từ nhánh master qua nhánh feature-2

[3] Merge từ nhánh master qua nhánh feature-2
[3] Merge từ nhánh master qua nhánh feature-2

2. Rebase nhánh feature-2 qua nhánh master

[4] Rebase nhánh feature-2 đến commit mới nhất của nhánh master
[4] Rebase nhánh feature-2 đến commit mới nhất của nhánh master

Có thể nhận ra điểm khác biệt ngay lập tức đó là nhánh feature-2 được phát triển dựa vào commit màu xanh dương thay vì là màu xanh lá.

III. Ưu & Nhược Điểm.

1. Merge từ nhánh master qua nhánh feature-2

Ưu điểm: Nhìn rõ các commit lịch sử của nhánh feature-2, từng commit lúc này hoàn toàn ko có dính dáng gì đến commit mới nhất thuộc nhánh master2. Khi áp dụng giải pháp này, giả sử muốn quay lại các commit cũ thuộc nhánh feature-2, hoàn toàn là điểu dễ dàng, mã nguồn hoàn toàn không dính dáng gì đến nhánh feature-1 hết.

Nhược điểm: Git log nhìn sẽ rất xấu.

[5] git log khi áp dụng phương pháp merge
[5] git log khi áp dụng phương pháp merge

2. Rebase nhánh feature-2 sang commit mới nhất thuộc nhánh master

Ưu điểm: Git log nhìn sẽ cực kì, cực kì đẹp.

[6] git log khi áp dụng phương pháp rebase
[6] git log khi áp dụng phương pháp rebase

Nhược điểm: Các commit cũ của nhánh feature-2 lúc nhánh này dựa trên commit cũ thuộc nhánh master sẽ bị biến mất trên git log. Thay vào đó, các commit thuộc nhánh feature-2 sẽ hoàn toàn dựa trên commit mới nhất thuộc nhánh master. Giả sử như muốn quay lại các commit cũ, mã nguồn không dính dáng gì đến mã nguồn của feature-1, để làm được việc này khó khăn hơn rất nhiều so với phương pháp merge.

Trên hình số [5] và [6], hãy chú ý đến các commits thuộc nhánh feature-2.
- [feature-2] change 1
- [feature-2] change 2
- [feature-3] change 3

Sau khi áp dụng phương pháp rebase, commit hash của các commits thuộc nhánh `feature-2` đã thay
đổi hoàn toàn. Ví dụ như commit có tên là: `[feature-2] change 3`

Commit hash đã thay đổi từ `2eea38a` sang `5c59d21`.

Hãy thử tưởng tượng xem nếu cần debug trong nhánh `feature-2` và áp dụng phương pháp `rebase`,
lập trình viên sẽ gặp khó khăn trong việc quay lại commit cũ của mình trước khi `rebase`.
Thêm vào đó, lúc tranh luận **LỖI CỦA ANH - LỖI CỦA TÔI**, cũng sẽ thêm ít nhiều vấn đề.

Để áp dụng phương pháp `rebase`, lập trình viên thật sự cần biết là anh ta đang làm gì và
chịu trách nhiệm cho nó.

3. Tóm tắt

|------------+---------------------------------------+----------------------------------------|
|            | Merge                                 | Rebase                                 |
|------------+---------------------------------------+----------------------------------------|
| Ưu Điểm    | Nhìn rõ các commit lịch sử của nhánh  | Trên git log nhìn cực kì đẹp.          |
|            | feature-2, từng commit lúc này hoàn   | Các branch không bị lộn xộn,           |
|            | toàn ko có dính dáng gì đến commit    | chồng chéo nhau                        |
|            | mới nhất thuộc nhánh master           |                                        |
|------------+---------------------------------------+----------------------------------------|
| Nhược Điểm | Trên git log nhìn rất xấu. Các branch | Các commit cũ của nhánh `feature-2`    |
|            | bị chồng chéo.                        | lúc nhánh này dựa trên commit cũ       |
|            |                                       | thuộc nhánh master sẽ bị biến mất.     |
|            |                                       | Thay vào đó, các commit thuộc nhánh    |
|            |                                       | feature-2 sẽ hoàn toàn dựa trên commit |
|            |                                       | mới nhất thuộc nhánh master            |
|------------+---------------------------------------+----------------------------------------|

Tổng hợp các loại merge

23/11/2019 Git

1. Giới thiệu

Khi merge hai branch với nhau, có những kiểu merge như sau

  • no fast forward: không chuyển tiếp nhanh
  • fast forward: chuyển tiếp nhanh
  • squash: nén 🏋️

2. Chi tiết từng loại merge

a. No Fast Forward (–no-ff)

Khi merge ở chế độ no fast forward, một commit merge sẽ được tạo ra trên git log cho dù khi merge có xảy ra conflict hay không. Đây là sở đồ khối khi áp dụng cách merge no fast forward

[1] No Fast Forward Merge
[1] No Fast Forward Merge

Lưu ý là sự khác nhau giữa các loại merge là ở commit merge cuối cùng (màu hồng) Như ở trên sơ đồ khối, sự thay đổi của của nhánh(branch) tồn tại ở trên (B1, B2, B3), điểm cuối cùng (màu hồng) thực chất không có chứa thay đổi gì cả, ngoài trừ việc lưu ý rằng đây là commit merge từ nhánh có tên là branch vào nhánh master.

b. Fast Forward (–ff-only)

Khi merge ở chế độ fast forward, các commit từ nhánh mới sẽ chuyển tiếp qua nhánh đích và không có merge commit được tạo ra. Đây là sơ đồ khối các branch trước khi merge, không có commit màu hồng như đồ thị dành cho --no-fast-forward

[2] Before Fast Forward Merge
[2] Before Fast Forward Merge

Và đây là sơ đồ khối sau khi merge từ nhánh branch qua master

[3] After Fast Forward Merge
[3] After Fast Forward Merge

Như trong hình vẽ, nếu áp dụng fast forward, hoàn toàn không có merge commit như là no fast forward

c. Squash (–squash)

Squash có nghĩa là đè nén. Khi merge theo kiểu squash tất cả các commit thuộc nhánh sẽ bị nén với nhau lại sau đó merge vào nhánh đích. Đây là sơ đồ khối trước khi áp dụng merge squash (nó giống như là hình trước khi merge theo kiểu fast forward merge.

[4] Before Squash Merge
[4] Before Squash Merge

Còn đây là sơ đồ khối sau khi merge theo kiểu squash.

[5] After Squash Merge
[5] After Squash Merge

Như trong sơ đồ khối trên, sau khi merge theo kiểu squash, tất cả thay đổi trong các commit (B1, B2, B3) đều được nén lại thành một commit duy nhất (màu hồng). Khi mở git log của master, người xem sẽ chỉ thấy có commit đã nén mà ko thấy các commit (B1, B2, B3).

3. Ưu điểm và nhược điểm

a. Fast Forward

Ưu Điểm: Khi nhìn vào git log ở nhánh bị merge vào, người xem sẽ thấy toàn bộ các commit ở trên nhánh gốc. Thêm vào đó, ở trên git log chúng ta sẽ thấy một đường thẳng. Việc sử dụng fast forward cực kì có ích khi ở trên branch bị merge, không có tồn tại thêm các commit mới, lúc này áp dụng fast forward dòng git log là một đường thẳng. Nhược Điểm: Khi áp dụng cách này, khi muốn biết là cái commit được tạo ra trên branch nào, khi này sẽ gặp khó khăn khi nhìn trên git log. Đây là hình ảnh lấy ra từ git log --graph khi áp dụng git merge --fast-forward

[6] git merge fast forward
[6] git merge fast forward

b. No Fast Forward

Ưu Điểm: Cũng giống như là fast forward, người xem sẽ thấy toàn bộ commit của branch nhánh khi học xem git log. Thêm vào đó, người dùng còn biết được chính xác là commit được phát triển trên nhánh nào. Ưu điểm cuối cùng là khi nhìn git log --graph đẹp. Đây là hình ảnh ví dụ khi áp dụng git merge --no-ff.

[7] git merge no fast forward
[7] git merge no fast forward

Nhược Điểm: Giả sử với một người phát triển phần mềm và commit liên tục, một chuỗi các commit nhỏ nhỏ xuất hiện trên git log kết quả là nhìn rất rất là không đẹp, những commit nhỏ nhỏ đó nên được nhóm lại thành một commit.

c. Squash

Ưu Điểm: Khi nhìn vào git log, sẽ thấy git log cực kì sạch sẽ. Khi phát triển phần mềm, luôn luôn tồn tại những commit có message ít ý nghĩa, khi nhìn vào git log và đọc git message, thấy rất có vấn đề. Đặc biệt là những lập trình viên code và commit liên tục.

Nhược điểm: Cực kì sạch sẽ quá cũng là vấn đề. Giả sử đó là một chuỗi commit, khi tìm cách debug theo brach ví dụ sử dụng git bisect , nhìn một cái commit đơn độc cũng khá là mệt.