2008-10-20 34 views
25

tôi đã cam kết, và đẩy, một số bản vá lỗi: A1 -> A2 -> A3 -> A4 (HEAD)Lăn trở lại trong Git

Mọi người kéo những changesets vào bản sao cục bộ của họ.

Bây giờ, chúng tôi muốn "quay lại" thành A2 và tiếp tục phát triển từ đó - về cơ bản sẽ loại bỏ A3 và A4. Cách tốt nhất để làm điều này là gì?

Trả lời

5

Bạn muốn git-revert git-reset tùy thuộc vào cách bạn muốn xử lý A3 và A4. Để xóa tất cả dấu vết của A3 và A4, hãy sử dụng git-reset --hard. Để giữ A3 và A4 và ghi lại sự thật bạn đang hoàn nguyên, hãy sử dụng git-revert.

chỉnh sửa: giải pháp git-checkout Aristotle Pagaltzis là cấp trên, dù cho trở lại trạng nhỏ tôi không thấy một vấn đề với git-revert. Không ít hơn, tôi yêu cầu những người trả lời trong tương lai được trao cho Aristotle Pagaltzis's answer

Tôi đã tìm thấy git magic là một tài nguyên tốt cho git.

+0

Áp phích gốc gần như chắc chắn muốn hoàn nguyên không được đặt lại. Vì tất cả mọi người đã kéo A3 và A4 vào kho lưu trữ địa phương của riêng họ, tôi nghĩ việc cài đặt lại sẽ làm mọi thứ lộn xộn. –

+0

git-revert sẽ chỉ hoàn nguyên một lần commit và git-reset là điều không đúng đối với các thay đổi được xuất bản. Câu trả lời đúng là git-checkout. –

+0

Aristotle Pagaltzis: bạn là chính xác, tôi đã đánh nó từ câu trả lời của tôi. – freespace

7

Vứt bỏ những cam kết đó có thể sẽ có một số tác động tiêu cực đối với bất kỳ ai đang kéo từ kho lưu trữ của bạn. Như một tùy chọn, bạn có thể muốn xem xét việc tạo ra một chi nhánh phát triển thay thế bắt đầu từ A2:

 
A1-->A2-->A3-->A4 (master/HEAD) 
     \ 
     -->B1-->B2 (new-master/HEAD) 

Việc làm này cũng đơn giản như

 
git branch new-master master~2 
45

Từ thư mục gốc của bản sao làm việc của bạn chỉ làm

git checkout A2 -- . 
git commit -m 'going back to A2' 

Sử dụng git revert cho mục đích này sẽ là cồng kềnh, vì bạn muốn loại bỏ toàn bộ một loạt các cam kết và revert hoàn tác chúng từng lần một.

Bạn cũng không muốn git reset. Điều đó sẽ chỉ thay đổi con trỏ chi nhánh master của bạn: bạn bị bỏ lại không có bản ghi về hướng bị nhầm lẫn. Nó cũng là một nỗi đau để phối hợp: vì cam kết bạn đã thay đổi master thành không phải là con của con trỏ nhánh của một kho lưu trữ từ xa là master, sẽ không thành công - trừ khi bạn thêm -f (bắt buộc) hoặc xóa chi tiết master trong kho lưu trữ từ xa trước và tạo lại bằng cách đẩy. Nhưng sau đó tất cả những người cố gắng để kéo sẽ vẫn có lịch sử cũ trong chi nhánh địa phương của họ master, do đó, một khi origin/master phân kỳ, git pull sẽ cố gắng thực hiện hợp nhất. Đây không phải là kết thúc của thế giới: họ có thể thoát ra khỏi tình huống này bằng cách thực hiện git rebase --onto origin/master $old_origin_master_commit master (tức là rebase cam kết địa phương của họ được thực hiện trên đầu trang của origin/master cũ lên trên cùng của origin/master mới). Nhưng Git sẽ không biết làm điều này tự động vì vậy bạn phải phối hợp với mọi cộng tác viên. Tóm lại, đừng làm thế.

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