2010-02-06 9 views
35

Hey Tôi mới đến git và tôi cần phải hoàn tác một kéo, bất cứ ai có thể giúp đỡ?!? Vì vậy, những gì tôi đã làm là ...Hoàn tác một git pull --rebase

  1. git commit
  2. git stash
  3. git pull --rebase
  4. git stash pop

này đã tạo ra một loạt các cuộc xung đột và đã đi một chút sai. Bây giờ làm 'danh sách stit git' tiết lộ rằng stash của tôi vẫn còn đó. Có thể hoàn nguyên repo của tôi trở lại điểm ngay sau khi thực hiện cam kết git. Vì vậy, hiệu quả repo của tôi chỉ chứa những thay đổi tôi đã thực hiện và không có gì mới từ máy chủ?

Trả lời

37

sử dụng git reflog bạn sẽ thấy một danh sách các TRỤ cam kết chỉ vào trong quá khứ

sử dụng

git checkout -b after-commit [email protected]{1} # or the commit you want to recover 

bạn tạo một chi nhánh mới tại vị trí chính xác đó và kiểm tra nó ra

+0

làm điều này ném một lỗi thông báo cho tôi rằng một tập tin sẽ được ghi đè bằng cách hợp nhất. Có cách nào để bỏ qua điều này không? – Thomas

+4

Đảm bảo thư mục làm việc của bạn sạch sẽ (git reset --hard HEAD sẽ làm điều đó). Ngoài ra, hãy chắc chắn rằng việc rebase không còn trong tiến trình (git rebase --abort). –

+0

Bạn của tôi là một người tiết kiệm cuộc sống! Cảm ơn bạn :) – Thomas

-1

Sử dụng git log -g và tìm ra chỉ số cam kết mà bạn muốn quay trở lại, chỉ làm git checkout index

+0

Điều này không thực sự hữu ích, vì 'pull --rebase' phát lại các cam kết của bạn trên đầu những gì bạn vừa kéo; trong trường hợp này, bạn không thể chỉ cần kiểm tra cam kết cũ của bạn, vì nó nằm trên đầu trang của các cam kết bạn vừa kéo. –

71

Thực ra, để làm cho Git dễ dàng hơn giữ một tham chiếu có tên là ORIG_HEAD trỏ đến vị trí của bạn trước khi rebase. Vì vậy, nó dễ dàng như:

git reset --hard ORIG_HEAD 
+4

Tôi gần như bị mất giá trị của một tuần làm việc, nhưng điều này đã phục sinh nó. Điều này chắc chắn quan trọng để biết nếu bạn làm việc trên bất kỳ dự án nào với những người khác, nơi họ buộc tất cả mọi người phải làm lại thay vì sáp nhập. Vít một lịch sử sạch hơn, rebasing là nguy hiểm. – Gavin

4

Bạn nên kiểm tra các lệnh

git reset --merge 

Đó loại bỏ sự cần thiết cho một git commit; git stash trước khi kéo (Không biết về rebase)

Lệnh trả về một không gian làm việc với các thay đổi không được cam kết trước khi kéo xung đột.