Làm thế nào để cập nhật một yêu cầu kéo từ repo ngã ba?


592

Vì vậy, lần đầu tiên tôi rẽ nhánh một repo và sau đó thực hiện một cam kết với repo ngã ba đó. Sau đó tôi mở một yêu cầu kéo. Yêu cầu kéo liệt kê tất cả những thay đổi tôi muốn.

Sau khi xem xét yêu cầu kéo của tôi, có một số thay đổi mà chủ sở hữu repo muốn tôi thực hiện trước khi anh ấy chấp nhận. Tôi đã thực hiện những thay đổi đó trong ngã ba của mình, bây giờ làm cách nào để cập nhật yêu cầu kéo với những thay đổi đó (hoặc đây không phải là cách tôi nên xử lý nó)?



7
@PaulDraper Tôi không đồng ý, người dùng đó đã biết và trình bày các phương pháp khác nhau để cập nhật yêu cầu kéo và hỏi cách nào là tốt nhất. Mặt khác, tôi không biết về bất kỳ phương pháp nào và đang hỏi về sự tồn tại của chúng. Như sự phổ biến của câu hỏi này cho thấy, đây là trường hợp của nhiều người dùng khác.
stevebot

6
Tôi nghĩ rằng sự phổ biến là do (1) đây là một câu hỏi thực sự hay, phổ biến và (2) một số người dùng ở đây thay vì ở đó. Nếu ban đầu nó được xác định là trùng lặp, họ sẽ tìm thấy câu hỏi khác giống nhau và trả lời câu hỏi của họ.
Paul Draper

Câu trả lời:


585

Bạn đã làm nó một cách chính xác. Yêu cầu kéo sẽ tự động cập nhật. Quá trình là:

  1. Yêu cầu kéo mở
  2. Cam kết thay đổi dựa trên phản hồi trong repo địa phương của bạn
  3. Đẩy đến nhánh có liên quan của ngã ba của bạn

Yêu cầu kéo sẽ tự động thêm các xác nhận mới ở cuối cuộc thảo luận về yêu cầu kéo (tức là đã có, cuộn xuống! )


73
đẹp! Tôi đã kiểm tra ở khắp mọi nơi nhưng yêu cầu kéo thực tế. ma thuật của nó, ma thuật đen, tôi sẽ không hỏi nó.
stevebot

57
Đây là một lý do tốt để làm việc trong các chi nhánh. Ví dụ, nếu bạn luôn được đẩy lên thành chủ, bạn có thể vô tình thêm vào yêu cầu kéo trước đó của mình.
Brian Pan

3
Điều này dường như không còn là vấn đề nữa, mặc dù nó đã là trong quá khứ. Đây là một ví dụ về yêu cầu kéo mà tôi đã thực hiện ( github.com/toopay/bootstrap-markdown/pull/167 ) so với chính chi nhánh ( github.com/mhuggins/bootstrap-markdown/commits/ tựa ). Tò mò làm thế nào để làm điều này nữa vì quá trình dường như đã thay đổi.
Matt Huggins

1
GitHub thực sự nói với bạn: "Thêm nhiều cam kết hơn bằng cách đẩy vào nhánh SolveWorldHunger trên ChangeTheWorldProject."
Flow2k

1
Tương tự ở đây - Tôi không thấy các thay đổi từ repo rẽ nhánh trong kho lưu trữ chính. Trông giống như một lỗi GitHub
andrfas

78

Cập nhật yêu cầu kéo trong GitHub cũng dễ như cam kết các thay đổi mong muốn vào nhánh hiện có (được sử dụng với yêu cầu kéo), nhưng thường thì nó cũng muốn nén các thay đổi thành một cam kết duy nhất:

git checkout yourbranch
git rebase -i origin/master

# Edit command names accordingly
  pick   1fc6c95 My pull request
  squash 6b2481b Hack hack - will be discarded
  squash dd1475d Also discarded

git push -f origin yourbranch

... và bây giờ yêu cầu kéo chỉ chứa một cam kết.


Liên kết liên quan về việc nổi loạn:


2
Upvote đã đề cập đến rebase. Nó giúp cắt bỏ tiếng ồn trong lịch sử sửa đổi.
stevebot

+11 (vâng, tôi dự định khóa lại. Sử dụng git rebase / pick / squash đang hoạt động rất tốt.
javadba

11
Nhược điểm của phương pháp này là bạn đang loại bỏ cam kết trước đó. Điều đó có nghĩa là nếu trong các yêu cầu kéo bình luận được thực hiện, chúng sẽ bị mất và biến mất cùng với cam kết ban đầu.
đòn tấn công

Trong Bitbucket, bạn có thể thấy các nhận xét về "các phiên bản trước" của tệp trong yêu cầu kéo. Mặc dù thật tuyệt khi thấy một cái gì đó giống như trong Gerrit nơi bạn vá các cam kết và có thể xem toàn bộ lịch sử bằng các bình luận. Nó làm cho một lịch sử git gọn gàng và truy xuất nguồn gốc khi bạn có thể quay lại và xem các cuộc thảo luận đầy đủ xung quanh bất kỳ cam kết nào.
Yêu

36

Chỉ cần đẩy đến nhánh mà yêu cầu kéo tham chiếu. Miễn là yêu cầu kéo vẫn mở, nó sẽ được cập nhật với bất kỳ cam kết nào được thêm tự động.


14

Tôi đã làm nó bằng các bước dưới đây:

  1. git reset --hard <commit key of the pull request>
  2. Có phải những thay đổi của tôi trong mã tôi muốn làm
  3. git add
  4. git commit --amend
  5. git push -f origin <name of the remote branch of pull request>

1
Rất tốt, tôi thích cách tiếp cận này! GitHub thậm chí còn ẩn (nhưng giữ) các phần lỗi thời của mã và các nhận xét liên quan. Bạn nên nhớ rằng nếu yêu cầu kéo chứa một số cam kết và yêu cầu sửa lỗi không nằm ở đầu nhánh, "git reset --hard" sẽ loại bỏ tất cả các thay đổi được cam kết sau ID được chỉ định. Tôi đã có một bản sao lưu mà tôi áp dụng bằng tay. Không thuận tiện lắm nếu có nhiều hơn một cam kết mặc dù ...
Nagev

3

Nếu sử dụng GitHub trên Windows :

  1. Thay đổi cục bộ.
  2. Mở GitHub, chuyển sang kho lưu trữ cục bộ, kho lưu trữ nhấp đúp.
  3. Chuyển nhánh (gần trên cùng của cửa sổ) sang nhánh mà bạn đã tạo yêu cầu kéo từ (tức là nhánh ở phía ngã ba của bạn so sánh)
  4. Nên xem tùy chọn để nhập nhận xét cam kết ở bên phải và cam kết thay đổi đối với repo cục bộ của bạn.
  5. Nhấp vào đồng bộ hóa trên đầu, trong số những thứ khác, sẽ đẩy cam kết của bạn từ cục bộ sang ngã ba từ xa trên GitHub.
  6. Yêu cầu kéo sẽ được cập nhật tự động với các cam kết bổ sung. Điều này là do yêu cầu kéo đại diện cho một khác biệt với chi nhánh của ngã ba của bạn. Nếu bạn đi đến trang yêu cầu kéo (trang mà bạn và những người khác có thể nhận xét về yêu cầu kéo của bạn) thì tab Cam kết sẽ có (các) cam kết bổ sung của bạn.

Đây là lý do tại sao, trước khi bạn bắt đầu thực hiện các thay đổi của riêng mình, bạn nên tạo một nhánh cho mỗi bộ thay đổi bạn dự định đưa vào yêu cầu kéo. Bằng cách đó, một khi bạn thực hiện yêu cầu kéo, sau đó bạn có thể tạo một nhánh khác và tiếp tục làm việc với một số tác vụ / tính năng / lỗi khác mà không ảnh hưởng đến yêu cầu kéo trước đó.

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.