Hợp nhất yêu cầu kéo vào một nhánh khác với mặc định, trong Github


122

Một yêu cầu kéo đến repo của tôi được lưu trữ trên Github. Theo mặc định, nó được hợp nhất vào masterchi nhánh.

Có cách nào để tôi thay đổi nhánh mà các thay đổi sẽ được hợp nhất vào không?

Câu trả lời:


86

Kể từ ngày 15.08.2016 GitHub cho phép thay đổi nhánh mục tiêu của một yêu cầu kéo thông qua GUI. Nhấp vào Editbên cạnh tiêu đề, sau đó chọn nhánh từ trình đơn thả xuống.

ảnh chụp màn hình

Bây giờ bạn có thể thay đổi nhánh cơ sở của một yêu cầu kéo mở. Sau khi bạn đã tạo một yêu cầu kéo, bạn có thể sửa đổi nhánh cơ sở để những thay đổi trong yêu cầu kéo được so sánh với một nhánh khác. Bằng cách thay đổi nhánh cơ sở của yêu cầu kéo ban đầu của bạn thay vì mở một nhánh mới với nhánh cơ sở chính xác, bạn sẽ có thể giữ lại các công việc và thảo luận có giá trị.


1
Đây sẽ là câu trả lời đúng cho câu hỏi này (sau khi nâng cấp lên GitHub tức là).
stuxnetting

Tính năng này dường như không còn tồn tại nữa (kể từ 2018-02-15), phải không? Trong một yêu cầu kéo gần đây, nhánh mục tiêu được hiển thị bằng phông chữ màu xanh lam giống nhau trên nền màu xanh lam nhạt như kho lưu trữ / nhánh nguồn chứ không còn là một nút nữa.
cgogolin

12
Ah! Nó có! Trước tiên, người ta cần nhấp vào "Chỉnh sửa" (không rõ ràng trong ảnh chụp màn hình ở trên). Tôi đã bỏ qua điều này. Lấy làm tiếc.
cgogolin

@cgogolin Cảm ơn bạn đã chỉ ra điều đó - Tôi cũng bối rối, cho đến khi tôi đọc bình luận của bạn và nhấp vào nút Chỉnh sửa.
mhucka

Github cảnh báo rằng "Khi bạn thay đổi nhánh cơ sở của yêu cầu kéo của mình, một số cam kết có thể bị xóa khỏi dòng thời gian." và "Một số cam kết từ nhánh cơ sở cũ có thể bị xóa khỏi dòng thời gian." Có ý kiến ​​nào về nghĩa của cái này không?
Matthias Fripp

55

Người gửi có thể thay đổi điều đó khi họ đưa ra yêu cầu kéo, nhưng khi họ đưa ra yêu cầu đó, bạn không thể thay đổi nó.

Mặt khác, bạn có thể hợp nhất nhánh và đẩy của chúng theo cách thủ công, điều mà tôi thường xuyên làm đối với các yêu cầu kéo được nhắm mục tiêu sai.

Bạn có thể thấy hubgem hữu ích trong việc làm việc với các thành phần của pull request.

Viên ngọc đó kết thúc quy trình thủ công, đó là:

  1. Thêm điều khiển từ xa cho ngã ba vào thanh toán địa phương của bạn.
  2. Tìm điều khiển từ xa.
  3. git checkout ${target_branch} && git merge ${remote}/${branch}
  4. git push origin ...

1
Nếu tôi hợp nhất và đẩy theo cách thủ công, liệu Github có nhận ra rằng yêu cầu kéo đã được hoàn thành một cách hiệu quả không? Bất kỳ hướng dẫn nào về cách hợp nhất từ ​​một repo riêng biệt từ xa (ngã ba)?
eoinoc

3
Tôi không chắc chắn, nhưng không trực tiếp - vì thay đổi không hợp nhất vào nhánh mục tiêu, vì vậy yêu cầu kéo không được hoàn thành như đã xác định. Bạn cần phải đóng nó theo cách thủ công. Đối với con trỏ, hãy xem nhận xét đã chỉnh sửa.
Daniel Pittman

Tôi khuyên bạn nên sử dụng git merge --no-ff ...như @GuillermoMansilla đề cập trong câu trả lời của anh ấy.
jjmontes

3
"Một khi họ phát hành nó, bạn không thể thay đổi nó" - Không còn là trường hợp của tháng 8 năm 2016! Xem câu trả lời của @maliayas bên dưới: stackoverflow.com/a/38985999/12484
Jon Schneider.

1
Tôi đã làm theo quy trình này hôm nay (ngày 3 tháng 3 năm 2017). Tôi đã tải xuống pull request vào một nhánh khác và thực hiện một số bản sửa lỗi bổ sung cho nó, sau đó hợp nhất thành master. Khi các cam kết từ yêu cầu kéo kết thúc ở trạng thái chính, GitHub sẽ tự động đóng yêu cầu kéo.
Ivan Krivyakov

14

Một giải pháp thay thế cho việc sử dụng hub gem được đề cập bởi các câu trả lời khác là sử dụng dòng lệnh để hợp nhất các yêu cầu kéo cục bộ , cho phép bạn thực hiện:

$ git fetch origin
$ git checkout *target_branch*
$ git merge pr/XXX
$ git push origin *target_branch*

Các lệnh trên chỉ hoạt động trực tiếp nếu trước tiên bạn thêm dòng sau vào .git/configtệp của mình :

fetch = +refs/pull/*/head:refs/remotes/symbolic_name_origin_or_upstream/pr/*

Điều đó cho phép bạn tải xuống TẤT CẢ các yêu cầu kéo. Vì điều đó có thể không được mong muốn đối với các kho lưu trữ lớn, GitHub đã sửa đổi hướng dẫn để làm nổi bật git fetch origin pull/ID/head:BRANCHNAMEcú pháp, tránh sửa đổi tệp cấu hình và chỉ tải xuống yêu cầu kéo duy nhất đó.


8

Mặc dù bạn không thể thay đổi yêu cầu kéo hiện tại vì nó không phải của bạn, bạn có thể dễ dàng tạo một yêu cầu mới nếu kho lưu trữ nguồn liên quan vẫn tồn tại - có, ngay cả khi nó là của người khác.

Đi đến kho lưu trữ của người gửi, sau đó tạo một yêu cầu kéo mới trong kho lưu trữ của họ bằng cách sử dụng cùng các cam kết nhưng đảm bảo bạn đặt đúng nhánh mục tiêu.

Sau đó, quay lại kho lưu trữ của riêng bạn và chấp nhận yêu cầu kéo mới. Thì đấy!


Điều này có hoạt động nếu họ đã thay đổi kho lưu trữ của họ? Làm thế nào để đảm bảo rằng nó "cùng cam kết?"
ragerdl

@ragerdl - Nếu bạn đang phát triển bằng mô hình 'tính năng cho mỗi nhánh', thì bạn có thể tạo một PR với một nhánh chống lại một nhánh ngược dòng và nó phải chứa cùng các cam kết.
geerlingguy

2
Cách duy nhất để làm điều đó trực tiếp trên GitHub mà không cần truy cập vào kho lưu trữ cục bộ.
kopischke

8

Không có gì sai với giải pháp của Daniel Pittman, tuy nhiên tôi sẽ coi những hợp nhất đó là "không tua đi nhanh", tức là thay đổi bước số 3 cho:

git checkout ${target_branch} && git merge --no-ff ${remote}/${branch}

Bằng cách sử dụng --no-ff, lịch sử sẽ dễ đọc hơn. Nó sẽ nói rõ ràng rằng các $ncam kết đến từ đâu $branch, và nó cũng sẽ giúp cuộc sống của bạn dễ dàng hơn nếu bạn cần hoàn nguyên điều gì đó đã thực hiện trong nhánh đó.

Để trả lời câu hỏi của eoinoc và đưa ra một mẹo bổ sung:

Sau khi thực hiện hợp nhất, git cli của bạn sẽ nhắc bạn viết một tin nhắn, thường thì một tin nhắn chung chung sẽ hiển thị với nội dung như

Hợp nhất chi nhánh theo dõi từ xa 'người dùng / chi nhánh của họ' vào chi nhánh của bạn

Đảm bảo chỉnh sửa thông báo đó và bao gồm tham chiếu đến số yêu cầu kéo. Đó là: (Giả sử số yêu cầu kéo là 123)

Hợp nhất chi nhánh theo dõi từ xa 'người dùng / chi nhánh của họ' vào chi nhánh của bạn

refs # 123 giải quyết bất cứ điều gì ...

Vì vậy, lần tới khi bạn truy cập trang các vấn đề github / các yêu cầu kéo và kiểm tra yêu cầu kéo cụ thể đó, bạn sẽ thấy thông báo của mình với một liên kết để cam kết nơi bạn đã thực hiện hợp nhất.

Đây là một ảnh chụp màn hình của những gì tôi muốn nói.

nhập mô tả hình ảnh ở đây


6

Để làm điều đó, hãy truy cập trang chủ của kho lưu trữ của bạn, nhấp vào các nhánh và thay đổi nhánh mặc định từ cái chính thành một cái khác, trong trường hợp của tôi là "dev".

Sau đó, bất cứ khi nào ai đó tạo một yêu cầu kéo, mergenút sẽ tự động hợp nhất yêu cầu đó thành "dev" chứ không phải master.

nhập mô tả hình ảnh ở đây


cảm ơn cho sửa chữa typo @the Tín Man Tôi đánh giá cao nó
abbood

4
Không cần phải cảm ơn chúng tôi vì đã điều chỉnh / chỉnh sửa. Đó là điều chúng tôi làm cho trang web. Tiếp tục viết câu trả lời tốt, vậy là đủ cảm ơn.
the Tin Man
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.