2015-09-20 15 views
5

Tôi đã làm việc trong hai tuần qua về một tính năng và tôi đã tạo ra một chi nhánh riêng cho nó. Vấn đề là nhiệm vụ đã khiến tôi mất một thời gian dài, và tôi đã không tái khởi động nhánh của mình để làm chủ định kỳ. Tôi đã kết thúc với hơn 100 cam kết và bây giờ khi tôi đang cố gắng để rebase chi nhánh để làm chủ bằng cách sử dụng git rebase master, nó được dùng mãi mãi, như tôi cần phải kiểm tra xung đột cho mỗi cam kết, sửa đổi nó, git add và sau đó git rebase --continue.Có cách nào nhanh chóng để rebase một lịch sử lâu dài của cam kết để làm chủ chi nhánh?

Có cách nào dễ hơn để làm điều đó không?

+0

Không thực sự, không ... không trừ khi bạn không phản đối việc hợp nhất trực tiếp để thực hiện tất cả trong một lần. – Makoto

+0

Tôi không muốn hợp nhất và tôi muốn sử dụng rebase để tôi có thể viết lại lịch sử cam kết. Aw là có bất kỳ workaround ngay cả khi đó có nghĩa là để mất lịch sử cam kết của tôi cho rằng chi nhánh? Tôi chỉ muốn chắc chắn rằng mã mới nhất cho nhánh đó được rebased thành master? –

+0

Sau đó, bạn sẽ phải đối phó với mỗi xung đột hợp nhất khi bạn rebase. Bạn thực sự muốn * không * mất công việc bạn đã làm. – Makoto

Trả lời

4

Điều này phụ thuộc một phần vào cách bạn đã thực hiện hơn 100 cam kết và những gì đang diễn ra trong thời gian chờ đợi. Bốn chiến lược có thể có ích:

Giảm số lượng các cam kết để rebase

Nếu bạn có một dòng suối rõ ràng xinh đẹp của 100 cam kết không bao giờ thay đổi mã cùng hai lần, tôi xin lỗi, nhưng bạn đang bị mắc kẹt.

Tuy nhiên, từ 100 cam kết trong hai tuần, tôi đoán lịch sử cam kết của bạn không thích điều đó. Có lẽ bạn đã sửa đổi hàm X 5 lần trong lịch sử cam kết, và mỗi một trong những cam kết đó sẽ gây ra xung đột. Nếu chỉ có một cam kết duy nhất có chức năng sửa đổi X, bạn sẽ có 20% công việc cần làm.

Vì vậy, câu trả lời ở đây là để dọn dẹp lịch sử cam kết của bạn trước khi bạn rebase lên master. Đây là một cách sử dụng khác cho 'git rebase'. Hãy khôi phục nó trên cơ sở hiện tại của chúng tôi, nhưng sử dụng git rebase -i để tương tác với nhau và sắp xếp lại các cam kết. Hãy chắc chắn rằng bạn có số lượng cam kết tối thiểu và mỗi cam kết thực hiện điều gì đó độc lập. Bạn cũng có thể thay đổi nhật ký cam kết của mình. Các chi nhánh dự phòng chính (git branch) và git diff cho các chi nhánh sau mỗi lần cam kết kiểm tra bạn đã không thay đổi bất kỳ thứ gì.

Cụ thể, nếu bạn có các cam kết hợp nhất nội bộ, làm phẳng chúng sẽ hữu ích.

Chắc chắn khi tôi làm điều này tôi tìm thấy những thứ tôi đã làm sai, hoặc có thể làm tốt hơn, ngay cả khi đó là 'chỉ' mã định dạng hoặc cam kết tin nhắn. Bạn có thể tận dụng cơ hội này để sửa lỗi này. Tôi đoán bạn nên giảm xuống còn 10 hoặc 20 cam kết khi điều này được thực hiện - dễ quản lý hơn nhiều.

Rebase ở các giai đoạn

Nếu bạn đã làm điều đó, bạn có thể sẽ phải cắn viên đạn. Tuy nhiên, nếu một đồng nghiệp đã được refactoring trong khi bạn đã làm việc, đôi khi những gì bạn đang làm tốt nhất là như sau. Hãy tưởng tượng cây trông giống như thế này:

A --- B --- C --- D --- E --- F -- .... -- X --- Y --- Z (master) 
    \ 
     \----- 1 --- 2 --- 3 --- 4 .... 97 --- 98 --- 99 --- 100 (you) 

Điều bạn muốn làm cuối cùng là rebase lên Z. Tuy nhiên, điều này cho bạn vô số xung đột. Giả sử cam kết D và E là hai megacommits từ một đồng nghiệp tái cấu trúc một cái gì đó mà mã của bạn đang xử lý.Đôi khi, nó dễ dàng hơn để:

  • rebase vào C (điều này không nên được nhiều công việc)
  • Hãy hít thở sâu và rebase vào E
  • rebase lên thạc sĩ (điều này không nên được nhiều công việc)

Tránh sự phức tạp ở phía bên 'thầy'

Đôi khi mọi thứ đã bị thực sự phức tạp trên cây bạn đang cố gắng nhập vào. Một trường hợp cổ điển là (sử dụng sơ đồ trên), commit G chuyển đổi commit C, sau đó cam kết H redoes (hoặc gần như redoes), và trong thời gian trung bình có sự hợp nhất (đặc biệt là những thứ bạn có thể đã hợp nhất) . Cảm ơn đồng nghiệp, điều đó đã làm cho việc rebasing thực sự đơn giản. Những thứ khác gây khó khăn là các cam kết hợp nhất phức tạp và đổi tên khó chịu. Mỗi cam kết có xu hướng cung cấp cho bạn những xung đột tương tự một lần nữa và một lần nữa không có lý do rõ ràng. git rebase Aarrggh.

Một kỹ thuật ở đây là làm phẳng một bản sao của cây chính, tức là nhánh chính (cục bộ), sau đó rebase nó đè bẹp toàn bộ điều vào một cam kết từ A đến Z. Bạn có thể làm phẳng công cụ của bạn một chút đầu tiên (xem ở trên). Sau đó, rebase lên các bậc thầy phẳng. Bây giờ bạn đã có một tập hợp các cam kết 'đúng', bạn có thể dễ dàng rebase nó thành master (tốt, vào 'Z' là master có thể thay đổi) bởi vì mã này giống hệt nhau.

Nếu vẫn thất bại

Đôi khi git rebase dường như đi vào một trạng thái fugue của xung đột, và đó là thời gian để thoát ra khỏi git format-patchgit am nộp đơn xin lại nó trong toàn bộ hoặc một bit. Điều này thực sự hữu ích nếu ai đó đã đổi tên một tệp (vì bạn có thể sửa tên tệp trong bản vá trong trình chỉnh sửa của mình) hoặc đổi tên một lớp/biến chung/bất kỳ (như bạn có thể tìm/thay thế trong bản vá).

Tìm hiểu từ những sai lầm của bạn

Lần tiếp theo, hãy trở lại làm chủ thường xuyên hơn. Nó ít đau đớn hơn nếu bạn làm điều đó khi bạn đi cùng.

Ngoài ra, nếu bạn có hai người làm việc trên cùng một khu vực mã và nó tạo ra một đống xung đột, có lẽ mã của bạn không được tóm tắt đủ hoặc có thể bạn đang làm việc với nhau và có thể chia công việc của bạn tốt hơn?

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