Làm cách nào tôi có thể khôi phục kho lưu trữ github cho một cam kết cụ thể?


431

Github của tôi có 100 cam kết ngay bây giờ. Tôi cần khôi phục kho lưu trữ để cam kết 80 và xóa tất cả các kho tiếp theo.

Tại sao? Repo này được cho là để hợp nhất từ ​​người dùng linh tinh. Một loạt các sự hợp nhất đã diễn ra như cam kết từ tôi, do chỉnh sửa quá mức. Đó là do việc dán nhãn sai cho các chi nhánh từ xa của tôi, nơi 3 nhà phát triển được gắn nhãn là nhau. Tôi cần phải thiết lập lại điểm đó, và sau đó kéo về phía trước.

Tôi muốn rebase, như trong ví dụ này: Làm cách nào tôi có thể xóa một cam kết trên GitHub?

Tuy nhiên, git muốn tôi thực hiện nhiều quản lý xung đột. đó có phải là cách dễ hơn?

Câu trả lời:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Lưu ý: Như được viết trong các bình luận bên dưới, Sử dụng điều này rất nguy hiểm trong môi trường hợp tác: bạn đang viết lại lịch sử


43
người, làm git push -f origin branch. Tôi vừa có một thời gian tồi tệ, vì tôi đã bỏ lỡ điều đó.
Sumit M Asok

21
HÃY THỬ bạn sẽ mất tất cả các cam kết của mình tại địa phương và nếu bạn đẩy sẽ không có đường quay lại
Thomas

8
Điều đó không đúng, bạn có thể nhận được các cam kết cũ bằng cách sử dụng git reflog
Jan Schaefer

27
bạn có thể cần phải làm git push origin HEAD --forcethay vì git push -f origin branchđiều đó đã gây ra error: src refspec branch does not match any.lỗi cho tôi
sprocket12

1
Đúng, cảm ơn các bạn. Tôi quản lý để làm những gì tôi muốn. Lần đầu tiên tôi tạo một nhánh riêng biệt từ nhánh trước của cam kết mà tôi muốn quay lại. Nhân bản nó tại địa phương. Sau đó, áp dụng các đề xuất của bạn trên bản sao đó, bằng cách này, tôi đã không thỏa hiệp với chi nhánh chính của mình ...
Gauthier Boaglio

21

Để hoàn tác cam kết gần đây nhất tôi làm điều này:

Đầu tiên:

git log

lấy id SHA mới nhất để hoàn tác.

git revert SHA

Điều đó sẽ tạo ra một cam kết mới trái ngược hoàn toàn với cam kết của bạn. Sau đó, bạn có thể đẩy cam kết mới này để đưa ứng dụng của bạn về trạng thái trước đó và lịch sử git của bạn sẽ hiển thị những thay đổi tương ứng.

Điều này tốt cho việc làm lại ngay lập tức một cái gì đó bạn vừa cam kết, mà tôi thấy thường xuyên hơn đối với tôi.

Như Mike đã nói, bạn cũng có thể làm điều này:

git revert HEAD

8
git revert HEADsẽ hoàn nguyên cam kết cuối cùng mà không cần phải tra cứu hàm băm.
Mike Baranczak

Đây là một giải pháp nếu bạn không muốn xóa các cam kết. Tuy nhiên, trong trường hợp này, tất cả các cam kết rác sẽ vẫn ở đó và cho phép một người nhân bản thiết lập lại hoặc kiểm tra chúng. Nếu bạn muốn ngăn chặn điều đó, bạn sẽ phải đẩy mạnh.
cst1992

19

Cách khác:

Kiểm tra chi nhánh bạn muốn hoàn nguyên, sau đó đặt lại bản sao làm việc cục bộ của bạn trở lại cam kết mà bạn muốn là bản mới nhất trên máy chủ từ xa (mọi thứ sau đó sẽ tạm biệt). Để thực hiện việc này, trong SourceTree, tôi đã nhấp chuột phải vào và chọn "Đặt lại BRANCHNAME cho cam kết này".

Sau đó điều hướng đến thư mục cục bộ của kho lưu trữ của bạn và chạy lệnh này:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Điều này sẽ xóa tất cả các xác nhận sau cái hiện tại trong kho lưu trữ cục bộ của bạn nhưng chỉ cho một nhánh đó.


1
FYI "REPOSITORY_NAME" sẽ giống như https: /me@github.com/me/repo_name.git
tim

3
Sẽ hữu ích hơn nếu bạn phá vỡ lệnh đó và giải thích nó.
cst1992

3

Hầu hết các đề xuất đều cho rằng bạn cần bằng cách nào đó phá hủy 20 cam kết cuối cùng, đó là lý do tại sao nó có nghĩa là "viết lại lịch sử", nhưng bạn không phải làm vậy.

Chỉ cần tạo một nhánh mới từ cam kết # 80 và làm việc trên nhánh đó trong tương lai. 20 cam kết khác sẽ ở lại trên nhánh mồ côi cũ.

Nếu bạn hoàn toàn muốn chi nhánh mới của mình có cùng tên, hãy nhớ rằng chi nhánh đó về cơ bản chỉ là nhãn. Chỉ cần đổi tên chi nhánh cũ của bạn thành một cái khác, sau đó tạo chi nhánh mới tại cam kết # 80 với tên bạn muốn.


Tôi đoán điều này cũng gây rắc rối với các phiên bản địa phương của lịch sử của nhánh quan tâm của mọi người.
ragerdl

2

Khi thực hiện cập nhật chi nhánh từ chủ, tôi nhận thấy rằng đôi khi tôi nhấp quá nhiều và cũng khiến chi nhánh hợp nhất thành chủ. Tìm thấy một cách để hoàn tác điều đó.

Nếu cam kết cuối cùng của bạn là hợp nhất, thì cần thêm một chút tình yêu:

git hoàn nguyên -m 1 TRỤ


1

Trong github, cách dễ dàng là xóa nhánh từ xa trong giao diện người dùng github, dưới tab nhánh. Bạn phải đảm bảo xóa các cài đặt sau để xóa chi nhánh:

  1. Không phải là một nhánh mặc định
  2. Không có yêu cầu thăm dò mở.
  3. Chi nhánh không được bảo vệ.

Bây giờ tạo lại nó trong kho lưu trữ cục bộ của bạn để trỏ đến điểm cam kết trước đó. và thêm nó trở lại repo từ xa.

git checkout -b master 734c2b9b   # replace with your commit point

Sau đó đẩy chi nhánh địa phương đến từ xa

git push -u origin master

Thêm lại bảo vệ chi nhánh và chi nhánh mặc định, vv

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.