2012-04-17 10 views
23

Tôi có một máy chủ web phục vụ một dự án là một kho lưu trữ git. Khi tôi thực hiện một số thay đổi đối với mã, tôi thực hiện lệnh git pull từ máy chủ. Đôi khi mã mới chỉ gặp sự cố, tôi muốn có thể thực hiện một lần khôi phục cho lần kéo mới nhất, mã mới ngay trước đó. Tôi muốn làm điều đó với một kịch bản, mà không cần phải tìm kiếm sha mới nhất là gì. Làm thế nào tôi có thể làm điều đó?Git rollback 1 pull

Chỉnh sửa: Chỉ cần làm rõ, tôi chỉ muốn thực hiện một hành động, chẳng hạn như nhấn nút nói "oops! Lần kéo mới nhất mà tôi vừa làm là một sai lầm, tôi ước tôi không làm điều đó". Tôi không muốn phải tìm sha hoặc thẻ hay bất cứ thứ gì khác trong tình huống này, nó giống như một chức năng 'hoàn tác'. Sau đó, tôi muốn để có thể tiếp tục làm việc trên mã và kéo tiếp theo trên máy chủ cần phải mang lại những thay đổi mới nhất.

Trả lời

52

git reset --hard HEAD^1 sẽ đưa bạn trở lại một cam kết từ những gì bạn đã kéo. Nếu bạn muốn nó quay lại trạng thái trước khi bạn kéo, hãy sử dụng git reset --hard [email protected]{1}. @{1} các bản nhạc có phần đầu ở trước hoạt động cuối cùng đã thay đổi nó trong repo địa phương của bạn, vì vậy nó sẽ quay trở lại một số cam kết nếu một số được đẩy trước khi bạn kéo. Ngoài ra, hãy xem git reflog để hiển thị toàn bộ danh sách.

+1

rất thú vị, và sau đó làm thế nào tôi sẽ trở lại hoạt động bình thường? Tôi có nghĩa là nếu làm một số sửa chữa trên mã xấu, tôi có thể chỉ cần đi đến máy chủ và làm một git kéo một lần nữa để có được những thay đổi mới nhất? – Bastian

+3

Có, nó sẽ ở trong một trạng thái như bạn không bao giờ kéo, vì vậy bất cứ điều gì bạn thường làm có thể được thực hiện. –

2

git reset HEAD^ sẽ đưa bạn đến cam kết trước đó. Xem here để biết thêm thông tin.

+0

Nó thực sự 'git reset --hard ĐẦU^', trừ khi bạn không muốn chạm vào thư mục làm việc của bạn. –

+0

Theo câu hỏi, repo chỉ cần khôi phục sau khi kéo mới gây ra vấn đề, do đó thư mục làm việc phải trống. –

0

Một cách khác để thực hiện việc này sẽ liên quan đến việc sử dụng thẻ. Ý nghĩ là bạn có thể gắn thẻ HEAD của bạn với một số phiên bản trước khi kéo, thực hiện thao tác kéo, sau đó nếu bạn cần quay HEAD trở lại, bạn có thể làm git reset {tag name} Bằng cách đó, nếu kéo có nhiều cam kết, bạn có thể quay lại nơi bạn đã trước khi hợp nhất.

2

Trong trường hợp này, bạn có thể sử dụng chi nhánh để có thể dễ dàng xóa hoặc hợp nhất khi không thành công hoặc không thành công. Điều này sẽ giúp bạn theo dõi những gì là mới, và làm cho mọi thứ sạch hơn nếu bạn có trường hợp phức tạp hơn "chỉ cần loại bỏ cam kết cuối cùng" (đặc biệt là kể từ khi bạn muốn làm điều đó với một kịch bản). Vì vậy, trên máy chủ của bạn:

git fetch --all   # fetch new commits from remote 
git checkout -b testing # create and switch to branch 'testing' 
git merge origin/master # merge new commits from remote branch master 
          # (in branch 'testing') 

... sau đó thử nghiệm thứ ... nếu thành công:

git checkout master  # switch back to master 
git merge testing 

và khi thất bại:

git checkout master 
git branch -D testing  # remove testing branch 

Nhưng dù sao ... Nó chỉ của bạn điểm là để loại bỏ cam kết cuối cùng, bạn có thể sử dụng git reset như chỉ ra bởi Josh.

+0

Điểm tốt ở đây, nó không phải là những gì tôi đã suy nghĩ về nhưng có thể làm việc rất tốt. Tôi sẽ cố gắng và đi với phương pháp đơn giản nhất. – Bastian

1

Câu trả lời được chấp nhận bởi @Karl Bielefeldt không chính xác làm việc cho tôi. Tôi đang sử dụng phiên bản GIT 2.10.0.windows.1 Có thể làm việc này cho các phiên bản cũ hơn. Tôi đang gặp lỗi "chuyển đổi không xác định 'e'". Cuối cùng, tôi đã thực hiện một số thay đổi và nó đã hoạt động.

Dưới đây là các bước để trở lại trạng thái trước khi kéo theo thời gian:

  1. Sử dụng git reflog để xem danh sách như Karl nói.
  2. Chọn phiên bản cam kết từ danh sách mà bạn muốn chuyển về.
  3. Execute git reset --hard <commit version>