2012-01-04 30 views
230

Với thay đổi đã được cam kết sử dụng commit và sau đó được hoàn nguyên bằng cách sử dụng revert, cách tốt nhất để sau đó hoàn tác việc đó là gì?Làm cách nào để "hủy hoàn nguyên" một cam kết Git được hoàn nguyên?

Lý tưởng nhất, điều này nên được thực hiện với cam kết mới, để không viết lại lịch sử.

+53

Không hoàn nguyên công việc hoàn nguyên? – Mat

+2

Có thể trùng lặp của [Làm thế nào tôi có thể sửa chữa một cam kết git trở lại?] (Http: // stackoverflow.com/questions/5354682/how-can-i-fix-a-reverted-git-cam kết) –

Trả lời

205

Nếu bạn chưa đẩy sự thay đổi đó chưa, git reset --hard HEAD^

Nếu không, quay trở lại hoàn nguyên là hoàn toàn tốt đẹp.

Cách khác là git checkout HEAD^^ -- . và sau đó git add -A && git commit.

+0

Lưu ý rằng nếu bạn muốn hủy hoàn nguyên mà không áp dụng ngay các thay đổi ban đầu cho nhánh chính, bạn có thể (1) khôi phục lại nhánh ban đầu nếu bị xóa, (2) nhấp vào "hoàn nguyên" ** trên nhánh hoàn nguyên ** như được ghi nhận bởi Adam, sau đó (3) nhấp vào "chỉnh sửa" trong tiêu đề của kết quả PR và thay đổi nhánh mục tiêu thành nhánh gốc thay thế của chủ nhân. Bây giờ chi nhánh ban đầu của bạn có thể được sáp nhập lại để thực hiện các thay đổi được hoàn nguyên trước đó. – pauljm

+2

Cảm ơn. Tôi chỉ hoàn nguyên trở lại ban đầu và nó hoạt động tốt. – Simon

+0

Có, việc hoàn nguyên cam kết hoàn nguyên tương tự với việc khôi phục cam kết đó. Cảm ơn bạn! –

216

git cherry-pick <original commit sha>
sẽ tạo một bản sao của bản gốc cam, về cơ bản tái áp dụng cam kết

Lùi lại hoàn nguyên sẽ làm điều tương tự với Messier cam kết thông báo:
git revert <commit sha of the revert>

Một trong những cách này sẽ cho phép bạn git push mà không ghi đè lịch sử, bởi vì nó tạo ra một cam kết mới sau khi hoàn nguyên.
Khi gõ cam sha, bạn thường chỉ cần 5 hoặc 6 ký tự đầu tiên:
git cherry-pick 6bfabc

+24

Đây là giải pháp dễ dàng và thanh lịch nhất cho câu hỏi OPs. Tốt hơn nhiều so với câu trả lời được chấp nhận với các giả định của nó về cam kết hoàn nguyên đang ở HEAD của cây cam kết. Các op cũng đặc biệt yêu cầu cho một giải pháp mà không viết lại lịch sử để giải pháp cứng được cung cấp trong câu trả lời được chấp nhận chỉ đơn giản là sai. – Timo

+1

Điều này không hiệu quả đối với tôi khi tôi có cam kết hợp nhất. –

+0

Cảm ơn bạn rất nhiều. Điều này đã tiết kiệm rất nhiều căng thẳng! – SwimmingG

2

Đó là trông ngu ngốc đối với tôi. Nhưng tôi đã ở trong tình trạng tương tự và tôi đã hoàn nguyên cho các cam kết hoàn nguyên. Tôi đã làm số reverts vì vậy tôi đã phải hoàn nguyên cho mỗi 'hoàn nguyên cam kết'.

Bây giờ, lịch sử cam kết của tôi có vẻ lạ một chút.

weird history

Đây là dự án thú cưng nên không sao. Nhưng đối với dự án thực tế cuộc sống tôi sẽ ưu tiên đi đến cam kết cuối cùng trước khi hoàn nguyên khôi phục lại tất cả các mã hoàn nguyên với nhau trong một cam kết và bình luận hợp lý hơn.

+3

Bạn có thể quan tâm đến câu trả lời cho một câu hỏi khác của tôi: http://stackoverflow.com/questions/10415565/how-to-revert-multiple-commits-as-part-of-a-single-commit – JimmidyJoo

+1

Bạn có thể tránh cam kết tự động và chọn bạn cam kết thông báo bằng cách sử dụng cờ --no-commit khi hoàn nguyên và sau đó cam kết với thư có liên quan –

0

Nếu bạn không thích ý tưởng "hoàn nguyên hoàn nguyên" (đặc biệt khi điều đó có nghĩa là mất thông tin lịch sử cho nhiều cam kết), bạn luôn có thể truy cập tài liệu git về "Reverting a faulty merge".

Do tình hình bắt đầu sau

P---o---o---M---x---x---W---x 
    \  /
    A---B---C----------------D---E <-- fixed-up topic branch 

(W là Revert của bạn ban đầu của việc hợp nhất M; D và E là bản sửa lỗi cho chi nhánh tính năng ban đầu của bạn bị hỏng/cam)

Bạn bây giờ có thể chỉ đơn giản là phát lại cam kết từ A đến E, vì vậy mà không ai trong số họ là "thuộc" để việc hợp nhất hoàn nguyên:

$ git checkout E 
$ git rebase --no-ff P 

các bản sao mới của chi nhánh của bạn bây giờ có thể được sáp nhập để master ag ain:

A'---B'---C'------------D'---E' <-- recreated topic branch 
/
P---o---o---M---x---x---W---x 
    \  /
    A---B---C----------------D---E 
Các vấn đề liên quan