2015-06-10 16 views
6

Tôi có một khối nguyên khối của một chi nhánh tính năng. Thay vì một PR lớn thành master tôi muốn chia nó thành 3 prs.Git: yêu cầu kéo phân chia thành các PR nhỏ hơn dựa trên các thư mục mới trong yêu cầu kéo

Lý tưởng nhất là tôi muốn rút ra một số mã độc lập từ chi nhánh tính năng thành PR. Mã này nằm trong một thư mục mới và chưa được gọi đến vì vậy nó sẽ là một PR tương đối an toàn. Tuy nhiên thay vì chỉ sao chép thư mục và tạo một cam kết duy nhất và PR tôi muốn giữ lại tất cả lịch sử cam kết của các thay đổi cho PR mới.

Điều này có thể sử dụng Git không? Tôi đã nhìn vào bộ lọc-chi nhánh nhưng có vẻ như đó là để tách một repo thành hai, không phải để tách một sự khác biệt của các thay đổi thành hai (nếu điều đó có ý nghĩa).

Trả lời

6

Yêu cầu kéo Github luôn liên quan đến chi nhánh. Nếu bạn muốn "chia một yêu cầu kéo", hãy chắc chắn rằng nó được chia thành các cam kết và sau đó tạo một nhánh cho mỗi yêu cầu kéo mà bạn muốn thực hiện và đảm bảo mỗi nhánh tính năng đó có tất cả các cam kết có liên quan. Có vẻ như một chiến lược tốt cho bạn có thể là tạo ra 3 chi nhánh bên cạnh nhánh chính của bạn, chọn các cam kết có liên quan cho từng chi nhánh, xóa chúng trên chính, và có sự hợp nhất chính với từng nhánh của ba nhánh. Sau đó, bạn có thể có một PR cho mỗi chi nhánh và lịch sử được chia sẻ quá.

+0

Xin lỗi tôi có thể chưa đủ rõ ràng. Tôi muốn chia nhánh với một tập hợp các thay đổi thành nhiều nhánh dựa trên một thư mục. I E.một cách sẽ được sao chép các thư mục chỉ vào một chi nhánh mới ra khỏi chủ và cam kết và thực hiện một PR nhưng sau đó nó sẽ mất tất cả lịch sử cam kết liên kết với các tập tin trong thư mục đó. Vậy có cách nào để kéo các tệp ra khỏi một chi nhánh bao gồm cả lịch sử cam kết của họ vào một chi nhánh mới không? – user3768149

2

có cách nào để kéo tệp ra khỏi chi nhánh bao gồm lịch sử cam kết của họ vào chi nhánh mới không?

Bạn kéo một cam, có nghĩa là toàn bộ một repo vào một chi nhánh, không chỉ là một số tác phẩm.

Một lựa chọn tốt sau đó sẽ được thiết lập lại các tập tin bạn không muốn nội dung trước khi chi nhánh của họ

--x--x--x (master) 
     \ 
      y--y--y (branch B1 with mixed work) 
       \ 
        z (new branch B2, but with some files reset to master) 

B2 bắt đầu từ B1 và bao gồm các tập tin mà bạn muốn, với lịch sử của họ.
Nhưng B2 cũng bao gồm các tệp khác từ B1 mà bạn muốn là master.

Bạn có thể làm (trong B2) a git reset --soft master: a git status sẽ cho bạn biết tất cả các thay đổi bạn cần thực hiện để chỉ mục của bạn phản ánh chính. Chỉ cần không thêm các thay đổi liên quan đến các tệp bạn muốn giữ.
Và đừng cam kết. Bạn chỉ muốn thay đổi giai đoạn trở lại master cho một số tệp.

(Xem thêm "Practical uses of git reset --soft?")

Khi đã xong, một git reset --soft B2 động thái quay trở lại B2 (nhưng với một chỉ số ghi lại tất cả những thay đổi và xóa bỏ cần thiết để phản ánh tổng thể cho các tập tin bên phải).

Bạn có thể cam kết ngay bây giờ, với các tệp khác được hoàn nguyên về master và các tệp bạn muốn bị ảnh hưởng, giống hệt với B1, với lịch sử của chúng còn nguyên vẹn.

+0

Cảm ơn một tấn! Tôi se thử no. – user3768149

+0

@ user3768149 lưu ý: khi HEAD được chuyển đến 'master', (' reset --soft master'), bạn có thể thực hiện đơn giản 'git checkout - afile' cho các tệp khác mà bạn muốn đặt lại thành' master' và để lại các tệp bạn muốn bị ảnh hưởng. Di chuyển trở lại HEAD thành 'B2' sẽ cho phép bạn cam kết nội dung" tệp khác "(hiện đang phản ánh' chính ') – VonC

Các vấn đề liên quan