Đ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-patch
và git 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?
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
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? –
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