Chỉ cần để là trên cùng một trang về cách rebases làm việc. Trong ví dụ của bạn, git về cơ bản là cố gắng thêm và D và E sau C từng cái một. Các rebase cam kết trên D & E sẽ không phải là bản gốc, thay vào đó chúng sẽ được nhân bản với băm mới. Bản gốc vẫn sẽ tồn tại, nhưng sẽ đơn giản là lúng túng mà không có chi nhánh nào đề cập đến chúng (bộ sưu tập rác sẽ xóa chúng cuối cùng). Sau khi rebase, bạn có thể thấy phiên bản "gốc" của các cam kết đã bị xóa bằng cách xem git log ORIG_HEAD
Tuy nhiên, ngoại lệ có thể diễn ra trong quá trình này. Git sẽ thông minh bỏ qua bất kỳ cam kết nào đã có trong "cơ sở" (chính trong trường hợp này) - điều này có thể xảy ra một chi nhánh được sáp nhập, hoàn nguyên, sau đó được sửa lại.
Nó cũng sẽ bỏ qua bất kỳ cam kết nào nếu thấy rằng các cam kết được thêm vào căn cứ khớp chính xác, trong nội dung của chúng - các cam kết đã có trong lịch sử - ngay cả khi băm khác nhau - điều này có thể xảy ra nếu một chi nhánh sáp nhập, rebase, sau đó sáp nhập lại.
Tôi nghi ngờ một trong số ít trường hợp.
- Chi nhánh tính năng của bạn có thể đã được hợp nhất thành chính.
- Chi nhánh tính năng của bạn đã khớp với chính.
1) --contains git branch tính năng
này sẽ liệt kê tất cả các chi nhánh có chứa chi nhánh tính năng của bạn trong lịch sử của họ. Nếu chủ nằm trong danh sách đó, thì nhánh của bạn đã được hợp nhất. Không có gì để làm ở đây.
Có một vài lý do khiến điều này có vẻ không đúng.
Một lý do là bạn không thể thấy các thay đổi của mình trong mã chính hiện tại. Điều này có thể là vì một vài lý do. Nếu nhánh trước đó đã được sáp nhập vào master, và sau đó được hoàn nguyên, thì các cam kết đã ở đó, nhưng bị phủ nhận - ngay cả khi đã gán lại các cam kết hoàn nguyên đó sẽ không trả lại - bạn sẽ cần phải hoàn nguyên commit thực sự.
2) tính năng kiểm tra git; git rebase --keep-empty feature
- Giữ trống sẽ buộc git giữ lại các cam kết của bạn ngay cả khi chúng không chứa bất kỳ nội dung hoặc thay đổi "mới" nào. Đây không phải là một sửa chữa hoặc workaround, nhưng nếu bạn thấy những cam kết trong lịch sử của bạn sau khi làm điều này - sau đó nó có nghĩa là cam kết của bạn sẽ không bị mất. Họ đang bị bỏ qua cố ý. Bạn có thể quyết định cho chính mình nếu bạn muốn giữ những cái trống.
Nếu đúng như vậy, tôi sẽ xem xét liệu chi nhánh này đã được hợp nhất trong quá khứ hay chưa. Nó có thể đã được sáp nhập như một phần của một nhánh khác chẳng hạn. Có lẽ Bob nghĩ anh cần công việc của bạn từ chi nhánh feature
trong chi nhánh bobs_feature
của anh ta - nhánh của anh ta làm cho nó thành thạo trước bạn và bây giờ nhánh của bạn về cơ bản là không liên quan. Một trường hợp khác có thể là nó đã được sáp nhập trong quá khứ vào master, và sau đó trở lại. Câu trả lời ở đây là hoàn nguyên chính cam kết hoàn nguyên - kiểu như đánh lại sau khi hoàn tác.
ahh, hãy thử cách này: http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html – unixmiah
Tôi biết cách tôi có thể lấy lại tệp của mình. Ngoài ra 'hợp nhất tổng thể' hoạt động là tốt. Tôi muốn tìm hiểu những gì có thể đã gây ra hành vi như vậy của lệnh rebase – jonasnas
Là những cam kết D và E bằng cách nào đó giống hệt nhau trong nội dung của họ để các cam kết của chủ? (trong trường hợp này, chúng sẽ bị bỏ qua trong quá trình rebase) – VonC