Hoàn tác git pull, làm thế nào để đưa repos về trạng thái cũ


1006

Có cách nào để hoàn nguyên hoặc hoàn tác git pull để nguồn / repos của tôi sẽ trở về trạng thái cũ trước khi thực hiện git pull không? Tôi muốn làm điều này bởi vì nó hợp nhất một số tệp mà tôi không muốn làm như vậy, nhưng chỉ hợp nhất các tệp còn lại. Vì vậy, tôi muốn lấy lại những tập tin đó, điều đó có thể không?

EDIT: Tôi muốn hoàn tác hợp nhất git để làm rõ. Sau khi thấy một số câu trả lời, tôi đã làm điều này

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

Bây giờ, tôi nên làm gì? Làm git reset --hard được không? Tôi không muốn vặn nó một lần nữa, vì vậy yêu cầu các bước chi tiết?


23
Có vẻ như bạn chỉ có hai điều trong lịch sử của mình: bản sao và tìm nạp. Chỉ cần đặt lại về bản sao : git reset --hard 01b34fa, trong trường hợp này, bạn có thể thực hiện git reset --hard HEAD^việc đặt lại thành một cam kết trước TRƯỚC.
jkp

2
--hard là cần thiết nếu bạn muốn sửa đổi các tệp trong thư mục làm việc của mình
William Pursell

3
@ seg.server.fault: nếu nó hoạt động, bạn luôn có thể chấp nhận câu trả lời;)
jkp

7
git reset - ĐẦU
TIÊN

7
git reflogsẽ hiển thị mọi thứ đã được thực hiện với git. Có một mối quan tâm git reset --hard [sha1 of something from reflog]sẽ hoàn nguyên mọi thứ được hiển thị reflog, đôi khi không phải là mục tiêu, ví dụ. bạn muốn hoàn nguyên hợp nhất trên nhánh chính được lấy từ gốc với dữ liệu xấu (xảy ra) và sau khi hợp nhất đó, bạn đã làm việc trên các nhánh khác. reflogsẽ hiển thị mọi chage trên các nhánh khác. Nhưng git checkout mastergit reset --hard [SH1 of commit on master branch just before merge]sẽ chỉ thiết lập lại nhánh chính hiện tại loại bỏ hợp nhất kéo từ gốc.
Vladimir Vukanac 14/07/2015

Câu trả lời:


1427

Chạy git pullthực hiện các nhiệm vụ sau, theo thứ tự:

  1. git fetch
  2. git merge

Bước hợp nhất kết hợp các nhánh đã được thiết lập để được hợp nhất trong cấu hình của bạn. Bạn muốn hoàn tác bước hợp nhất , nhưng có lẽ không phải là tìm nạp (không có nhiều ý nghĩa và không cần thiết).

Để hoàn tác việc hợp nhất , sử dụng git reset --hardđể đặt lại kho lưu trữ cục bộ về trạng thái trước đó; sử dụng git-reflog để tìm SHA-1 của trạng thái trước đó và sau đó đặt lại về trạng thái đó.

Cảnh báo

Các lệnh được liệt kê trong phần này sẽ loại bỏ tất cả các thay đổi không được cam kết, có khả năng dẫn đến mất việc:

git reset --hard

Hoặc, đặt lại đến một thời điểm cụ thể, chẳng hạn như:

git reset --hard master@{"10 minutes ago"}

325
Một cách tuyệt vời để chọn trạng thái trước đó, thay vì sử dụng git-reflog và băm sao chép, là sử dụng một phím tắt như master@{1}, đó là vị trí trước đây của master, master@{"5 minutes ago"}hoặc master@{14:30}. Chi tiết đầy đủ về chỉ định sửa đổi theo cách này có thể được tìm thấy trong man git-rev-parse, trong phần được gọi là "chỉ định sửa đổi".
Cascabel

38
Trong trường hợp này, ORIG_HEAD cũng sẽ hoạt động ("git reset --hard ORIG_HEAD")
Jakub Narębski

@Jelfromi: cảm ơn vì lời khuyên đó, tôi không biết bạn có thể rất dài dòng về các phiên bản. Tôi biết về việc chọn các bản sửa đổi liên quan đến TRƯỚC, nhưng khi câu hỏi được đặt ra, tôi không biết mình đã muốn đi xa như thế nào.
jkp

Khi tôi kéo, nó nói Updating d2c90a3..035ac4d. Tại đây, bạn cũng có thể sử dụng d2c90a3làm tham số để đặt lại.
Thái

Bạn không cần phải gõ băm khi bạn sử dụng reflog. Bạn cũng có thể sử dụng HEAD @ {1} hoặc số trước đó như được xác định trong reflog.
Simon The Cat

338

Giống như câu trả lời của jkp, nhưng đây là lệnh đầy đủ:

git reset --hard a0d3fe6

nơi a0d3fe6 được tìm thấy bằng cách làm

git reflog

và nhìn vào điểm mà bạn muốn hoàn tác.


Tại sao tôi không thể làm git reset HEAD --hard, ví dụ?
Sung Cho

9
@MikeC Cách tiếp cận này cho phép bạn quay trở lại một số lần kéo, chẳng hạn
xji

2
Tôi không thể sử dụng id bên trái nhưng git reset --hard HEAD@{n}đã hoạt động
E. Sundin

1
Bạn nên đề xuất một chỉnh sửa cho câu trả lời của jkp thay vì gần như sao chép nó ở đây sau nhiều năm.
Abhishek Anand

Nếu tôi có cái này trên git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} và bbbbbbb HEAD @ {2}. Nếu tôi làm git reset --hard bbbbbbbtôi sẽ mất ĐẦU 0 và 1?
pmiranda

115

Một cách hiện đại hơn để hoàn tác hợp nhất là:

git merge --abort

Và cách hơi cũ:

git reset --merge

Cách thức trường học cũ được mô tả trong các câu trả lời trước (cảnh báo: sẽ loại bỏ tất cả các thay đổi cục bộ của bạn):

git reset --hard

Nhưng thực ra, điều đáng chú ý git merge --abortlà chỉ tương đương với git reset --mergesự MERGE_HEADhiện diện. Điều này có thể được đọc trong trợ giúp git cho lệnh hợp nhất.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Sau khi hợp nhất thất bại, khi không có MERGE_HEAD, hợp nhất thất bại có thể được hoàn tác git reset --mergenhưng không nhất thiết phải có git merge --abort, vì vậy chúng không chỉ là cú pháp cũ và mới cho cùng một điều . Đây là lý do tại sao tôi thấy git reset --mergehữu ích hơn nhiều trong công việc hàng ngày.


20
git merge --aborthoạt động DURING một sự hợp nhất, không phải sau khi git pullkết thúc. Vì vậy, câu trả lời này dường như không liên quan đến câu hỏi.
Abhishek Anand

1
git reset --mergexóa tất cả các thay đổi không được tổ chức cho cam kết. Tìm thấy điều này một cách khó khăn.
theadriangreen

62

nó hoạt động đầu tiên sử dụng: git reflog

tìm SHA của bạn về trạng thái thịnh hành của bạn và thực hiện (HEAD @ {1} là một ví dụ)

git reset --hard HEAD@{1}

40

Nếu bạn có gitk (hãy thử chạy "gitk --all từ dòng lệnh git của bạn"), thật đơn giản. Chỉ cần chạy nó, chọn cam kết bạn muốn quay lại (nhấp chuột phải) và chọn "Đặt lại nhánh chính ở đây". Nếu bạn không có thay đổi nào, hãy chọn tùy chọn "cứng".


8
Điều này đáng để chạy nếu bạn chưa nhìn thấy nó. Nó hiện lên một GUI điên rồ.
Evan Moran

35

Giả sử $COMMITlà id xác nhận cuối cùng trước khi bạn thực hiện git pull. Những gì bạn cần để hoàn tác lần kéo cuối cùng là

git reset --hard $COMMIT

.

Tặng kem:

Nói về kéo, tôi muốn chia sẻ một mẹo thú vị,

git pull --rebase

Lệnh trên là lệnh hữu ích nhất trong cuộc sống git của tôi giúp tiết kiệm rất nhiều thời gian.

Trước khi đẩy cam kết mới của bạn đến máy chủ, hãy thử lệnh này và nó sẽ tự động đồng bộ các thay đổi máy chủ mới nhất (với fetch + merge) và sẽ đặt cam kết của bạn ở đầu trong nhật ký git. Không cần phải lo lắng về việc kéo / hợp nhất thủ công.

Tìm thông tin chi tiết tại: http://gitolite.com/git-pull--rebase


17

Đây là cách dễ nhất để hoàn nguyên các thay đổi của bạn.

** Warning **

Vui lòng sao lưu các tệp đã thay đổi của bạn vì nó sẽ xóa các tệp và thư mục mới tạo .

git reset --hard 9573e3e0

Nơi 9573e3e0được bạn {Commit id}


Phản hồi này rất hữu ích, bởi vì nếu chúng ta thực hiện một nhánh git pull wi wi có được thứ gì đó như thế này Updating ffce65bd..e929e884, thì hãy làmgit reset --hard ffce65bd
Ernesto Alfonso

15

bạn có thể làm git reset --hard ORIG_HEAD

vì "pull" hoặc "merge" đặt ORIG_HEAD thành trạng thái hiện tại trước khi thực hiện các hành động đó.


5

git kéo làm dưới đây hoạt động.

Tôi. git fetch

ii. git merge

Để hoàn tác kéo thực hiện bất kỳ thao tác nào:

Tôi. git reset --hard --- nó hoàn nguyên tất cả thay đổi cục bộ

hoặc là

ii. git reset --hard master@{5.days.ago} (như 10.minutes.ago, 1.hours.ago, 1.days.ago..) để có được sự thay đổi của địa phương.

hoặc là

iii. git reset --hard commitid

Cải thiện:

Lần sau sử dụng git pull --rebasethay vì git pull.. máy chủ đồng bộ hóa của nó thay đổi bằng cách thực hiện (tìm nạp & hợp nhất).


4

Nếu có một sự hợp nhất không thành công, đó là lý do phổ biến nhất cho việc muốn hoàn tác một git pull, việc chạy git reset --mergesẽ thực hiện chính xác những gì người ta mong đợi: giữ các tệp được tìm nạp, nhưng hoàn tác việc hợp nhất git pullđã cố gắng hợp nhất. Sau đó, người ta có thể quyết định phải làm gì mà không có sự lộn xộn git mergeđôi khi tạo ra. Và nó không cần một để tìm ID cam kết chính xác --hardđược đề cập trong mỗi câu trả lời khác yêu cầu.

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.