Thứ bảy, 13/10/2018 | 00:00 GMT+7

Cách tạo yêu cầu kéo trên GitHub

Miễn phí và open-souce , Git là một hệ thống kiểm soát version phân tán giúp các dự án phần mềm cộng tác dễ quản lý hơn. Nhiều dự án duy trì file của họ trong repository lưu trữ Git và các trang web như GitHub đã thực hiện chia sẻ và đóng góp để mã trở nên đơn giản, có giá trị và hiệu quả.

Các dự án nguồn mở được lưu trữ trong các repository công cộng được hưởng lợi từ những đóng góp của cộng đồng nhà phát triển rộng lớn hơn thông qua các yêu cầu kéo, yêu cầu này yêu cầu một dự án chấp nhận những thay đổi mà bạn đã thực hiện đối với repository mã của nó.

Hướng dẫn này sẽ hướng dẫn bạn thực hiện một yêu cầu kéo đến repository Git thông qua dòng lệnh để bạn có thể đóng góp cho các dự án phần mềm nguồn mở.

Yêu cầu

Bạn nên cài đặt Git trên máy local của bạn . Bạn có thể kiểm tra xem Git đã được cài đặt trên máy tính của bạn chưa và thực hiện quá trình cài đặt hệ điều hành của bạn theo hướng dẫn này .

Bạn cũng cần phải có hoặc tạo account GitHub. Bạn có thể làm như vậy thông qua trang web GitHub, github.com và có thể đăng nhập hoặc tạo account của bạn .

Cuối cùng, bạn nên xác định một dự án phần mềm open-souce để đóng góp. Bạn có thể trở nên quen thuộc hơn với các dự án open-souce bằng cách đọc qua phần giới thiệu này .

Tạo bản sao của repository

Kho lưu trữ , hay gọi tắt là repo , về cơ bản là folder chính của một dự án. Kho chứa tất cả các file dự án có liên quan, bao gồm cả tài liệu và cũng lưu trữ lịch sử sửa đổi cho mỗi file . Trên GitHub, kho có thể có nhiều cộng tác viên và có thể là công khai hoặc riêng tư.

Để làm việc trên một dự án open-souce , trước tiên bạn cần tạo bản sao repository của riêng mình. Để làm điều này, bạn nên phân nhánh repository và sau đó sao chép nó để bạn có một bản sao làm việc local .

Fork the Repository

Bạn có thể phân nhánh một repository trên GitHub bằng cách chuyển bằng trình duyệt của bạn đến URL GitHub của dự án nguồn mở mà bạn muốn đóng góp.

Các URL của repository GitHub sẽ tham chiếu đến cả tên user được liên kết với chủ sở hữu của repository , cũng như tên repository . Ví dụ: Cộng đồng DigitalOcean là chủ sở hữu của repository dự án cloud_haiku , vì vậy URL GitHub cho dự án đó là:

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

Trong ví dụ trên, do-community là tên user và cloud_haiku là tên repository .

Khi bạn đã xác định được dự án bạn muốn đóng góp, bạn có thể chuyển đến URL, URL sẽ đượ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 GitHub.

Khi bạn đang ở trang chính của repository , bạn sẽ thấy nút “Fork” ở phía trên bên phải của trang, bên dưới biểu tượng user của bạn:

GitHub Forking

Nhấp vào nút fork để bắt đầu quá trình fork. Trong cửa sổ trình duyệt của bạn, bạn sẽ nhận được phản hồi giống như sau:

Forking trên GitHub

Khi hoàn tất , trình duyệt của bạn sẽ chuyển đến màn hình tương tự như hình ảnh repository ở trên, ngoại trừ việc ở trên cùng, bạn sẽ thấy tên user của bạn trước tên repository và trong URL, nó cũng sẽ hiển thị tên user của bạn trước tên repository .

Vì vậy, trong ví dụ trên, thay vì do-community / cloud_haiku ở đầu trang, bạn sẽ thấy your-username / cloud_haiku và URL mới sẽ giống như sau:

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

Với repository được phân nhánh, bạn đã sẵn sàng sao chép nó để bạn có một bản sao hoạt động local của cơ sở mã.

Sao chép repository

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

Ta sẽ sử dụng git clone cùng với URL trỏ đến nhánh repository của bạn.

URL này sẽ tương tự như URL ở trên, ngoại trừ bây giờ nó sẽ kết thúc bằng .git . Trong ví dụ cloud_haiku ở trên, URL sẽ giống như sau:

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

Ngoài ra, bạn có thể sao chép URL bằng cách sử dụng nút “Sao chép hoặc download ” màu xanh lá cây từ trang repository mà bạn vừa tách từ trang repository ban đầu. Khi bạn nhấp vào nút, bạn có thể sao chép URL bằng cách nhấp vào nút liên kết bên cạnh URL:

GitHub Sao chép hoặc  Download

Khi ta có URL, ta đã sẵn sàng sao chép repository . Để làm điều này, ta sẽ kết hợp git clone với URL repository từ dòng lệnh trong cửa sổ terminal :

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

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

Tạo chi nhánh mới

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

Các chi nhánh chính mặc định của một repository dự án thường được gọi là chi nhánh tổng thể. Một phương pháp hay nhất phổ biến là coi bất kỳ thứ gì trên nhánh chính là có thể triển khai cho người khác sử dụng bất kỳ lúc nào.

Khi tạo một nhánh, điều rất quan trọng là bạn phải tạo nhánh mới ngoài nhánh chính. Bạn cũng nên đảm bảo tên chi nhánh của bạn là một tên mô tả. Thay vì gọi nó my-branch , thay vào đó, bạn nên sử dụng frontend-hook-migration hoặc fix-documentation-typos .

Để tạo chi nhánh của ta , từ cửa sổ terminal của ta , hãy thay đổi folder của ta để ta đang làm việc trong folder của repository . Đảm bảo sử dụng tên thực của repository (chẳng hạn như cloud_haiku ) để thay đổi thành folder đó.

cd repository 

Bây giờ, ta sẽ tạo nhánh mới bằng git branch . Đảm bảo rằng bạn đặt tên nó một cách mô tả để những người khác làm việc trong dự án hiểu bạn đang làm gì.

  • git branch new-branch

Bây giờ chi nhánh mới của ta đã được tạo, ta có thể chuyển đổi đảm bảo rằng ta đang làm việc trên chi nhánh đó bằng cách sử dụng git checkout :

  • git checkout new-branch

Khi bạn nhập git checkout , bạn sẽ nhận được kết quả sau:

Output
Switched to branch 'new-branch'

Ngoài ra, bạn có thể cô đọng hai lệnh trên, tạo và chuyển sang một nhánh mới, với lệnh sau và cờ -b :

  • git checkout -b new-branch

Nếu bạn muốn chuyển về chế độ chính, bạn sẽ sử dụng lệnh checkout với tên của nhánh chính:

  • git checkout master

Lệnh checkout sẽ cho phép bạn chuyển đổi giữa nhiều chi nhánh, vì vậy bạn có thể làm việc trên nhiều tính năng cùng một lúc.

Đến đây, bây giờ bạn có thể sửa đổi các file hiện có hoặc thêm file mới vào dự án trên nhánh của bạn .

Thực hiện thay đổi local

Khi bạn đã sửa đổi file hiện có hoặc thêm file mới vào dự án, bạn có thể thêm file đó vào repository local của bạn , điều này ta có thể thực hiện với git add . Hãy chuyển tên của file đã thay đổi vào lệnh này:

  • git add filename.md

Điều này sẽ đảm bảo file của bạn đã sẵn sàng để được thêm vào. Nếu bạn đang tìm cách thêm tất cả các file trong một folder cụ thể, bạn có thể sắp xếp chúng bằng git add . nơi dừng hoặc khoảng thời gian đầy đủ sẽ thêm tất cả các file có liên quan. Nếu bạn đang tìm cách thêm đệ quy tất cả các thay đổi bao gồm cả những thay đổi trong folder con, bạn có thể nhập lệnh git add -A hoặc git add -all cho tất cả các file mới được sắp xếp.

Với file của ta theo giai đoạn, ta sẽ muốn ghi lại những thay đổi mà ta đã thực hiện đối với repository bằng git commit .

Thông điệp commit là một khía cạnh quan trọng trong đóng góp mã của bạn; nó giúp những người đóng góp khác hiểu đầy đủ về thay đổi bạn đã thực hiện, lý do bạn thực hiện và tầm quan trọng của nó. Ngoài ra, thông điệp commit cung cấp profile lịch sử về những thay đổi của dự án nói chung, giúp những người đóng góp trong tương lai trong suốt quá trình.

Nếu ta có một thông báo rất ngắn, ta có thể ghi lại thông báo đó bằng cờ -m và thông báo trong dấu ngoặc kép:

  • git commit -m "Fixed documentation typos"

Tuy nhiên, trừ khi đó là một thay đổi rất nhỏ, ta có nhiều khả năng sẽ 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 ta hoàn toàn bắt kịp với đóng góp của ta . Để ghi lại thông báo lớn hơn này, ta sẽ chạy git commit để mở editor mặc định:

  • git commit

Nếu bạn muốn cấu hình editor mặc định của bạn , bạn có thể làm như vậy bằng git config và đặ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 git commit , tùy thuộc vào editor mặc định mà bạn đang 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 trông giống như sau:

GNU nano 2.0.6 Tệp:… tên user / kho / .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 # 

Bên dưới các comment giới thiệu, bạn nên thêm thông điệp commit vào file 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 bản tóm tắt trên dòng đầu tiên dài khoảng 50 ký tự. Dưới đây, và được chia thành các phần dễ hiểu, bạn nên bao gồm mô tả nêu rõ lý do bạn thực hiện thay đổi này, cách mã hoạt động và thông tin bổ sung sẽ ngữ cảnh hóa và làm rõ nó để những người khác đánh giá công việc khi hợp nhất nó. Cố gắng trở nên hữu ích và chủ động nhất có thể đảm bảo rằng những người duy trì dự án có thể hiểu đầy đủ về đóng góp của bạn.

Khi bạn đã lưu và thoát khỏi file văn bản tin nhắn commit , bạn có thể xác minh git sẽ commit những gì bằng lệnh sau:

  • git status

Tùy thuộc vào những thay đổi bạn đã thực hiện, bạn sẽ nhận được kết quả giống như sau:

Output
On branch new-branch Your branch is ahead of 'origin/new-branch' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working directory clean

Đến đây, bạn có thể sử dụng git push để đẩy các thay đổi vào nhánh hiện tại của repository đã phân nhánh của bạn:

  • git push --set-upstream origin new-branch

Lệnh sẽ cung cấp cho bạn kết quả để cho bạn biết về tiến trình và nó sẽ trông 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 /respository .git a1f29a6..79c0e80 new-branch -> new-branch Branch new-branch set up to track remote branch new-branch from origin.

Đến đây bạn có thể chuyển đến repository được phân nhánh trên trang web GitHub của bạn và chuyển sang nhánh bạn vừa đẩy để xem những thay đổi bạn đã thực hiện trong trình duyệt.

Đến đây, có thể thực hiện một yêu cầu kéo đến repository ban đầu, nhưng nếu bạn chưa làm như vậy, bạn cần đảm bảo repository local của bạn được cập nhật với repository ngược dòng.

Cập nhật repository local

Trong khi bạn đang làm việc trên một dự án cùng với những người đóng góp khác, điều quan trọng là bạn phải cập nhật repository local của bạn với dự án vì bạn không muốn thực hiện một yêu cầu kéo đối với mã sẽ gây ra xung đột. Để luôn cập nhật bản sao local của cơ sở mã, bạn cần phải đồng bộ hóa các thay đổi.

Trước tiên, ta sẽ đi cấu hình điều khiển từ xa cho fork, sau đó đồng bộ hóa fork.

Cấu hình điều khiển từ xa cho Fork

Các repository từ xa giúp bạn có thể 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 version của dự án được lưu trữ trên Internet hoặc mạng mà bạn có quyền truy cập. Mỗi repository từ xa phải có thể truy cập được với bạn dưới dạng chỉ đọc hoặc đọc-ghi, tùy thuộc vào quyền user của bạn.

Để có thể đồng bộ hóa các thay đổi bạn thực hiện trong một nhánh với repository ban đầu mà bạn đang làm việc, bạn cần cấu hình điều khiển từ xa tham chiếu đến repository ngược dòng. Bạn chỉ nên cài đặt điều khiển từ xa vào repository ngược dòng một lần.

Trước tiên, hãy kiểm tra xem bạn đã cấu hình server từ xa nào. Lệnh git remote sẽ liệt kê bất kỳ repository từ xa nào bạn đã chỉ định, vì vậy nếu bạn sao chép repository của bạn như ta đã làm ở trên, ít nhất bạn sẽ thấy repository root , là tên mặc định do Git đặt cho folder nhân bản.

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

  • git remote -v

Vì ta đã nhân bản một repository , kết quả của ta sẽ trông 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 trước đó bạn đã cài đặt nhiều điều khiển từ xa, git remote -v sẽ cung cấp danh sách tất cả chúng.

Tiếp theo, ta sẽ chỉ định một repository ngược dòng từ xa mới để ta đồng bộ hóa với fork. Đây sẽ là repository ban đầu mà ta đã tách. Ta sẽ thực hiện việc này bằng git remote add .

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

Trong ví dụ này, upstream là tên viết tắt mà ta đã cung cấp cho repository từ xa vì về mặt Git, “ngược dòng” đề cập đến repository mà ta đã sao chép từ đó. Nếu ta muốn thêm một con trỏ từ xa vào repository của một cộng tác viên, ta có thể cần cung cấp tên user của cộng tác viên đó hoặc biệt hiệu rút gọn cho tên ngắn đó.

Ta có thể xác minh con trỏ từ xa của ta đến repository ngược dòng đã được thêm đúng cách bằng cách sử dụng lại git remote -v từ folder repository :

  • 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)

Đến đây bạn có thể tham khảo upstream trên dòng lệnh thay vì viết toàn bộ URL và bạn đã sẵn sàng đồng bộ hóa fork của bạn với repository ban đầu.

Đồng bộ hóa Fork

Khi ta đã cấu hình một điều khiển từ xa tham chiếu đến repository root và ngược dòng trên GitHub, ta đã sẵn sàng đồng bộ hóa nhánh của repository để cập nhật nó.

Để đồng bộ fork của ta , từ folder của repository local của ta trong cửa sổ terminal , ta sẽ sử dụng git fetch để tìm nạp các nhánh cùng với các commit tương ứng của chúng từ repository ngược dòng. Vì ta đã sử dụng tên viết tắt “ngược dòng” để tham chiếu đến repository ngược dòng, ta sẽ chuyển điều đó vào lệnh:

  • git fetch upstream

Tùy thuộc vào số lượng thay đổi đã được thực hiện kể từ khi ta chia nhỏ repository , kết quả của bạn có thể khác và có thể bao gồm một vài dòng về đếm, nén và extract các đối tượng. Đầu ra của bạn sẽ kết thúc tương tự như các dòng sau, nhưng có thể khác nhau tùy thuộc vào số lượng nhánh là một phần của dự án:

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

Bây giờ, các commit với nhánh chính sẽ được lưu trữ trong một nhánh local được gọi là upstream/master .

Hãy chuyển sang nhánh chính local của repository của ta :

  • git checkout master
Output
Switched to branch 'master'

Bây giờ ta sẽ hợp nhất bất kỳ thay đổi nào đã được thực hiện trong nhánh chính của repository ban đầu, mà ta sẽ truy cập thông qua nhánh thượng nguồn / chính local của ta , với nhánh chính local của ta :

  • git merge upstream/master

Kết quả ở đây sẽ khác nhau, nhưng nó sẽ bắt đầu bằng Updating nếu các thay đổi đã được thực hiện hoặc Already up-to-date. nếu không có thay đổi nào được thực hiện kể từ khi bạn chia nhỏ repository .

Chi nhánh chính của fork hiện được đồng bộ hóa với repository ngược dòng và bất kỳ thay đổi local nào bạn thực hiện đều không bị mất.

Tùy thuộc vào quy trình làm việc của bạn và lượng thời gian bạn dành cho việc thực hiện thay đổi, bạn có thể đồng bộ hóa fork của bạn với mã ngược dòng của repository ban đầu bao nhiêu lần tùy ý. Nhưng chắc chắn bạn nên đồng bộ fork của bạn ngay trước khi thực hiện yêu cầu kéo đảm bảo rằng bạn không đóng góp mã xung đột.

Tạo yêu cầu kéo

Đến đây, bạn đã sẵn sàng để thực hiện yêu cầu kéo đến repository ban đầu.

Bạn nên chuyển đến repository đã phân nhánh của bạn và nhấn nút “Yêu cầu kéo mới” ở phía bên trái của trang.

Nút yêu cầu kéo GitHub

Bạn có thể sửa đổi nhánh trên màn hình tiếp theo. Trên một trong hai trang web, bạn có thể chọn repository thích hợp từ trình đơn thả xuống và nhánh thích hợp.

Khi bạn đã chọn, chẳng hạn như nhánh chính của repository root ở phía bên trái và nhánh mới của repository đã phân nhánh của bạn ở phía bên phải, bạn sẽ thấy một màn hình như sau:

Yêu cầu kéo GitHub

GitHub sẽ cảnh báo bạn rằng bạn có thể hợp nhất hai nhánh vì không có mã cạnh tranh. Bạn nên thêm tiêu đề, comment , sau đó nhấn nút “Tạo yêu cầu kéo”.

Đến đây, những người duy trì repository root sẽ quyết định có chấp nhận yêu cầu kéo của bạn hay không. Họ có thể yêu cầu bạn chỉnh sửa hoặc sửa đổi mã của bạn trước khi chấp nhận yêu cầu kéo.

Kết luận

Đến đây, bạn đã gửi thành công một yêu cầu kéo đến một repository open-souce . Sau đây, bạn nên đảm bảo cập nhật và căn cứ lại mã của bạn trong khi chờ xem xét. Người bảo trì dự án có thể yêu cầu bạn làm lại mã của bạn , vì vậy bạn nên chuẩn bị để làm điều đó.

Đóng góp vào các dự án nguồn mở - và trở thành một nhà phát triển nguồn mở tích cực - có thể là một trải nghiệm bổ ích. Đóng góp thường xuyên cho phần mềm bạn thường xuyên sử dụng cho phép bạn đảm bảo phần mềm đó có giá trị đối với những user cuối khác.

Nếu bạn muốn tìm hiểu thêm về Git và cộng tác trên open-souce , bạn có thể đọc loạt bài hướng dẫn của ta có tựa đề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 cheat sheets , bạn có thể tham khảo “ Cách sử dụng Git: Hướng dẫn tham khảo ”.


Tags:

Các tin liên quan