Quy trình làm việc Github ưa thích để cập nhật yêu cầu kéo sau khi xem lại mã


341

Tôi đã gửi thay đổi cho dự án Nguồn mở trên Github và nhận được nhận xét đánh giá mã từ một trong những thành viên chính của nhóm.

Tôi muốn cập nhật mã có tính đến các nhận xét đánh giá và gửi lại. Quy trình làm việc tốt nhất để làm điều này là gì? Từ kiến ​​thức hạn chế của tôi về git / github, tôi có thể thực hiện bất kỳ thao tác nào sau đây:

  1. Cập nhật mã dưới dạng một cam kết mới và thêm cả cam kết ban đầu và cập nhật vào yêu cầu kéo của tôi.

  2. Bằng cách nào đó (??) khôi phục lại cam kết cũ từ kho lưu trữ của tôi và tạo một cam kết mới duy nhất chứa mọi thứ, sau đó đưa ra yêu cầu kéo cho điều đó?

  3. git commitcó một tính năng sửa đổi, nhưng tôi đã nghe nói rằng bạn không nên sử dụng nó sau khi bạn đã đẩy cam kết ra khỏi kho lưu trữ cục bộ của mình? Trong trường hợp này, tôi đã thực hiện thay đổi trên PC cục bộ của mình và đẩy sang chi nhánh github của dự án. Điều này có ổn không khi sử dụng 'sửa đổi'?

  4. Thứ gì khác?

Có vẻ như tùy chọn 2/3 sẽ tốt, vì dự án nguồn mở sẽ chỉ có một cam kết trong lịch sử của họ sẽ thực hiện mọi thứ, nhưng tôi không chắc làm thế nào để làm điều này.

Lưu ý: Tôi không biết điều này có ảnh hưởng đến câu trả lời hay không, nhưng tôi đã không thực hiện các thay đổi trong một nhánh riêng biệt, tôi chỉ thực hiện một cam kết trên đỉnh của chủ

Câu trả lời:


219

Chỉ cần thêm một cam kết mới vào nhánh được sử dụng trong yêu cầu kéo và đẩy nhánh tới GitHub. Yêu cầu kéo sẽ tự động được cập nhật với các cam kết bổ sung.

# 2 và # 3 là không cần thiết. Nếu mọi người chỉ muốn xem nơi chi nhánh của bạn được hợp nhất (và không phải là các cam kết bổ sung), họ có thể sử dụng git log --first-parentđể chỉ xem cam kết hợp nhất trong nhật ký.


7
mastercũng là một nhánh, vì vậy về mặt kỹ thuật nó không thành vấn đề :)
chọc vào

10
@OrionEdwards - như poke đã đề cập, master là một nhánh, do đó, việc cập nhật nó sẽ khiến bất kỳ yêu cầu kéo nào dựa trên nó cũng được cập nhật. (Đây là một lý do chính đáng để sử dụng một chi nhánh riêng cho bất kỳ điều gì bạn dự định gửi yêu cầu kéo.)
Amber

18
Kể từ khi các mã vẫn còn trong xem xét nó thường là tốt hơn để sửa chữa các cam kết (s) thay vì đưa ra các cam kết fixup bổ sung mà chỉ lộn xộn lịch sử ...
mgalgs

4
@mgasms Đó là vấn đề ưu tiên.
Amber

4
Tôi không thích câu trả lời này vì những lý do được giải thích trong bài đăng trên blog tôi vừa viết ; Tôi tin rằng câu trả lời khác là tốt hơn nhiều.
Adam Spiers

224

Để cập nhật yêu cầu kéo

Để cập nhật yêu cầu kéo (điểm # 1), điều duy nhất bạn cần làm là kiểm tra cùng một nhánh, yêu cầu kéo là từ và đẩy lại nó:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

Tùy chọn - Làm sạch lịch sử cam kết

Bạn có thể được yêu cầu xóa các cam kết của mình với nhau để lịch sử kho lưu trữ sạch sẽ hoặc chính bạn muốn xóa các cam kết trung gian làm mất tập trung vào "thông điệp" trong yêu cầu kéo của bạn (điểm # 2). Ví dụ: nếu lịch sử cam kết của bạn trông như thế này:

$ git remote add parent git@github.com:other-user/project.git
$ git fetch parent
$ git log --oneline parent/master..master
e4e32b8 add test case as per PR comments
eccaa56 code standard fixes as per PR comments
fb30112 correct typos and fatal error
58ae094 fixing problem

Đó là một ý tưởng tốt để kết hợp mọi thứ lại với nhau để chúng xuất hiện dưới dạng một cam kết duy nhất:

$ git rebase -i parent/master 

Điều này sẽ nhắc bạn chọn cách viết lại lịch sử yêu cầu kéo của bạn, phần sau đây sẽ có trong trình chỉnh sửa của bạn:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments

Đối với bất kỳ cam kết nào bạn muốn là một phần của cam kết trước đó - thay đổi chọn thành squash:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments

Và đóng trình soạn thảo của bạn. Git sau đó sẽ viết lại lịch sử và nhắc bạn cung cấp một thông điệp cam kết cho một cam kết kết hợp. Sửa đổi cho phù hợp và lịch sử cam kết của bạn bây giờ sẽ được súc tích:

$ git log --oneline parent/master..master
9de3202 fixing actual problem

Đẩy nó vào ngã ba của bạn:

$ git push -f
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 978 bytes, done.
Total 11 (delta 9), reused 7 (delta 6)
To git@github.com:me/my-fork.git
   f1238d0..9de3202  HEAD -> master

và yêu cầu kéo của bạn sẽ chứa một cam kết duy nhất, kết hợp tất cả các thay đổi được chia thành nhiều lần trước đó.

Thay đổi lịch sử trên repos công cộng là một điều xấu

Viết lại lịch sử và sử dụng git push -ftrên một nhánh, có khả năng, một người khác đã được nhân bản là một điều xấu - nó khiến lịch sử của kho lưu trữ và của thanh toán bị phân kỳ.

Tuy nhiên, sửa đổi lịch sử của ngã ba của bạn để sửa đổi thay đổi mà bạn đang đề xuất được tích hợp vào kho lưu trữ - là một điều tốt. Vì vậy, không có đặt phòng loại bỏ "tiếng ồn" ra khỏi yêu cầu kéo của bạn.

Một lưu ý trên cành

Trong phần trên tôi cho thấy yêu cầu kéo là đến từ masternhánh ngã ba của bạn, không có gì sai với điều đó nhất thiết nhưng nó tạo ra một số hạn chế nhất định, nếu đây là kỹ thuật tiêu chuẩn của bạn, chỉ có thể mở một PR cho mỗi kho lưu trữ . Mặc dù vậy, đó là một ý tưởng tốt hơn để tạo một chi nhánh cho từng thay đổi cá nhân mà bạn muốn đề xuất:

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets

28
+1 để đề cập đến cách làm sạch các cam kết thay vì đẩy các cam kết sửa chữa bổ sung.
mgasms

3
Tôi gặp phải một số vấn đề khi chọn / bẹp và câu trả lời này đã giúp tôi giải quyết. Cũng nhận thấy rằng Github đã xóa cuộc trò chuyện trước đó sau khi tôi đã làm git push -f. Không có nhiều bình luận, nhưng đó là điều tôi không mong đợi.
Hitesh

5
Nói rõ hơn, khi nổi loạn để có một lịch sử trong sạch, bạn thực sự đang thay đổi các cam kết công khai của mình, bạn chỉ cho rằng không ai quan tâm vì đó là một ngã ba.
brita_ 7/2/2015

2
Theo dõi: thực hành tốt nhất khi chủ thay đổi trong quá trình PR của bạn?
Kevin Scos

1
Hãy xem xét rằng viết lại lịch sử trên các yêu cầu kéo đã được xem xét (hoặc nói chung là có nhận xét về / mã giới thiệu) có thể dẫn đến nhầm lẫn, vì lịch sử sẽ không khớp với những gì các bình luận đề cập đến. Không có giải pháp dễ dàng: ai đó sẽ đóng PR và giới thiệu nó trong một cái mới (để không viết lại lịch sử); ý tưởng của tôi là chỉ sao lưu SHA cam kết mới nhất đang được thiết lập lại / viết lại và giới thiệu nó trong một nhận xét về PR, sau khi việc ép buộc đã được thực hiện. NẾU prune không xóa cam kết tách rời đó thì lịch sử của nó sẽ vẫn khớp với các bình luận của PR.
Kamafeather
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.