Làm thế nào để hoàn tác một git kéo?


238

Tôi muốn hoàn tác git của mình về tài khoản của các cam kết không mong muốn trên nguồn gốc từ xa, nhưng tôi không biết tôi phải sửa lại bản sửa đổi nào.

Làm thế nào tôi có thể quay trở lại trạng thái trước khi tôi thực hiện thao tác git trên nguồn gốc từ xa?


4
Lưu ý bên lề: trước tiên bạn có thể thấy nó hữu ích git fetch upstream, sau đó hãy xem nhanh git diff upstream/branchđể xem những gì bạn sẽ hợp nhất. Nếu tất cả đều ổn, hãy tiếp tục vớigit merge upstream/branch
Shahbaz

1
Bạn sẽ mất tất cả tín dụng đường phố của mình và được trả tiền một tuần nếu bất kỳ người lập trình hipster nào thấy bạn thực hiện các lệnh git từ GUI, nhưng cả GitHub DesktopAtom đều có các nút an toàn, đơn giản để undocam kết và kiểm tra các tệp dễ dàng và rõ ràng. GUI cũng là người!
Dem Pilafian

Câu trả lời:


391

Hoặc để làm cho nó rõ ràng hơn câu trả lời khác:

git pull 

Rất tiếc?

git reset --keep HEAD@{1}

Phiên bản của git cũ hơn 1.7.1 không có --keep. Nếu bạn sử dụng phiên bản như vậy, bạn có thể sử dụng --hard- nhưng đó là một hoạt động nguy hiểm vì nó mất bất kỳ thay đổi cục bộ nào.


Để người bình luận

ORIG_HEAD là trạng thái TRƯỚC trước đó, được đặt bởi các lệnh có hành vi nguy hiểm có thể, để dễ dàng hoàn nguyên chúng. Bây giờ nó ít hữu ích hơn khi Git đã reflog: HEAD @ {1} gần tương đương với ORIG_HEAD (HEAD @ {1} luôn là giá trị cuối cùng của HEAD, ORIG_HEAD là giá trị cuối cùng của HEAD trước khi hoạt động nguy hiểm)


2
sự khác biệt giữa HEAD @ {1} và HEAD ^ là gì?
hugemeow

7
@hugemeow Đó sẽ là một câu hỏi SO tốt. Trong khi đó man git-rev-parsemô tả điều này. HEAD@{1}là giá trị trước đây của biểu tượng HEADtrong reflogkhi đó HEAD^bản sửa đổi gốc (đầu tiên) của dòng điện HEAD. Hai nhu cầu này là tương đương (ví dụ sau khi rebase, thiết lập lại cứng, chuyển đổi chi nhánh và những thứ như vậy). Đừng đọc bài viết liên kết để reflog. Chúc mừng
sehe

10
Người dùng PowerShell, thoát khỏi dấu ngoặc với một backtick:git reset HEAD@`{1`}
Robert Claypool

3
ss64.com/ps/syntax-esc.html Tôi nghĩ rằng bạn đã muốn nhập HEAD@`{1`}hoặc vì vấn đề đó, hãy làm những gì trên shell POSIX:'HEAD@{1}'
sehe

2
Tôi nghĩ rằng nó không chỉ thiết lập lại lực kéo mà còn cả các cam kết của tôi = (
falsarella

67

git reflog showsẽ cho bạn thấy lịch sử của ĐẦU. Bạn có thể sử dụng nó để tìm ra nơi bạn đã ở trước pull. Sau đó, bạn có thể cam kết resetcủa bạn HEAD.


git reflog show đã cho kết quả đầu ra này @ {1}
Kartins

Câu trả lời khác của sehe có chi tiết về cách đến đó.
Noufal Ibrahim

Điều này là siêu hữu ích sau khi một cam kết tai hại bằng cách nào đó xen kẽ các cam kết vào lịch sử của tôi. Đưa họ ra ngoài bằng cách tìm kiếm một hàng hóa nổi tiếng cuối cùng trong reflog và sau đó buộc đẩy.
Domenic

Điều gì xảy ra nếu pulllà hành động đầu tiên? Nếu pulllà tại HEAD@{1}, và không có gì khác trước đó, làm thế nào để bạn trở lại trạng thái trước đó?
Hendra Uzia

Tái tạo kho lưu trữ?
Noufal Ibrahim 17/07/13

29

Điều này làm việc cho tôi.

git reset --hard ORIG_HEAD 

Hoàn tác hợp nhất hoặc kéo:

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)

Kiểm tra cái này: ĐẦU và ORIG_HEAD trong Git để biết thêm.


17

Tìm các <SHA#>cam kết bạn muốn đi. Bạn có thể tìm thấy nó trong github hoặc bằng cách gõ git loghoặc git reflog showtại dòng lệnh và sau đó làm git reset --hard <SHA#>


Tìm những gì cho các cam kết?
Martin

Xin lỗi, tôi đã sửa nó<SHA#>
Nina

Đây là lệnh tôi sử dụng nhiều nhất khi tôi phải hoàn tác một cái gì đó
Kartins

2

Từ https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadundredworktree

Hoàn tác hợp nhất hoặc kéo vào bên trong cây làm việc bẩn

$ git pull           (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol               |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)

Ngay cả khi bạn có thể có các sửa đổi cục bộ trong cây làm việc của mình, bạn có thể nói một cách an toàn git pullkhi bạn biết rằng sự thay đổi trong nhánh khác không trùng lặp với chúng.

Sau khi kiểm tra kết quả của việc hợp nhất, bạn có thể thấy rằng sự thay đổi trong nhánh khác là không thỏa đáng. Chạy git reset --hard ORIG_HEAD sẽ cho phép bạn quay trở lại nơi bạn đã ở, nhưng nó sẽ loại bỏ những thay đổi cục bộ của bạn, điều mà bạn không muốn. git reset --mergegiữ những thay đổi cục bộ của bạn.

Xem thêm https://stackoverflow.com/a/30345382/621690


Cảm ơn! Bạn đã cứu ngày của tôi
Thiago Martins
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.