2014-11-25 24 views
9
A-B-C Master 
\D-E Feature 

Sau khi thực hiện một lệnh rebasegit checkout feature ->git rebase master tất cả các cam kết của tôi từ feature chi nhánh biến mất vì vậy tôi có A-B-C cam kết. Chi nhánh feature trông giống như master sau khi rebasing. Ngoài ra rebasing không đưa ra bất kỳ lỗi nào nhưng nó không hiển thị thông báo 'commit được replayed' mà tôi nghĩ nó thường hiển thị trong quá trình rebasing. Bạn có biết những gì có thể đã gây ra hành vi này?cam kết mất tích sau khi git rebase

Khi tôi nhận thấy các cam kết của mình biến mất, tôi chạy lệnh sau để tìm mã bị thiếu trong lịch sử git: git rev-list --all | xargs git grep expression Lệnh này trả về băm cam kết nhưng băm này không xuất hiện khi tôi chạy git log (vì rebase). Nếu tôi làm git reset --hard missing-hash Tôi có thể xem lại mã gốc (đúng) feature. Chạy rebase master tái tạo lại cùng một vấn đề.

EDIT: Tôi vừa mới nhận thấy tôi có một số cam kết mở rộng giống như WIP on commit-messageindex on commit-message khi tôi làm git reset --hard missing-hash Nó có thể được liên quan với git stash/git stash apply

+1

ahh, hãy thử cách này: http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html – unixmiah

+0

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

+0

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

Trả lời

5

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.

  1. Chi nhánh tính năng của bạn có thể đã được hợp nhất thành chính.
  2. 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.

+0

Cảm ơn bạn đã giải thích lý do có thể.Các công việc tôi làm là tạo chi nhánh tính năng từ chủ cho mỗi vé jira. Sau đó tính năng rebase thường xuyên khi vé khác (của riêng tôi hoặc những người khác) đã được hợp nhất vào master.If tôi có một số thay đổi liên tục tôi làm git stash-> rebase master-> git stash apply.Im khá chắc chắn tôi đã smth mà không phải là những gì tôi nghĩ rằng tôi đã làm.Maybe áp dụng stash trên chi nhánh sai hoặc smth khác (Nếu tôi mới tôi sẽ không yêu cầu). đã viết điều này có vẻ khá có khả năng: 'Nếu chi nhánh trước đó đã được sáp nhập vào master và sau đó trở lại sau đó các cam kết đã có nhưng phủ nhận' – jonasnas

+0

Và trên tính năng này tôi đã làm một số 'rebases' từ chủ chắc chắn. – jonasnas

+0

Tôi sẽ cố gắng để đi qua lịch sử git/reflogs để kiểm tra xem tôi có thể tìm ra nếu smth bạn đã đề cập xảy ra. Nhưng nó chứa quá nhiều nhánh và cam kết nên nó khá khó khăn/tốn thời gian. Ít nhất bây giờ tôi có một đầu mối những gì có thể đã xảy ra thay vì bị mất thời gian tiếp theo tôi thấy rằng (Nó đã xảy ra không phải lần đầu tiên với tôi) – jonasnas

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