Thứ ba, 25/09/2018 | 00:00 GMT+7

Cách Rebase và Cập nhật một yêu cầu kéo


Giới thiệu

Đóng góp vào các dự án open-souce là một trải nghiệm bổ ích khi bạn làm việc để cải thiện phần mềm cho user cuối như chính bạn. Sau khi bạn gửi yêu cầu kéo, quá trình đóng góp vào một dự án có thể yêu cầu một số khôi phục và làm lại mã trước khi được chấp nhận, sau đó là dọn dẹp chung các nhánh của bạn.

Hướng dẫn này sẽ hướng dẫn bạn một số bước tiếp theo mà bạn có thể cần thực hiện sau khi gửi yêu cầu kéo cho một dự án phần mềm nguồn mở.

Yêu cầu

Hướng dẫn này sẽ hướng dẫn bạn qua các bước bạn sẽ thực hiện sau khi thực hiện một yêu cầu kéo, vì vậy bạn nên cài đặt Git và đã thực hiện hoặc đang suy nghĩ về việc tạo một yêu cầu kéo.

Để tìm hiểu thêm về cách đóng góp cho các dự án open-souce , bạn có thể đọc phần giới thiệu này . Để tìm hiểu về việc thực hiện các yêu cầu kéo, bạn có thể đọc “ Cách tạo một yêu cầu kéo trên GitHub .”

Viết lại mã và làm sạch comment

Trong khi đóng góp cho open-souce , bạn có thể thấy rằng có xung đột giữa nhánh hoặc yêu cầu kéo của bạn và mã ngược dòng. Bạn có thể gặp lỗi như thế này trong shell của bạn :

Output
CONFLICT (content): Merge conflict in your-file.py Automatic merge failed; fix conflicts and then commit the result.

Hoặc như thế này trên yêu cầu kéo của bạn qua trang web của GitHub:

Xung đột yêu cầu kéo GitHub

Điều này có thể xảy ra nếu người bảo trì không phản hồi yêu cầu kéo của bạn trong một thời gian hoặc nếu nhiều người đang đóng góp cho dự án cùng một lúc. Khi điều này xảy ra và bạn vẫn muốn hợp nhất yêu cầu kéo của bạn , bạn sẽ phải giải quyết xung đột và căn cứ lại mã của bạn .

Một rebase cho phép ta di chuyển các nhánh xung quanh bằng cách thay đổi commit mà chúng dựa trên. Bằng cách này, ta có thể căn cứ lại mã của bạn để làm cho chúng dựa trên các commit gần đây hơn của nhánh chính. Việc hoàn vốn phải được thực hiện cẩn thận và bạn nên đảm bảo bạn đang làm việc với các commit phù hợp và đúng nhánh trong suốt quá trình. Ta cũng sẽ sử dụng git reflog bên dưới trong trường hợp bạn mắc lỗi.

Như ta đã làm trong hướng dẫn yêu cầu kéo , ta sẽ chuyển vào folder mã và tìm nạp version ngược dòng mới nhất của mã.

  • cd repository
  • git fetch upstream

Khi bạn đã download version ngược dòng của dự án, bạn có thể xóa các comment của bạn bằng cách thu nhỏ hoặc ghi lại các thông điệp commit của bạn để làm cho chúng dễ hiểu hơn đối với những người duy trì dự án. Nếu bạn không thực hiện nhiều commit nhỏ, điều này có thể không cần thiết.

Để bắt đầu quá trình này, bạn sẽ thực hiện một rebase tương tác. Một rebase tương tác được dùng để chỉnh sửa các thông báo commit trước đó, kết hợp nhiều commit thành một hoặc xóa hoặc hoàn nguyên các commit không còn cần thiết nữa. Để làm điều này, ta cần có thể tham chiếu các commit mà ta đã thực hiện bằng số hoặc bằng một chuỗi tham chiếu đến cơ sở của chi nhánh của ta .

Để biết số lượng commit mà ta đã thực hiện, ta có thể kiểm tra tổng số lần commit đã được thực hiện cho dự án bằng lệnh sau:

  • git log

Điều này sẽ cung cấp cho bạn kết quả giống như sau:

Output
commit 46f196203a16b448bf86e0473246eda1d46d1273 Author: username-2 <email-2> Date: Mon Dec 14 07:32:45 2015 -0400 Commit details commit 66e506853b0366c87f4834bb6b39d941cd034fe3 Author: username1 <email-1> Date: Fri Nov 27 20:24:45 2015 -0500 Commit details

Nhật ký hiển thị tất cả các commit được thực hiện đối với repository của dự án nhất định, vì vậy các commit của bạn sẽ được trộn lẫn với các commit của những người khác. Đối với các dự án có lịch sử commit sâu rộng của nhiều tác giả, bạn cần chỉ định mình là tác giả trong lệnh:

  • git log --author=your-username

Bằng cách chỉ định tham số này, bạn có thể đếm các commit mà bạn đã thực hiện. Nếu bạn đang làm việc trên nhiều nhánh, bạn có thể thêm --branches[=< branch >] vào cuối lệnh để giới hạn theo nhánh.

Bây giờ nếu bạn biết số lượng commit bạn đã thực hiện trên nhánh mà bạn muốn rebase, bạn chỉ cần chạy git rebase như sau:

  • git rebase -i HEAD~x

Ở đây, -i đề cập đến rebase có tính tương tác và HEAD đề cập đến commit mới nhất từ nhánh chính. x sẽ là số lượng commit bạn đã thực hiện đối với chi nhánh của bạn kể từ khi bạn tìm nạp lần đầu.

Tuy nhiên, nếu bạn không biết mình đã thực hiện bao nhiêu commit trên chi nhánh của bạn , bạn cần tìm commit nào là cơ sở của chi nhánh của bạn , bạn có thể thực hiện bằng cách chạy lệnh sau:

  • git merge-base new-branch master

Lệnh này sẽ trả về một chuỗi dài được gọi là băm commit , giống như sau:

Output
66e506853b0366c87f4834bb6b39d341cd094fe9

Ta sẽ sử dụng mã băm commit này để chuyển đến git rebase :

git rebase -i 66e506853b0366c87f4834bb6b39d341cd094fe9 

Đối với một trong các lệnh trên, editor dòng lệnh của bạn sẽ mở ra với một file chứa danh sách tất cả các commit trong nhánh của bạn và bây giờ bạn có thể chọn bỏ bớt các commit hay đặt lại từ khóa cho chúng.

Commit quả bí

Khi ta thu gọn các thông điệp commit , ta sẽ thu nhỏ hoặc kết hợp một số commit nhỏ hơn thành một thông báo lớn hơn.

Trước mỗi commit , bạn sẽ thấy từ “chọn”, vì vậy file của bạn sẽ trông giống như sau nếu bạn có hai commit :

GNU nano 2.0.6 Tệp:… username / repository / .git / rebase-merge / git-rebase-todo
pick a1f29a6 Adding a new feature pick 79c0e80 Here is another new feature  # Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s)) 

Bây giờ, đối với mỗi dòng của file ngoại trừ dòng đầu tiên, bạn nên thay thế từ “pick” bằng từ “squash” để kết hợp các commit :

GNU nano 2.0.6 Tệp:… username / repository / .git / rebase-merge / git-rebase-todo
pick a1f29a6 Adding a new feature squash 79c0e80 Here is another new feature 

Đến đây, bạn có thể lưu file , điều này sẽ mở ra một file mới kết hợp tất cả các thông báo commit của tất cả các commit . Bạn có thể đặt lại từ khóa cho thông báo commit khi thấy phù hợp, sau đó lưu file .

Bạn sẽ nhận được phản hồi sau khi đóng file :

Output
Successfully rebased and updated refs/heads/new-branch.

Đến đây bạn đã kết hợp tất cả các commit thành một bằng cách ghép chúng lại với nhau.

Commit ghi lại

Việc ghi lại các thông điệp commit sẽ rất hữu ích khi bạn nhận thấy lỗi đánh máy hoặc bạn nhận ra rằng mình không sử dụng ngôn ngữ song song cho mỗi commit của bạn .

Khi bạn thực hiện rebase tương tác như được mô tả ở trên với git rebase -i , bạn sẽ có một file mở ra trông giống như sau:

GNU nano 2.0.6 Tệp:… username / repository / .git / rebase-merge / git-rebase-todo
pick a1f29a6 Adding a new feature pick 79c0e80 Here is another new feature  # Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s)) 

Bây giờ, đối với mỗi commit mà bạn muốn đặt lại từ khóa, hãy thay thế từ “chọn” bằng “từ khóa”:

GNU nano 2.0.6 Tệp:… username / repository / .git / rebase-merge / git-rebase-todo
pick a1f29a6 Adding a new feature reword 79c0e80 Adding a second new feature  # Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s)) 

Sau khi bạn lưu file , một file văn bản mới sẽ xuất hiện trong editor terminal của bạn, hiển thị từ ngữ đã sửa đổi của thông báo commit . Nếu bạn muốn chỉnh sửa lại file , bạn có thể thực hiện trước khi lưu file . Làm điều này có thể đảm bảo các thông điệp commit của bạn là hữu ích và thống nhất.

Hoàn thành Rebase

Khi bạn đã hài lòng với số lượng commit mà bạn đang thực hiện và các thông báo commit có liên quan, bạn nên hoàn thành cơ sở lại chi nhánh của bạn trên đầu version mới nhất của mã ngược dòng của dự án. Để thực hiện việc này, bạn nên chạy lệnh này từ folder của repository của bạn:

  • git rebase upstream/master

Đến đây, Git sẽ bắt đầu phát lại các commit của bạn trên version master mới nhất. Nếu bạn gặp xung đột trong khi điều này xảy ra, Git sẽ tạm dừng để nhắc bạn giải quyết xung đột trước khi tiếp tục.

Khi bạn đã khắc phục các xung đột, bạn sẽ chạy:

  • git rebase --continue

Lệnh này sẽ cho Git biết rằng bây giờ nó có thể tiếp tục phát lại các commit của bạn.

Nếu trước đó bạn đã kết hợp các commit thông qua sử dụng lệnh squash , bạn sẽ chỉ cần giải quyết xung đột một lần.

Cập nhật yêu cầu kéo bằng Force-Push

Khi bạn thực hiện rebase, lịch sử của nhánh của bạn sẽ thay đổi và bạn không thể sử dụng git push vì đường dẫn trực tiếp đã được sửa đổi.

Thay vào đó, ta sẽ phải sử dụng cờ --force hoặc -f để thúc đẩy các thay đổi, thông báo cho Git rằng bạn hoàn toàn biết về những gì bạn đang đẩy.

Trước tiên, hãy đảm bảo push.default của ta rất simple , là mặc định trong Git 2.0+, bằng cách cấu hình nó:

  • git config --global push.default simple

Đến đây, ta nên đảm bảo ta đang ở đúng nhánh bằng cách kiểm tra nhánh mà ta đang làm việc:

  • git checkout new-branch
Output
Already on 'new-branch' . . .

Bây giờ ta có thể thực hiện lực đẩy:

  • git push -f

Đến đây bạn sẽ nhận được phản hồi về các bản cập nhật của bạn cùng với thông báo rằng đây là một forced update . Yêu cầu kéo của bạn hiện đã được cập nhật.

Khôi phục các commit đã mất

Nếu tại một thời điểm nào đó bạn ném ra một commit mà bạn thực sự muốn tích hợp vào dự án lớn hơn, bạn có thể sử dụng Git để khôi phục các commit mà bạn có thể đã vô tình vứt bỏ.

Ta sẽ sử dụng git reflog để tìm các commit bị thiếu và sau đó tạo một nhánh mới từ commit đó.

Reflog là viết tắt của các bản ghi tham chiếu ghi lại thời điểm các mẹo của các nhánh và các tham chiếu khác được cập nhật lần cuối trong repository lưu trữ local .

Từ folder local của repository mã mà ta đang làm việc, ta sẽ chạy lệnh:

  • git reflog

Sau khi chạy lệnh này, bạn sẽ nhận được kết quả giống như sau:

Output
46f1962 HEAD@{0}: checkout: moving from branch-1 to new-branch 9370d03 HEAD@{1}: commit: code cleanups a1f29a6 HEAD@{2}: commit: brand new feature 38f2fc2 HEAD@{3}: commit: remove testing methods . . .

Thông báo commit của bạn sẽ cho bạn biết commit nào là commit mà bạn đã bỏ lại và chuỗi liên quan sẽ nằm trước thông tin HEAD@{ x } ở phía bên trái của cửa sổ terminal của bạn.

Đến đây bạn có thể lấy thông tin đó và tạo một nhánh mới từ commit có liên quan:

  • git checkout -b new-new-branch a1f29a6

Trong ví dụ trên, ta đã tạo một nhánh mới từ commit thứ ba được hiển thị ở trên, một nhánh đã triển khai “tính năng hoàn toàn mới”, được đại diện bởi chuỗi a1f29a6 .

Tùy thuộc vào những gì bạn cần làm từ đây, bạn có thể làm theo các bước cài đặt chi nhánh của bạn trong hướng dẫn này về các yêu cầu kéo hoặc quay lại đầu hướng dẫn hiện tại để làm việc thông qua việc khôi phục chi nhánh mới.

Lưu ý : Nếu gần đây bạn đã chạy git gc để xóa các file không cần thiết và tối ưu hóa repository local , bạn có thể không khôi phục được các commit bị mất.

Điều gì sẽ xảy ra khi đánh giá mã

Khi bạn gửi một yêu cầu kéo, bạn đang đối thoại với một dự án lớn hơn. Gửi yêu cầu kéo là mời người khác nói về công việc của bạn, giống như chính bạn đang nói về và tham gia vào một dự án lớn hơn. Đối với bạn để có một cuộc trò chuyện thành công, điều quan trọng là bạn phải có thể truyền đạt lý do tại sao bạn thực hiện yêu cầu kéo thông qua các thông điệp commit của bạn , vì vậy tốt nhất là chính xác và rõ ràng nhất có thể.

Việc xem xét yêu cầu kéo có thể dài và chi tiết, tùy thuộc vào dự án. Tốt nhất hãy coi quá trình này như một trải nghiệm học hỏi và là một cách tốt để bạn cải thiện mã của bạn và làm cho yêu cầu kéo tốt hơn và phù hợp hơn với nhu cầu của dự án phần mềm. Việc xem xét sẽ cho phép bạn tự áp dụng các thay đổi thông qua lời khuyên và hướng dẫn của người bảo trì.

Yêu cầu kéo sẽ lưu giữ log ghi chú từ những người đánh giá và bất kỳ cập nhật và thảo luận nào mà bạn có cùng nhau. Bạn có thể cần phải thực hiện một số commit bổ sung trong suốt quá trình này trước khi yêu cầu kéo được chấp nhận. Điều này là hoàn toàn bình thường và tạo cơ hội tốt để bạn làm việc ôn tập với quyền là một phần của group .

Yêu cầu kéo của bạn sẽ tiếp tục được duy trì thông qua Git và được tự động cập nhật trong suốt quá trình miễn là bạn tiếp tục thêm các commit vào cùng một nhánh và đẩy các commit đó vào nhánh rẽ của bạn .

Mặc dù bạn đang đưa mã của bạn ra thế giới rộng lớn hơn để các đồng nghiệp của bạn đánh giá, bạn sẽ không bao giờ cảm thấy rằng bài đánh giá mang tính cá nhân, vì vậy hãy nhớ đọc các file CONTRIBUTION.md hoặc Luật ứng xử có liên quan. Điều quan trọng là đảm bảo các commit của bạn phù hợp với các nguyên tắc mà dự án quy định, nhưng nếu bạn bắt đầu cảm thấy không thoải mái, dự án bạn đang thực hiện có thể không xứng đáng với sự đóng góp của bạn. Có rất nhiều không gian chào đón trong cộng đồng open-souce và trong khi bạn có thể mong đợi mã của bạn được nhìn nhận với con mắt phê bình, tất cả phản hồi bạn nhận được phải chuyên nghiệp và lịch sự.

Chấp nhận yêu cầu kéo và xóa chi nhánh của bạn

Xin chúc mừng! Nếu yêu cầu kéo của bạn đã được chấp nhận, bạn đã đóng góp thành công cho một dự án phần mềm nguồn mở!

Đến đây, bạn cần đưa những thay đổi bạn đã thực hiện trở lại fork thông qua repository local của bạn. Đây là những gì bạn đã làm khi thực hiện quá trình đồng bộ hóa fork của bạn . Bạn có thể thực hiện việc này bằng các lệnh sau trong cửa sổ terminal của bạn :

  • git checkout master
  • git pull --rebase upstream master
  • git push -f origin master

Bây giờ, bạn nên dọn dẹp cả nhánh local và nhánh từ xa của bạn bằng cách xóa nhánh bạn đã tạo ở cả hai nơi vì chúng không còn cần thiết nữa. Đầu tiên, hãy xóa nhánh local :

  • git branch -d new-branch

Cờ -d được thêm vào git branch sẽ xóa branch mà bạn chuyển cho lệnh. Trong ví dụ trên, nó được gọi là nhánh mới .

Tiếp theo, ta sẽ xóa nhánh từ xa:

  • git push origin --delete new-branch

Với các nhánh đã bị xóa, bạn đã dọn sạch repository và các thay đổi hiện có trong repository lưu trữ chính. Bạn nên nhớ rằng chỉ vì những thay đổi bạn đã thực hiện thông qua yêu cầu kéo của bạn hiện là một phần của repository chính, chúng có thể không có sẵn cho user cuối trung bình đang download các bản phát hành công khai. Nói chung, các nhà bảo trì phần mềm sẽ gộp một số tính năng mới và các bản sửa lỗi lại với nhau thành một bản phát hành công khai duy nhất.

Kết luận

Hướng dẫn này đã hướng dẫn bạn một số bước tiếp theo mà bạn có thể cần phải hoàn thành sau khi gửi yêu cầu kéo đến repository open-souce .

Đó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ở năng động - thường 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 sẽ giúp đảm bảo phần mềm đó có giá trị và hữu ích cho cộng đồng user .


Tags:

Các tin liên quan