Tạo Pull Request trên GitHub: Quy trình chuẩn dành cho developer

Tạo Pull Request trên GitHub: Quy trình chuẩn dành cho developer

Git là một hệ thống quản lý phiên bản phân tán, mã nguồn mở, giúp lập trình viên theo dõi thay đổi trong mã nguồn và cộng tác hiệu quả trong các dự án phần mềm. Với Git, việc quản lý mã nguồn trở nên linh hoạt hơn, cho phép nhiều nhà phát triển làm việc trên cùng một dự án mà không gây xung đột dữ liệu.

Nhờ các nền tảng như GitHub, GitLab và Bitbucket, lập trình viên có thể dễ dàng chia sẻ, đóng góp và duy trì mã nguồn một cách chuyên nghiệp. Đặc biệt, các dự án mã nguồn mở trên kho công khai nhận được sự hỗ trợ lớn từ cộng đồng thông qua pull requests—cách thức gửi đề xuất thay đổi để tích hợp vào dự án chính.

DataOnline sẽ hướng dẫn bạn cách tạo pull request bằng dòng lệnh để gửi các thay đổi của mình lên một kho Git từ xa. Điều này không chỉ giúp bạn đóng góp vào các dự án mã nguồn mở mà còn nâng cao kỹ năng làm việc nhóm và quản lý phiên bản trong phát triển phần mềm.

Yêu Cầu Tiên Quyết

Cài đặt Git: Bạn cần phải cài đặt Git trên máy tính của mình. Hãy kiểm tra xem Git đã được cài đặt hay chưa và làm theo hướng dẫn cài đặt cho hệ điều hành của bạn.

Tài khoản GitHub: Bạn cần có hoặc tạo một tài khoản GitHub. Truy cập github.com để đăng nhập hoặc đăng ký tài khoản.

Xác Thực: Từ tháng 11/2020, GitHub đã loại bỏ xác thực bằng mật khẩu. Do đó, bạn cần tạo personal access token hoặc thêm thông tin SSH public key để có thể truy cập các kho GitHub qua dòng lệnh.

Chọn Dự Án Mã Nguồn Mở: Cuối cùng, hãy chọn một dự án mã nguồn mở để đóng góp. Bạn có thể làm quen với các dự án mã nguồn mở thông qua phần giới thiệu chung về chủ đề này.

Tạo bản sao của kho mã nguồn

Một repository (hoặc viết tắt là repo) chính là thư mục chính chứa toàn bộ tệp dự án, bao gồm tài liệu và lịch sử sửa đổi của từng tệp. Trên GitHub, các kho có thể có nhiều cộng tác viên và có thể ở chế độ công khai hoặc riêng tư.

Để làm việc trên một dự án mã nguồn mở, bạn cần tạo bản sao của kho bằng cách fork và sau đó clone về máy để có một bản làm việc cục bộ.

Fork kho mã nguồn

Bạn có thể fork một kho (repository) trên GitHub bằng cách mở trình duyệt và truy cập vào URL của dự án mã nguồn mở mà bạn muốn đóng góp.

URL của các kho trên GitHub sẽ bao gồm cả tên người dùng của chủ sở hữu và tên của kho.

https://github.com/do-community/cloud_haiku

Trong ví dụ trên, do-community là tên người dùng và cloud_haiku là tên của kho.

Sau khi bạn đã xác định được dự án mà mình muốn đóng góp, bạn có thể truy cập URL, được định dạng như sau:

https://github.com/username/repository

Hoặc, bạn có thể tìm kiếm dự án bằng thanh tìm kiếm của GitHub.

Khi bạn ở trang chính của kho, một nút Fork sẽ hiển thị ở góc trên bên phải của trang, ngay dưới biểu tượng người dùng của bạn.

Thiet ke chua co ten 39

Nhấp vào nút Fork để bắt đầu quá trình fork. Trong cửa sổ trình duyệt, bạn sẽ nhận được thông báo rằng kho bạn đang fork đang được xử lý.

Thiet ke chua co ten 40

Sau khi quá trình hoàn tất, trình duyệt của bạn sẽ chuyển đến một màn hình tương tự như màn hình của kho ban đầu, ngoại trừ ở đầu trang bạn sẽ thấy tên người dùng của bạn xuất hiện trước tên kho, và trong URL cũng sẽ hiển thị tên người dùng của bạn trước tên kho.

Vậy, trong ví dụ trên, thay vì hiển thị do-community / cloud_haiku ở đầu trang, bạn sẽ thấy your-username / cloud_haiku, và URL mới sẽ có dạng:

https://github.com/your-username/cloud_haiku

Với kho đã được fork, bạn đã sẵn sàng để clone về máy, từ đó có một bản sao làm việc cục bộ của mã nguồn.

Clone kho mã nguồn

Để tạo bản sao cục bộ của kho mà bạn muốn đóng góp, trước tiên hãy mở cửa sổ terminal.

Chúng ta sẽ sử dụng lệnh git clone kèm theo URL trỏ đến kho mà bạn đã fork.

URL này sẽ tương tự như URL đã nêu ở trên, chỉ khác là nó sẽ kết thúc bằng .git. Ví dụ, với kho cloud_haiku đã nói ở trên, URL sẽ có dạng (với tên người dùng thực tế của bạn thay thế your-username):

https://github.com/your-username/cloud_haiku.git

Bạn cũng có thể sao chép URL bằng cách sử dụng nút “⤓ Code” màu xanh từ trang kho mà bạn đã fork từ kho gốc. Sau khi nhấp vào nút đó, bạn có thể sao chép URL bằng cách nhấn nút clipboard bên cạnh URL.

Thiet ke chua co ten 41

Sau khi có URL, chúng ta đã sẵn sàng để clone kho. Để làm điều này, hãy kết hợp lệnh git clone với URL của kho trên dòng lệnh trong cửa sổ terminal:

git clone https://github.com/your-username/repository.git

Bây giờ, khi đã có bản sao cục bộ của mã nguồn, chúng ta có thể chuyển sang tạo một nhánh mới để làm việc với mã nguồn đó.

Tạo nhánh mới

Khi bạn làm việc trong một dự án hợp tác, bạn và các lập trình viên khác đóng góp cho repository sẽ có những ý tưởng khác nhau về tính năng mới hoặc sửa lỗi cùng một lúc. Một số tính năng mới có thể không mất nhiều thời gian để triển khai, nhưng có những tính năng thì cần theo dõi và phát triển liên tục. Vì lý do này, việc tạo nhánh (branch) cho repository rất quan trọng để bạn có thể quản lý quy trình làm việc, cô lập mã của mình, và kiểm soát các tính năng nào được hợp nhất vào nhánh chính của dự án.

Nhánh chính của một repository thường được gọi là main branch. Một quy tắc hay được khuyến nghị là coi mọi thứ trên nhánh chính luôn sẵn sàng để triển khai cho người khác sử dụng bất cứ lúc nào.

Lưu ý: Vào tháng 6/2020, GitHub đã cập nhật thuật ngữ, thay vì gọi nhánh mặc định là master, giờ đây nhánh mặc định được gọi là main. Nếu nhánh mặc định của bạn vẫn hiển thị là master, bạn có thể thay đổi thành main bằng cách cập nhật cài đặt nhánh mặc định.

Khi tạo nhánh dựa trên dự án hiện có, điều quan trọng là bạn phải tạo nhánh mới từ nhánh main. Ngoài ra, hãy đặt tên cho nhánh sao cho mô tả được mục đích của bạn; thay vì gọi nó là my-branch, bạn nên đặt tên như frontend-hook-migration hoặc fix-documentation-typos.

Để tạo nhánh từ cửa sổ terminal, trước tiên hãy chuyển đến thư mục chứa repository (chắc chắn sử dụng tên chính xác của repository, ví dụ như cloud_haiku):

cd repository

Sau đó, tạo nhánh mới bằng lệnh:

git branch new-branch

Giờ đây, khi nhánh mới đã được tạo, bạn có thể chuyển sang nhánh đó bằng lệnh:

git checkout new-branch

Khi bạn chạy lệnh git checkout new-branch, bạn sẽ nhận được thông báo như sau:

Output
Switched to branch 'new-branch'

Ngoài ra, bạn có thể kết hợp hai lệnh trên thành một với cờ -b:

git checkout -b new-branch

Nếu bạn muốn chuyển lại về nhánh main, hãy sử dụng lệnh:

git checkout main

Lệnh checkout cho phép bạn chuyển đổi giữa các nhánh khác nhau, từ đó bạn có thể làm việc trên nhiều tính năng cùng lúc.

Tại thời điểm này, bạn đã sẵn sàng để chỉnh sửa các tệp hiện có hoặc thêm tệp mới vào dự án trên nhánh riêng của mình.

Thực hiện thay đổi cục bộ

Để minh họa cách tạo pull request, hãy sử dụng repository cloud_haiku làm ví dụ và tạo một tệp mới trong bản sao cục bộ của bạn. Dùng trình soạn thảo văn bản ưa thích của bạn để tạo một tệp mới, để chúng ta có thể thêm một bài thơ haiku mới như đã được hướng dẫn trong các quy định đóng góp. Ví dụ, chúng ta có thể dùng nano và đặt tên tệp là filename.md. Bạn cần đặt tên cho tệp của mình một cách độc đáo và có phần mở rộng .md cho Markdown.

nano filename.md

Tiếp theo, chúng ta sẽ thêm một số nội dung vào tệp mới, theo đúng các quy định đóng góp. Chúng ta cần sử dụng định dạng Jekyll và thêm một bài haiku với các dấu ngắt dòng. Dưới đây là một ví dụ về tệp, vì bạn cần đóng góp một bài haiku nguyên bản:

filename.md
---
layout: haiku
title: Octopus Cloud
author: Sammy
---

Distributed cloud <br>
Like the octopuses' minds <br>
Across the network <br>

Sau khi đã nhập nội dung, hãy lưu và đóng tệp. Nếu bạn dùng nano, thực hiện bằng cách nhấn CTRL + X, sau đó Y ENTER.

Sau khi bạn đã chỉnh sửa một tệp hiện có hoặc thêm tệp mới vào dự án, bạn có thể đưa tệp đó vào giai đoạn “staging” của repository cục bộ bằng lệnh git add. Trong ví dụ này, với tệp filename.md, ta sẽ nhập:

git add filename.md

Lệnh này đã chỉ định tên của tệp vừa tạo để đưa nó vào trạng thái sẵn sàng cho commit, đảm bảo tệp của bạn đã sẵn sàng được thêm vào repository.

Nếu bạn muốn thêm tất cả các tệp mà bạn đã chỉnh sửa trong một thư mục cụ thể, bạn có thể đưa tất cả chúng vào staging bằng lệnh:

git add .

Ở đây, dấu chấm (.) đại diện cho tất cả các tệp liên quan.

Nếu bạn muốn thêm đệ quy tất cả các thay đổi, bao gồm cả các tệp trong các thư mục con, bạn có thể nhập:

git add .

Hoặc, thay thế bằng:

git add -A

để đưa tất cả các tệp mới vào trạng thái staging.

Sau khi tệp của bạn đã được đưa vào staging, chúng ta cần ghi lại những thay đổi đã thực hiện đối với repository bằng lệnh git commit.

Đưa thay đổi lên kho mã

Thông điệp commit là một phần quan trọng trong đóng góp mã nguồn của bạn; nó giúp cho người quản lý và các cộng tác viên khác hiểu rõ những thay đổi bạn đã thực hiện, lý do thực hiện và mức độ quan trọng của chúng. Ngoài ra, thông điệp commit còn cung cấp một bản ghi lịch sử của các thay đổi trong toàn bộ dự án, hỗ trợ cho các cộng tác viên trong tương lai.

Nếu bạn có một thông điệp rất ngắn, bạn có thể ghi lại bằng cờ -m kèm theo thông điệp trong dấu ngoặc kép. Trong ví dụ của chúng ta về việc thêm một bài haiku, lệnh git commit có thể như sau:

git commit -m "Added a new haiku in filename.md file"

Nếu thay đổi của bạn không phải là nhỏ hoặc đã được mong đợi, bạn có thể muốn bao gồm một thông điệp commit dài hơn để các cộng tác viên của bạn nắm rõ đóng góp của bạn. Để ghi lại thông điệp dài hơn, bạn chạy lệnh git commit, lệnh này sẽ mở trình soạn thảo văn bản mặc định:

git commit

Khi chạy lệnh này, bạn có thể nhận thấy mình đang ở trong trình soạn thảo vim, và bạn có thể thoát ra bằng cách gõ :q. Nếu bạn muốn cấu hình trình soạn thảo mặc định, bạn có thể sử dụng lệnh git config để đặt nano làm trình soạn thảo mặc định, ví dụ:

git config --global core.editor "nano"

Hoặc vim:

git config --global core.editor "vim"

Sau khi chạy lệnh git commit, tùy thuộc vào trình soạn thảo mặc định bạn sử dụng, cửa sổ terminal của bạn sẽ hiển thị một tài liệu sẵn sàng để bạn chỉnh sửa, tương tự như sau:

GNU nano 2.0.6 File: …username/repository/.git/COMMIT_EDITMSG

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch new-branch
# Your branch is up-to-date with 'origin/new-branch'.
#
# Changes to be committed:
#       modified:   new-feature.py
#

Dưới các dòng chú thích ở trên, bạn nên thêm thông điệp commit của mình vào tệp văn bản.

Để viết một thông điệp commit hữu ích, bạn nên bao gồm một dòng tóm tắt ở dòng đầu tiên với khoảng 50 ký tự. Phía dưới dòng tóm tắt đó, chia nhỏ thành các phần dễ hiểu, bạn nên cung cấp một mô tả giải thích lý do bạn thực hiện thay đổi, cách thức hoạt động của mã nguồn và thông tin bổ sung để giúp người khác có thể đánh giá và hiểu rõ công việc của bạn khi hợp nhất mã. Hãy cố gắng hữu ích và chủ động nhất có thể để đảm bảo rằng những người quản lý dự án có thể hiểu đầy đủ đóng góp của bạn.

 Thay đổi

Sau khi bạn đã lưu và đóng tệp văn bản chứa thông điệp commit, bạn có thể kiểm tra những gì Git sẽ commit bằng lệnh:

git status

Tùy thuộc vào những thay đổi bạn đã thực hiện, bạn sẽ nhận được đầu ra (output) giống như sau:

Output
On branch new-branch
nothing to commit, working tree clean

Tại thời điểm này, bạn có thể sử dụng lệnh git push để đẩy các thay đổi lên nhánh hiện tại của repository đã fork:

git push --set-upstream origin new-branch

Lệnh này sẽ hiển thị tiến trình và đầu ra giống như sau:

Output
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 336 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/your-username/repository.git
   a1f29a6..79c0e80  new-branch  -> new-branch
Branch new-branch set up to track remote branch new-branch from origin.

Giờ đây, bạn có thể truy cập repository đã fork trên trang GitHub của bạn và chuyển sang nhánh vừa đẩy để xem các thay đổi bạn đã thực hiện trên trình duyệt.

Tại thời điểm này, bạn có thể tạo pull request gửi đóng góp của mình đến repository gốc. Tuy nhiên, nếu bạn chưa làm điều đó, bạn nên đảm bảo rằng repository cục bộ của bạn đã được cập nhật với repository gốc (upstream) để tránh gây ra xung đột mã nguồn.

Cập nhật kho mã cục bộ

Trong khi bạn làm việc trên một dự án cùng với các cộng tác viên khác, việc giữ cho repository cục bộ của bạn luôn được cập nhật với dự án là rất quan trọng, vì bạn không muốn tạo pull request cho những đoạn mã tự động gây ra xung đột (mặc dù trong các dự án hợp tác, xung đột là điều không tránh khỏi). Để giữ cho bản sao cục bộ của bạn luôn cập nhật, bạn cần đồng bộ các thay đổi.

Trước tiên, chúng ta sẽ cấu hình một remote cho repository đã fork, sau đó tiến hành đồng bộ repository fork.

Cấu hình remote cho kho Fork

Các repository từ xa cho phép bạn cộng tác với những người khác trong một dự án Git. Mỗi repository từ xa là một phiên bản của dự án được lưu trữ trên Internet hoặc trên một mạng mà bạn có quyền truy cập. Tùy thuộc vào quyền của bạn, mỗi repository từ xa có thể được thiết lập ở chế độ chỉ đọc hoặc đọc-ghi.

Để có thể đồng bộ các thay đổi mà bạn thực hiện trong một repository đã fork với repository gốc mà bạn đang làm việc, bạn cần cấu hình một remote trỏ đến repository gốc (upstream). Việc này chỉ cần thiết lập một lần.

Đầu tiên, hãy kiểm tra các remote server mà bạn đã cấu hình. Lệnh git remote sẽ liệt kê các repository từ xa mà bạn đã chỉ định, vì vậy nếu bạn đã clone repository như hướng dẫn ở trên, bạn sẽ ít nhất nhận được đầu ra liên quan đến remote origin – tên mặc định được Git gán cho thư mục được clone.

Từ thư mục của repository trong cửa sổ terminal, hãy sử dụng lệnh git remote cùng với cờ -v để hiển thị các URL mà Git đã lưu cùng với các tên ngắn của remote (ví dụ như “origin”):

git remote -v

Vì bạn đã clone một repository, đầu ra của bạn sẽ giống như sau:

Output
origin    https://github.com/your-username/forked-repository.git (fetch)
origin    https://github.com/your-username/forked-repository.git (push)

Nếu bạn đã cấu hình nhiều hơn một remote, lệnh git remote -v sẽ liệt kê tất cả chúng.

Tiếp theo, chúng ta sẽ chỉ định một remote mới với tên upstream để đồng bộ với repository đã fork. Đây chính là repository gốc mà bạn đã fork từ đó. Chúng ta sẽ làm điều này bằng lệnh git remote add:

git remote add upstream https://github.com/original-owner-username/original-repository.git

Với ví dụ về cloud_haiku, lệnh sẽ là:

git remote add upstream https://github.com/do-community/cloud_haiku.git

Trong ví dụ này, upstream là tên ngắn mà chúng ta đặt cho repository từ xa vì theo Git, “upstream” ám chỉ repository mà chúng ta đã clone từ đó. Nếu bạn muốn thêm một remote trỏ đến repository của một cộng tác viên, bạn có thể sử dụng tên người dùng hoặc một biệt danh ngắn gọn cho remote đó.

Bạn có thể xác minh rằng remote trỏ đến upstream đã được thêm thành công bằng cách sử dụng lại lệnh:

git remote -v
Output
origin    https://github.com/your-username/forked-repository.git (fetch)
origin    https://github.com/your-username/forked-repository.git (push)
upstream    https://github.com/original-owner-username/original-repository.git (fetch)
upstream    https://github.com/original-owner-username/original-repository.git (push)

Giờ đây, bạn có thể tham chiếu đến upstream trên dòng lệnh thay vì phải nhập đầy đủ URL, và bạn đã sẵn sàng để đồng bộ repository fork của mình với repository gốc.

Đồng bộ kho Fork

Sau khi chúng ta đã cấu hình một remote trỏ đến repository gốc (upstream) và repository ban đầu trên GitHub, chúng ta đã sẵn sàng để đồng bộ fork của mình nhằm giữ cho nó luôn được cập nhật.

Để đồng bộ fork, từ thư mục repository cục bộ trong cửa sổ terminal, chúng ta sẽ sử dụng lệnh git fetch để tải về các nhánh cùng với các commit tương ứng từ repository upstream. Vì chúng ta đã sử dụng tên ngắn “upstream” để chỉ repository gốc, nên chúng ta sẽ truyền tên đó cho lệnh:

git fetch upstream

Tùy thuộc vào số lượng thay đổi đã được thực hiện kể từ khi bạn fork repository, đầu ra (output) có thể khác nhau và có thể bao gồm một vài dòng liên quan đến việc đếm, nén và giải nén các đối tượng. Đầu ra của bạn sẽ kết thúc tương tự như các dòng dưới đây, nhưng có thể thay đổi tùy thuộc vào số lượng nhánh trong dự án:

Output
From https://github.com/original-owner-username/original-repository
 * [new branch]      main     -> upstream/main

Giờ đây, các commit trên nhánh main sẽ được lưu vào một nhánh cục bộ có tên upstream/main.

Hãy chuyển sang nhánh main cục bộ của repository bằng lệnh:

git checkout main
Output
Switched to branch 'main'

Tiếp theo, chúng ta sẽ hợp nhất tất cả các thay đổi được thực hiện trên nhánh main của repository gốc (được truy cập thông qua nhánh cục bộ upstream/main) vào nhánh main cục bộ của bạn:

git merge upstream/main

Đầu ra ở đây có thể khác nhau, nhưng sẽ bắt đầu với “Updating” nếu có thay đổi, hoặc “Already up-to-date.” nếu không có thay đổi nào kể từ khi bạn fork repository.

 Nhánh main của fork của bạn bây giờ đã được đồng bộ với repository upstream, và mọi thay đổi cục bộ bạn đã thực hiện sẽ không bị mất.

Tùy thuộc vào quy trình làm việc của bạn và thời gian bạn dành để thực hiện các thay đổi, bạn có thể đồng bộ fork với mã của repository gốc bao nhiêu lần cũng được. Nhưng bạn nên đồng bộ fork ngay trước khi tạo pull request để đảm bảo rằng bạn không tự động đóng góp mã gây ra xung đột.

Tạo Pull Request

Ở thời điểm này, bạn đã sẵn sàng để tạo một pull request gửi đến repository gốc.

Bạn nên truy cập vào repository đã fork của mình và nhấn vào nút New pull request ở phía bên trái của trang.

Thiet ke chua co ten 42
– 1

Trên màn hình tiếp theo, bạn có thể thay đổi nhánh; ở mỗi bên, hãy chọn repository phù hợp từ menu thả xuống và chọn nhánh tương ứng.

Ví dụ, khi bạn chọn nhánh main của repository gốc ở bên trái và nhánh new-branch của repository đã fork ở bên phải, bạn sẽ nhận được một màn hình thông báo rằng các nhánh của bạn có thể được hợp nhất nếu không có mã nào mâu thuẫn:

Thiet ke chua co ten 43

Bạn cần thêm tiêu đề và bình luận vào các trường thích hợp, sau đó nhấn nút Create pull request.

Ở thời điểm này, người quản lý của repository gốc sẽ quyết định có chấp nhận pull request của bạn hay không. Họ có thể yêu cầu bạn chỉnh sửa hoặc điều chỉnh lại mã của mình trước khi chấp nhận pull request thông qua quá trình review mã.

Kết luận

Ở thời điểm này, bạn đã gửi thành công một pull request tới repository phần mềm mã nguồn mở. Sau đó, trong khi chờ được review, hãy đảm bảo rằng bạn luôn cập nhật và thực hiện rebase mã của mình. Các quản lý dự án có thể yêu cầu bạn chỉnh sửa lại mã, vì vậy hãy sẵn sàng để thực hiện các thay đổi cần thiết.

Đóng góp cho các dự án mã nguồn mở – và trở thành một lập trình viên chủ động trong cộng đồng mã nguồn mở – có thể mang lại trải nghiệm vô cùng bổ ích. Việc thường xuyên đóng góp cho phần mềm mà bạn sử dụng hàng ngày sẽ giúp đảm bảo rằng phần mềm đó luôn có giá trị tối đa đối với người dùng cuối.

Nếu bạn quan tâm tìm hiểu thêm về Git và cách hợp tác trong các dự án mã nguồn mở, bạn có thể đọc chuỗi bài hướng dẫn của chúng tôi mang tên Giới thiệu về mã nguồn mở. Nếu bạn đã quen thuộc với Git và muốn có một bảng cheat sheet, hãy tham khảo Cách Sử Dụng Git: Hướng Dẫn Tham Khảo.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *