Fork và Pull Request là hai khái niệm quan trọng trên GitHub liên quan đến quy trình đóng góp vào dự án mã nguồn mở.
- Fork: Fork là một bản sao của một kho lưu trữ (repository) khác. Khi bạn fork một kho lưu trữ, một bản sao của kho lưu trữ đó sẽ được tạo ra trong tài khoản GitHub của bạn. Điều này cho phép bạn thay đổi mã nguồn mà không ảnh hưởng đến kho lưu trữ gốc.
- Pull Request: Sau khi bạn đã thực hiện các thay đổi trong fork của mình và muốn những thay đổi đó được hợp nhất vào kho lưu trữ gốc, bạn có thể tạo một Pull Request. Pull Request là cách bạn thông báo cho người quản lý kho lưu trữ gốc rằng bạn có những thay đổi bạn muốn họ xem xét. Nếu họ chấp nhận Pull Request của bạn, thì những thay đổi của bạn sẽ được hợp nhất vào kho lưu trữ gốc.
Quy trình thông thường khi đóng góp vào một dự án mã nguồn mở trên GitHub thường bao gồm các bước sau: fork kho lưu trữ -> tạo một nhánh -> thực hiện thay đổi -> tạo Pull Request.
2. Thực hành.
2.1. Fork.
Fork là một bản sao của một kho lưu trữ (repository) khác. Khi bạn fork một kho lưu trữ, một bản sao của kho lưu trữ đó sẽ được tạo ra trong tài khoản GitHub của bạn. Điều này cho phép bạn thay đổi mã nguồn mà không ảnh hưởng đến kho lưu trữ gốc.
Đầu tiên từ tài khoản chứa Project gốc, trường hợp của mình là tài khoản hoanghd164
(1) đang ở chế độ public (2). Bạn để ý (3) và (4) đang có 0 fork (tức là chưa có fork nào cả).
Lưu ý là nếu bạn là chủ sở hữu Repository thì bạn không thể fork dữ liệu của chính mình nhé.
Chuyển sang tài khoản thứ 2, trường hợp của mình là hoanghd16490
bấm vào fork và chọn Create a new fork.
Bây giờ bạn có thể đặt tên cho Repository
này, để copy toàn bộ thông tin của tất cả các nhánh có trong Repository
thì bạn hãy bỏ tích tại Copy the main branch only
và bấm Create fork
.
Giờ đây tại tài khoản hoanghd16490
bạn sẽ thấy xuất hiện Repository
là testproject (1). Để ý phần (2) bạn thấy thông tin forked from hoanghd16490/testproject
có ý nghĩa Repository
được copy từ tài khoản hoanghd164
.
Bây giờ nếu bạn chuyển qua tài khoản hoanghd164, bạn đã thấy 1 fork như hình dưới. Ý nghĩa là Repository của bạn đã có 1 tài khoản copy.
Bạn có thể vào Insights để xem tài khoản nào đã fork Repository của bạn.
Giờ ở Repository của tài khoản hoanghd16490 (1) bạn hãy copy link Repository.
Từ máy local mình sẽ tạo một thư mục tên gitclone để lưu Project đã fork xuống máy local.
mkdir /Users/hoanghd/Desktop/gitclone
cd /Users/hoanghd/Desktop/gitclone
Mình tiến hành clone Project này về máy local.
shell> git clone git@github.com:hoanghd16490/testproject.git
Cloning into 'testproject'...
remote: Enumerating objects: 33, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 33 (delta 8), reused 32 (delta 7), pack-reused 0
Receiving objects: 100% (33/33), done.
Resolving deltas: 100% (8/8), done.
Kết quả clone thành công.
shell> ls -al
total 0
drwxr-xr-x@ 3 hoanghd staff 96 Feb 13 20:01 .
drwx------@ 3 hoanghd staff 96 Feb 13 20:01 ..
drwxr-xr-x@ 8 hoanghd staff 256 Feb 13 20:01 testproject
Vào thư mục vừa clone xong mình đã thấy danh sách sourcecode của Project.
shell> cd testproject/
shell> ls -al
total 40
drwxr-xr-x@ 8 hoanghd staff 256 Feb 13 20:01 .
drwxr-xr-x@ 3 hoanghd staff 96 Feb 13 20:01 ..
drwxr-xr-x@ 12 hoanghd staff 384 Feb 13 20:01 .git
-rw-r--r--@ 1 hoanghd staff 11 Feb 13 20:01 a.txt
-rw-r--r--@ 1 hoanghd staff 18 Feb 13 20:01 add-by-main.txt
-rw-r--r--@ 1 hoanghd staff 28 Feb 13 20:01 b.txt
-rw-r--r--@ 1 hoanghd staff 89 Feb 13 20:01 c.txt
-rw-r--r--@ 1 hoanghd staff 25 Feb 13 20:01 d.txt
Kiểm tra lịch sử commit, mình cũng có kết quả tương tự như Repo gốc bên tài khoản hoanghd164
.
shell> git log --oneline
dcffaf8 (HEAD -> main, origin/main, origin/HEAD) Github1
13507ed M5 - Merge
4211e90 (tag: V1.0) M4 - gitlocal-192.168.13.232
28310f3 M4
74136ce M3
4c141f3 M2
7690035 M1
add27da C2
7de3cce C1
Để làm bài test tiếp theo, mình chỉnh sửa nội dung file d.txt.
shell> c
shell> cat d.txt
Lan dau push len Github
Cap nhat boi tai khoan hoanghd16490
Thêm một commit mới.
shell> git add .
shell> git commit -m"hoanghd16490 - C1"
[main 748eebe] hoanghd16490 - C1
1 file changed, 2 insertions(+)
shell> git log --oneline
748eebe (HEAD -> main) hoanghd16490 - C1
dcffaf8 (origin/main, origin/HEAD) Github1
13507ed M5 - Merge
4211e90 (tag: V1.0) M4 - gitlocal-192.168.13.232
28310f3 M4
74136ce M3
4c141f3 M2
7690035 M1
add27da C2
7de3cce C1
Khi bạn fork project này về bạn cũng sẽ nhận được một remote server có tên origin như dưới. Đây chính là địa chỉ liên kết từ local repo với remote repo.
shell> git remote -v
origin git@github.com:hoanghd16490/testproject.git (fetch)
origin git@github.com:hoanghd16490/testproject.git (push)
Giờ bạn hãy thực hiện push dữ liệu lên remote server bằng lệnh git push.
shell> git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 306 bytes | 306.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:hoanghd16490/testproject.git
dcffaf8..748eebe main -> main
Bạn reload lại trang Repository bạn sẽ thấy số lượng commit tăng từ 9 lên 10 commit (1) và file d.txt đã được cập nhật ở 1 phút trước và có commit cuối là hoanghd16490 – C1.
Giờ nếu bạn quay lại Repository của hoanghd164 (1) thì vẫn chỉ có 9 commit (3) và commit cuối vẫn là Github1 đã được cập nhật 5 ngày trước (2).
Điều này khẳng định 1 điều Repository của tài khoản hoanghd16490 sau khi fork hoàn toàn độc lập với Repository gốc của tài khoản hoanghd164. Điều này cho thấy bây giờ bạn có thể phát triển một cách độc lập với Repository gốc.
2.2. Pull Request.
Sau khi bạn đã thực hiện các thay đổi trong fork của mình và muốn những thay đổi đó được hợp nhất vào kho lưu trữ gốc, bạn có thể tạo một Pull Request. Pull Request là cách bạn thông báo cho người quản lý kho lưu trữ gốc rằng bạn có những thay đổi bạn muốn họ xem xét. Nếu họ chấp nhận Pull Request của bạn, thì những thay đổi của bạn sẽ được hợp nhất vào kho lưu trữ gốc.
Như vậy là một pull request đã được tạo ra và đang ở trạng thái Open. Ở đây mọi người có thể thảo luận về nội dung pull request này.
Sau khi pull request này được tạo ra thì chủ sở hữu Repository này sẽ nhận được một thông báo. Chúng ta quay lại tài khoản hoanghd164, trong mục Pull request chúng ta thấy 1 thông báo.
Nhấp vào thẻ Pull requests chúng ta sẽ thấy có một yêu cầu pull request như dưới.
Và sau khi kích vào pull request được yêu cầu, chủ sở hữu có thể thảo luận về nội dung của pull resquest cùng với người yêu cầu và xem nội dung chi tiết mà nó yêu cầu cập nhật.
Nếu bạn muốn xem chi tiết nội dung commit, bạn có thể bấm vào (1) và nếu đồng ý với Merge pull request thì bạn hãy bấm vào (2).
Đây là hình ảnh khi bạn bấm vào (1) để xem nội dung commit được yêu cầu merge pull request nhé.
Khi bạn bấm vào Merge pull request bạn sẽ nhận được giao diện như dưới, bạn có thể chỉnh sửa lại lời nhắn cho đối tác và bấm Confirm merge để đồng ý merge pull request.
Bạn sẽ nhận thông báo trộn nội dung thành công.
Khi quay lại tab Pull requests bạn không còn thấy yêu cầu nào nữa và bạn sẽ thấy có 1 pull request đã ở trạng thái close.
Như vậy Repository của chủ sở hữu hiện tại đã tăng từ 10 lên 11 commit và bạn cũng sẽ thấy có 1 thông báo Merge pull request #1 from hoanghd16490/main
thành công.
Như vậy chúng ta đã hoàn thành phần tìm hiểu về Fork và Pull Request.
Cảm ơn các bạn đã theo dõi.