2015-05-20 18 views
5

Tôi sẽ cố gắng hết sức để mô tả ngắn gọn tình hình hiện tại của mình và sẽ biết ơn nhất đối với một số lời khuyên.Làm cách nào để tôi có thể hợp nhất các cam kết đã được hoàn nguyên trong github?

Tôi đã hợp nhất trong một chi nhánh tính năng lớn của mã sáng nay hóa ra có lỗi nghiêm trọng. Để hoàn tác nó, đồng nghiệp của tôi đã hoàn nguyên việc hợp nhất (trong đó có một số cam kết) trong GitHub và sau khi kéo, tất cả dường như là tốt.

Sau khi thực hiện một số chỉnh sửa đối với nhánh tính năng, tôi muốn đảm bảo rằng nó có thể hoạt động trở lại, vì vậy tôi đã sử dụng 'git merge master' trên nhánh tính năng của mình (như tôi luôn làm) để đảm bảo mọi thứ được cập nhật .

Đáng ngạc nhiên, kết quả của việc đó là xóa tất cả mã mới mà tôi cần phải hợp nhất trở lại vào kho lưu trữ chính!

Điều này có phải do sự hoàn nguyên xảy ra trên chi nhánh không? Nhìn qua nhật ký git, tôi có thể thấy rằng tất cả các cam kết vẫn còn đó. Và thậm chí kỳ lạ hơn, yêu cầu kéo trong github không hiển thị bất kỳ cam kết ban đầu nào trong diff, chỉ những gì tôi đã thay đổi kể từ khi hoàn nguyên.

Ai đó có thể giúp tôi hiểu được điều này không?

Tôi biết một số người đã đề xuất chỉ cần hoàn nguyên việc hoàn nguyên, nhưng tôi cần phải quay trở lại trong sạch, vì những thay đổi mà tôi đã thực hiện đối với cấu trúc của nhiều mã.

+1

chào bạn. thử 'git reflog' trong bảng điều khiển của bạn. nó sẽ cho bạn thấy lịch sử đầy đủ của những gì đã được thực hiện để repo của bạn (không chi nhánh nhưng repo đầy đủ) .checkout các điểm mong muốn trong thời gian và tiếp tục từ đó. – CodeWizard

+0

Cảm ơn bạn đã bình luận! Trong trường hợp của tôi, các cam kết được xen kẽ trong suốt. Chi nhánh đã được thực hiện trong vài tháng, và không có một chỗ sạch cho tôi để thiết lập lại.Tôi nghĩ rằng rebase là những gì tôi cần, chỉ cần cố gắng tìm ra cách loại bỏ hoàn toàn các cam kết mà tôi đang thêm vào từ chi nhánh tính năng – Lizza

+1

Ok, bị post nó là câu trả lời - rebase bạn cần – CodeWizard

Trả lời

6

Tôi chạy vào vấn đề này rất giống nhau Một lần. Giải pháp của tôi đã làm việc là "hoàn nguyên sự hoàn nguyên" trước khi sáp nhập chủ vào nhánh của tôi.

Điều làm được là để lại cho bạn tất cả các thay đổi của bạn, bao gồm cả các bản sửa lỗi mới mà bạn đã có.

git checkout master 
git checkout -b master-with-revert-revered 
git revert <revert commit id> 
git checkout fixed-branch 
git merge master-with-revert-revered 

Sau đó, nhánh cố định của bạn phải được kết hợp trực tiếp lại vào chính mà không gặp vấn đề gì.

+0

Tôi đánh giá cao sự thấu hiểu, Daniel. Tôi đã thử một số lựa chọn khác nhau cho đến bây giờ, và do sự phức tạp của những cam kết và số lượng tuyệt đối của họ, tôi nghĩ rằng hoàn nguyên việc hoàn nguyên sẽ là đặt cược an toàn nhất của tôi. – Lizza

1

Tôi nghĩ rebase đó là những gì tôi cần, chỉ cần cố gắng tìm hiểu làm thế nào để loại bỏ hoàn toàn các cam kết tôi thêm vào một lần nữa từ tính năng chi nhánh

nếu bạn cần phải "remoe/hợp nhất" cam kết bạn nên sử dụng squash.
Squash là một trong các tùy chọn rebase.

Để sử dụng, bạn cần phải thực hiện rebase tương tác.
git rebase -i HEAD~10 sẽ mở một vi (hoặc bất kỳ trình soạn thảo nào khác mà bạn đang sử dụng) và sẽ cho phép bạn "cải tổ" các cam kết của bạn. Bạn có thể xóa cam kết, hợp nhất chúng vào một đơn lẻ, sắp xếp lại chúng và thêm nhiều thứ khác.

Bạn sẽ tìm thấy một danh sách các tùy chọn bên trong vi cùng với danh sách của các cam kết mà bạn chọn để reabse (Trong ví dụ trên nó sẽ đưa người cuối cùng 10 HEAD~10)

+0

Cảm ơn câu trả lời của bạn! Vì vậy, trong trường hợp của tôi, bởi vì hoàn nguyên đã không thực sự loại bỏ các cam kết, tôi có muốn xóa tất cả chúng khỏi chi nhánh? Có vẻ như lệnh đó là dd. Và nó cũng giống như cam kết đầu tiên tôi cần phải loại bỏ là hơn 100 cam kết trước, vì vậy HEAD ~ 100? – Lizza

+0

Chính xác. bạn đã nhận nó :-) – CodeWizard

+0

Hoặc bạn có thể quay trở lại điểm mong muốn trong thời gian, tạo chi nhánh mới từ điểm đó và sau đó tương tác rebase mẫu này điểm – CodeWizard

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