Quay lại kho lưu trữ Git từ xa


111

Tôi có một kho lưu trữ Git từ xa và tôi cần lùi những ncam kết cuối cùng vào quên lãng.

Câu trả lời:


135

Bạn có thể sử dụng git revert <commit>…cho tất cả n lần cam kết, sau đó đẩy như bình thường, giữ nguyên lịch sử.

Hoặc bạn có thể "quay trở lại" với git reset --hard HEAD~n. Nếu bạn đang đẩy vào một kho lưu trữ công khai hoặc chia sẻ, bạn có thể phân tách và phá vỡ những công việc khác dựa trên nhánh ban đầu của bạn. Git sẽ ngăn bạn làm như vậy, nhưng bạn có thể sử dụng git push -fđể buộc cập nhật.


5
Bạn có thể khôi phục về một cam kết cụ thể bằng cách sử dụng: git reset --hard [sha1]trong đó sha1 là định danh băm cam kết.
pisaruk

7
Bạn không thể sử dụng get reset --hard trong kho lưu trữ từ xa vì không có thư mục làm việc. Câu hỏi ban đầu chỉ nói rằng có một repo từ xa, không có đề cập đến một repo cục bộ.
Hazok

2
chỉ cần một lưu ý, git push -f sẽ buộc đẩy tất cả các chi nhánh địa phương về điều khiển từ xa của họ
cowlinator

Xin lưu ý rằng việc sử dụng revertsẽ khiến các nhánh tính năng của bạn được coi là "đã" hợp nhất. Đó là bởi vì các nhánh này thực sự đang được hợp nhất. Nhưng các thay đổi đã được hoàn nguyên. Giải pháp: Cherry-pick hoặc hoàn nguyên cam kết hoàn nguyên .
Benedikt

@Benedikt có phải reset --hardcũng khiến các nhánh tính năng được coi là đã được hợp nhất không? Giả định của tôi là nó sẽ không (nếu revertcó).
Marcus Leon

37

elmarco đúng ... đề xuất của anh ấy là tốt nhất cho kho lưu trữ chia sẻ / công khai (hoặc, ít nhất là các chi nhánh công khai). Nếu nó không được chia sẻ (hoặc bạn sẵn sàng làm phiền người khác), bạn cũng có thể đẩy một số giới thiệu cụ thể:

git push origin old_master:master

Hoặc, nếu có một cam kết SHA1 cụ thể (giả sử 1e4f99e ở dạng viết tắt), bạn muốn quay lại:

git push origin 1e4f99e:master

9

May mắn thay, tôi đã có thể sử dụng giải pháp của Pat Notz để loại bỏ hoàn toàn cam kết không mong muốn. Tuy nhiên, ban đầu tôi gặp lỗi

error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*

Nhưng thêm -ftùy chọn force ( ) sẽ ghi đè lên lỗi này

git push -f origin 52e36b294e:master

3

Nếu bạn có quyền truy cập trực tiếp vào repo từ xa, bạn luôn có thể sử dụng:

git reset --soft <sha1>

Điều này hoạt động vì không có nỗ lực sửa đổi thư mục làm việc không tồn tại. Để biết thêm chi tiết, vui lòng xem câu trả lời gốc:

Làm cách nào để bỏ ghi chú lần cuối cùng trong kho lưu trữ git bare?


2
Tại sao --softthậm chí sẽ cần thiết? Bạn có thể làm điều tương tự chỉ với đơn giản git reset, không có cờ chế độ.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.