Làm cách nào tôi có thể chuyển kho git của mình sang một cam kết cụ thể


189

Trong kho git của tôi, tôi đã thực hiện 5 lần xác nhận, như bên dưới trong nhật ký git của mình:

commit 4f8b120cdafecc5144d7cdae472c36ec80315fdc
Author: Michael 
Date:   Fri Feb 4 15:26:38 2011 -0800

commit b688d46f55db1bc304f7f689a065331fc1715079
Author: Michael
Date:   Mon Jan 31 10:37:42 2011 -0800

commit b364f9dcec3b0d52666c4f03eb5f6efb7e1e7bda
Author: Michael
Date:   Wed Jan 26 13:33:17 2011 -0800

commit 4771e26619b9acba3f059b491c6c6d70115e696c
Author: Michael 
Date:   Wed Jan 26 11:16:51 2011 -0800

commit 6e559cb951b9bfa14243b925c1972a1bd2586d59
Author: Michael 
Date:   Fri Jan 21 11:42:27 2011 -0800

Làm cách nào tôi có thể khôi phục 4 lần xác nhận trước đó tại một chi nhánh? Nói cách khác, làm cách nào tôi có thể tạo một nhánh mà không có 4 lần xác nhận mới nhất (giả sử tôi có SHA của cam kết đó từ nhật ký git)?

Câu trả lời:


229

Để tạo một chi nhánh mới (cục bộ):

  • Với hàm băm cam kết (hoặc một phần của nó)

    git checkout -b new_branch 6e559cb
    
  • hoặc để quay lại 4 lần xác nhận từ CHÍNH

    git checkout -b new_branch HEAD~4
    

Khi chi nhánh mới của bạn được tạo (cục bộ), bạn có thể muốn sao chép thay đổi này trên một điều khiển từ xa cùng tên: Làm cách nào tôi có thể đẩy các thay đổi của mình sang một chi nhánh từ xa


Để loại bỏ ba cam kết cuối cùng , xem câu trả lời của Lunaryorn bên dưới .


Để di chuyển chi nhánh hiện tại của bạn tới cam kết đã chỉ định mà không tạo chi nhánh mới , hãy xem câu trả lời của Arpiagar bên dưới .


153

Tất cả các lệnh trên tạo một nhánh mới và với cam kết mới nhất là một lệnh được chỉ định trong lệnh, nhưng chỉ trong trường hợp bạn muốn nhánh hiện tại của mình HEADchuyển sang cam kết đã chỉ định, bên dưới là lệnh:

 git checkout <commit_hash>

tách ra và trỏ HEADđến cam kết được chỉ định và lưu từ việc tạo một nhánh mới khi người dùng chỉ muốn xem trạng thái nhánh cho đến khi cam kết cụ thể đó.


Sau đó, bạn có thể muốn quay lại cam kết mới nhất và sửa lỗi ĐẦU tách ra:

Sửa đầu Git tách ra?


1
Điều này sẽ tách ra đầu. Không tiện lợi.
IgorGanapolsky

ngay cả khi <commit_hash>là trong chi nhánh khác nhau ở phía trước?
Ciasto piekarz

Câu hỏi được liên kết chỉ nói git checkout master, bên cạnh một hoặc hai trường hợp cạnh có thể áp dụng cho các tình huống nhất định.
i336_

66

Nếu bạn muốn ném bốn cam kết mới nhất đi, hãy sử dụng:

git reset --hard HEAD^^^^

Ngoài ra, bạn có thể chỉ định hàm băm của một cam kết bạn muốn đặt lại thành:

git reset --hard 6e559cb

4
Điều này rời khỏi bước phân nhánh. Nếu anh ta chạy chính xác những gì được hiển thị ở đây, anh ta sẽ vĩnh viễn mất những cam kết hàng đầu đó.
Jimmy Cuadra

3
Chà, không nhất thiết là vĩnh viễn - người ta có thể lấy SHA của người đứng đầu trước git reflogvà đặt lại cho nó - nhưng nó sẽ ném chúng đi, vâng.
Amber

1
Nếu các xác nhận được đẩy trước sau đó đặt lại, chúng có thể được lấy lại chỉ bằng một lần kéo.
Rick Smith

17

Chỉ cần kiểm tra cam kết bạn muốn chi nhánh mới của bạn bắt đầu và tạo một chi nhánh mới

git checkout -b newbranch 6e559cb95
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.