Cách mở nhiều yêu cầu kéo trên GitHub


139

Khi tôi mở một yêu cầu kéo trên GitHub .
Tất cả các cam kết kể từ yêu cầu cuối cùng của tôi và tất cả các cam kết mới được tự động thêm vào yêu cầu này .

Tôi dường như không thể kiểm soát những cam kết nào được thêm vào và những gì không.
Khi tôi cố gắng mở một yêu cầu kéo khác, tôi gặp lỗi "Rất tiếc! Đã có yêu cầu kéo".

Có cách nào dễ dàng để mở nhiều yêu cầu kéo mà không phải loay hoay với dòng lệnh không?

Câu trả lời:


116

Yêu cầu kéo được dựa trên một chi nhánh.
Cách duy nhất để mở một yêu cầu kéo cho nhiều lần xác nhận là:

  1. Cô lập chúng vào chi nhánh riêng của họ .
  2. Mở các yêu cầu kéo từ đó.

3
Ok thật tuyệt, tôi nghĩ rằng nó chỉ với chủ. Vì vậy, ý của bạn là tôi có thể tạo nhiều nhánh (ví dụ: tính năng git Flow) và thực hiện các yêu cầu kéo cho mỗi trong số chúng ... Sẽ thử!
Ziyan Junaideen

8
Tôi chỉ thấy rằng chi nhánh lưu giữ lịch sử của các lần xác nhận trước đó, vì vậy yêu cầu kéo ngược dòng vẫn bao gồm tất cả các cam kết.
lươn ghEEz

2
Xin chào @ eel-gheez, bạn đã biết phải làm gì về điều này? Làm thế nào để tạo PR riêng biệt mà không có thay đổi từ các nhánh khác được hiển thị?
Jonathan Cross

3
Điều này không giải quyết được vấn đề: Khi tôi cố gắng tạo PR cả hai nhánh (với ít nhất một cam kết mỗi nhánh) được so sánh. Tôi đang làm gì sai?
MERose

1
@eelghEEz Bạn nên tạo một chi nhánh mới, git cherry-pick tất cả các cam kết bạn muốn cho chi nhánh này và sau đó thực hiện một yêu cầu kéo từ chi nhánh này. Đây là một tính năng thiết kế rất quan trọng của git mà mỗi cam kết phụ thuộc vào cam kết trước đó và cam kết trong git không nên chỉ là một bản vá, mà là một bản vá biết bản vá nào được áp dụng trước đó. Vì vậy, đây là lý do tại sao người ta nên tạo một nhánh mới với các xác nhận mới, các khác biệt của chúng có thể vẫn giống nhau, nhưng các liên kết đến các cam kết trước đó thì khác.
MD

11

Cách dễ nhất mà tôi tìm thấy để làm điều này là với lệnh hub ( https://github.com/defunkt/hub ).

Từ nhánh chủ đề của bạn ("tính năng" trong ví dụ này) mà bạn muốn tạo yêu cầu kéo, bạn chỉ có thể chạy:

git pull-request

(hãy nhớ đẩy chi nhánh của bạn trước!)

Và nó sẽ mở một yêu cầu kéo mới trên GitHub cho "YOU_USER: tính năng".

Nếu bạn đã tạo sự cố trên GitHub, bạn thậm chí có thể đính kèm yêu cầu kéo với vấn đề hiện có (điều bạn không thể làm từ giao diện người dùng web):

$ git pull-request -i 123
[ attached pull request to issue #123 ]

2

Bạn thực sự CÓ THỂ làm điều này mà không cần tạo một nhánh khác, nhưng phải mất một chút để chơi xung quanh.
Đây là các bước:

  1. Xác định hai phạm vi cam kết bạn muốn kéo. Đây là những gì tôi sẽ sử dụng cho một ví dụ:
    (other / master) A -> B -> C -> D -> E (của bạn / master)
    Hãy nói rằng bạn muốn kéo B và C trong một yêu cầu và D & E ở khác.
  2. Thực hiện một yêu cầu kéo. Có bên trái ("Cơ sở") được cam kết A. Đối với bên phải ("đầu"), nhập số cam kết của C.
  3. Viết mô tả cho yêu cầu đầu tiên của bạn.
  4. Thực hiện một yêu cầu khác. Đối với cơ sở, nhập số cam kết của C và đối với đầu, đặt E (của bạn / chủ).
  5. Viết mô tả.

Như tôi thấy, yêu cầu kéo xem cam kết C là một điểm nhánh. Hoặc một cái gì đó.


Bạn phải để người khác / chủ ở bên trái ngay cả khi bạn đang thêm số cam kết từ bạn / chủ. Ngoài ra phương pháp này không cho phép bạn thêm các cam kết mới vào yêu cầu hợp nhất, trong trường hợp cần thêm một số thay đổi.
frisco

Tôi đã đăng một bài theo dõi các câu trả lời này, ngược lại với một số thông tin trên Github, xem stackoverflow.com/questions/23159860
Mark Bennett

Tôi có thể thấy điều này sẽ tạo ra hai PR trông chính xác, trong đó mỗi PR chứa chính xác các cam kết mong muốn. Nhưng, để rõ ràng, nó làm điều đúng khi họ được hợp nhất? Như trong, tôi có thể thấy rằng PR đầu tiên sẽ hợp nhất chính xác B & C với người khác / chủ. Nhưng khi PR thứ 2 hợp nhất, làm thế nào để biết chi nhánh nào hợp nhất vào? (Vì nó được tạo trên commit 'C', không phải trên other / master) Có vấn đề gì khi các PR được hợp nhất không? (có lẽ là như vậy)
Jonathan Hartley

1

Khi ban đầu bạn đi tạo yêu cầu kéo, nếu bạn mở hai biểu mẫu riêng cho yêu cầu kéo mới, nó sẽ cho phép bạn tạo chúng miễn là chúng được trỏ vào các nhánh khác nhau để được hợp nhất. Ví dụ: tôi có thể tạo hai Yêu cầu riêng biệt, một Yêu cầu để hợp nhất thành chủ và một Yêu cầu khác để hợp nhất vào thử nghiệm.


1

Tôi mới sử dụng Git và GitHub và có cùng câu hỏi với OP.

Tôi đã tìm thấy một giải pháp, có lẽ không có sẵn tại thời điểm OP.

Tình huống: Bạn có 3 thay đổi và bạn muốn mỗi thay đổi được thực hiện trước đó và mỗi thay đổi sẽ có yêu cầu kéo riêng (PR).

Vấn đề: Khi bạn tạo PR đầu tiên cố gắng phát triển thành chủ, mọi thứ đều ổn, nhưng sau khi bạn thực hiện các thay đổi cho PR thứ hai và hợp nhất chúng (sử dụng cùng một nhánh), tất cả các thay đổi đều nằm trong cùng một PR .

Giải pháp nhỏ: Tạo một chi nhánh mới

git branch mini_change_2
git checkout mini_change_2

Bây giờ bạn đẩy mã sang GitHub và tạo PR, nhưng nó mặc định là Kéo từ mini_change_2 sang master, ngoại trừ master chưa có các thay đổi từ PR đầu tiên, vì vậy nó bao gồm tất cả các thay đổi từ PR1 và PR2.

Giải pháp tốt nhất: Chỉ định chi nhánh bạn hợp nhất trong PR2.

Không chỉ chấp nhận mặc định khi tạo PR thứ hai, giả sử bạn sẽ kéo mini_chnage_2 để Phát triển, điều này sẽ chỉ hiển thị các thay đổi trong mini_change_2

Bây giờ hãy tạo một nhánh mới mini_change_3 và PR cho mini_change_3.

Vấn đề xảy ra khi bạn bắt đầu hợp nhất chúng ... nhưng đó là một bài tập khá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.