2012-05-02 28 views
41

Đây không phải là vấn đề lớn, chỉ là điều tôi muốn biết có thể thực hiện được hay không.Cách hoàn nguyên nhiều cam kết như là một phần của một cam kết đơn

Hãy nói rằng chúng ta có hai cam kết, abcd123wxyz789, xảy ra tại không liền kề, vị trí riêng, xa trở lại trong lịch sử của một repo. Bây giờ chúng ta hãy nói rằng chúng tôi muốn hoàn nguyên chúng. Làm

git revert abcd123 wxyz789 

sẽ cho kết quả trong hai cam kết riêng biệt, một quay trở abcd123 và người kia quay trở lại wxyz789.

Điều này là tốt và tốt, nhưng nếu những sai lầm chúng tôi muốn sửa trong hai cam kết được liên kết hợp lý và cho mục đích tự tài liệu, chúng tôi muốn thực hiện một cam kết duy nhất có chứa một "" Tôi đã phá vỡ một cái gì đó vì vậy bây giờ tôi hoàn nguyên các tập tin x, y và z "bình luận? Có lệnh git thực hiện điều này không?

(. Tôi dĩ nhiên biết rằng nó có thể tạo ra một cam kết mà tôi chỉ tự sửa chữa tất cả những thay đổi và sau đó đẩy Đây là đau đớn cho tất cả những lý do obbious.)

+0

có thể trùng lặp của [Hoàn nguyên nhiều commit git] (http://stackoverflow.com/questions/1463340/revert-multiple-git-commits) –

+0

Tôi đã thấy chuỗi đó. Sự khác biệt giữa nó và cái này, là Bill đang hy vọng sẽ quay lại nhiều tập tin từ HEAD. Cam kết của tôi xảy ra tại "những nơi không liền kề, riêng biệt trong lịch sử của repo". – JimmidyJoo

+1

Chưa hết, đọc lại câu trả lời đã chọn mang lại cho tôi những gì tôi muốn. Cờ --no-cam là những gì tôi cần. Vậy ... Làm thế nào để tôi đề cử câu hỏi của mình bị xóa khỏi sự tồn tại ?! – JimmidyJoo

Trả lời

52

Bạn có thể làm:

git revert abcd123 
git revert --no-commit wxyz789 
git commit --amend 

... và sau đó viết thông báo cam kết thích hợp mô tả hiệu ứng kết hợp của việc hoàn nguyên cả hai cam kết.

+0

Điều này có hoạt động với hơn 2 cam kết không? –

+0

@ AntonI.Sipos vâng, bao nhiêu tùy thích. – Trufa

+17

Ngắn gọn hơn: 'git hoàn nguyên abcd123 wxyz789 --không cam kết ' ' git commit' – rmp251

29

Trong trường hợp trở lại phức tạp, thay đổi lẫn nhau, revert --no-commit có thể có vấn đề.

giải pháp đơn giản của tôi là làm Revert sản, và các bí:

git revert <all commits> 
git rebase -i 

Và sau đó đánh dấu tất cả được khôi phục như squash, ngoại trừ cái đầu tiên, để tạo ra một cam kết duy nhất.

+0

Tôi thích giải pháp này rất nhiều! – monokrome

+1

+1. Đối với người học git: 1. đọc một chút về những gì cam kết là, 2. trở thành thạo với rebase tương tác: squashing, loại bỏ, chỉnh sửa, rebasing, tái đặt hàng cam kết. Một khi bạn làm cho tâm trí của bạn quen thuộc với nó (gợi ý: nó chỉ là thời gian đi du lịch), giải pháp này trở nên cách tự nhiên hơn so với chuyển đổi xung quanh với các công cụ như '--no-cam kết'. (Và đừng sợ quy tắc "không rebase được xuất bản" - miễn là bạn làm điều đó trên chi nhánh địa phương hoặc tư nhân của bạn, bạn có thể làm * mọi thứ *.) –

+1

** Mẹo bổ sung: ** Đầu tiên có thể được thay đổi từ 'pick' thành' reword' (để nhập một thông điệp cam kết mới) hoặc 'edit' (để dàn dựng các thay đổi mà không cam kết). Đối với các reverts khác, bạn có thể sử dụng 'fixup' thay cho' squash' nếu bạn không quan tâm đến các thông điệp cam kết. – ADTC

18
git revert -n <commits> 
git commit 

Lệnh đầu tiên sẽ thực hiện tất cả các lần hoàn nguyên mà không tạo bất kỳ cam kết và giai đoạn kết quả cuối cùng (tùy chọn -n). Sau đó, lệnh commit sẽ tạo một commit duy nhất.

+1

Hoàn hảo. Tính gọn gàng. Và nó cho phép bạn thêm thông điệp cam kết của bạn sau khi tất cả các reverts thay vì quay trở lại để sửa đổi một cam kết mà câu trả lời khác đề nghị. –

+0

Ngoại trừ việc nó không hoạt động. Tôi cần phải quay trở lại 5 cam kết cuối cùng, trong đó có 3 sự kết hợp Git tuyệt vời xảy ra bất cứ khi nào bạn kéo một người nào đó thay đổi. Vì vậy, lỗi này với 'cam kết <###> là một hợp nhất nhưng không có tùy chọn -m cho'. Mỗi hợp nhất có hai cha mẹ, dường như tôi phải xác định cha mẹ của mỗi hợp nhất mà tôi cần phải giữ. Làm thế nào địa ngục tôi thậm chí làm việc đó ra cho phép một mình làm thế nào tôi xác định rằng để lệnh trở lại tôi không có ý tưởng. – Neutrino

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