Làm cách nào để quay lại phiên bản mới nhất trong Git?


303

Gần đây tôi đã chuyển từ SVN sang Git và hơi bối rối về điều gì đó. Tôi cần chạy phiên bản trước của tập lệnh thông qua trình gỡ lỗi, vì vậy tôi đã làm git checkout <previous version hash>và làm những gì tôi cần làm.

Bây giờ tôi muốn quay lại phiên bản mới nhất, nhưng tôi không biết hàm băm cho nó. Khi tôi gõgit log , tôi không thấy nó.

Tôi có thể làm cái này như thế nào? Ngoài ra, có cách nào dễ dàng hơn để thay đổi phiên bản hơn là gõ băm - một cái gì đó như "quay lại hai phiên bản" hoặc "đi đến thời gian gần đây nhất"?

Câu trả lời:


371

git checkout masternên làm thủ thuật. Để quay lại hai phiên bản, bạn có thể nói một cái gì đó như git checkout HEAD~2, nhưng tốt hơn là tạo một nhánh tạm thời dựa trên thời gian đó, vì vậygit checkout -b temp_branch HEAD~2


7
Mát mẻ! git checkout masterchính xác là cách tôi chuyển trở lại từ một chi nhánh. Vậy điều đó có nghĩa là khi tôi kiểm tra phiên bản trước, về cơ bản tôi đang tạo một chi nhánh?
Nathan Long

4
@Nathan: Trong git, một nhánh thực sự chủ yếu là một con trỏ di chuyển đến một phiên bản nhất định. Về mặt khái niệm, bạn đang tạo ra một nhánh, nhưng không phải theo nghĩa mà git nghĩ về các nhánh.
DLH

2
Vì vậy, trong trường hợp đơn giản nhất, khi tôi có một loạt các thay đổi tuyến tính, khi tôi kiểm tra một phiên bản trước đó, tôi đang di chuyển con trỏ CHÍNH ở đó, điều đó có nghĩa là git logsẽ hiển thị liên quan đến điểm đó? Và khi tôi kiểm tra master, tôi di chuyển con trỏ đến phiên bản mới nhất của nhánh master?
Nathan Long

7
@Nathan: Chính xác. Đầu là một thứ gọi là ref đặc trưng - nói chung nó là một con trỏ đến một ref khác (nhánh hiện đang được kiểm tra). git checkoutlà một cách để di chuyển TRƯỚC. Khi bạn tách ra CHÍNH, bạn đã chỉ thẳng đến cam kết đã cho; khi bạn kiểm tra chủ một lần nữa, nó lại quay về chủ. (Và nhiều lệnh như git logthực sự có một phạm vi sửa đổi, mặc định là CHÍNH.)
Cascabel

3
Yep - HEAD là "đại từ" được dùng để chỉ "Phiên bản của mã trong thư mục làm việc". Nó cũng là đại từ cho "Cha mẹ của bất cứ điều gì bạn cam kết tiếp theo"
Ana Betts

54

Khi bạn kiểm tra một cam kết cụ thể, git sẽ tạo ra một nhánh tách ra. Vì vậy, nếu bạn gọi:

$ git branch 

Bạn sẽ thấy một cái gì đó như:

* (detached from 3i4j25)
  master
  other_branch

Để quay lại đầu chi nhánh chính, bạn chỉ cần kiểm tra lại chi nhánh chính của mình một lần nữa:

$ git checkout master

Lệnh này sẽ tự động xóa các nhánh tách ra.

Nếu git checkoutkhông hoạt động, có thể bạn đã sửa đổi các tệp xung đột giữa các nhánh. Để ngăn chặn bạn mất mã git yêu cầu bạn phải xử lý các tệp này. Bạn có ba lựa chọn:

  1. Bỏ bớt các sửa đổi của bạn (bạn có thể bật chúng sau):

    $ git stash
    
  2. Hủy bỏ các thay đổi thiết lập lại chi nhánh tách ra:

    $ git reset --hard
    
  3. Tạo một nhánh mới với các sửa đổi trước đó và cam kết chúng:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

Sau này, bạn có thể quay lại nhánh chính của mình (phiên bản mới nhất):

$ git checkout master

36

Điều này đã tạo ra mánh khóe cho tôi (tôi vẫn ở trên nhánh chính):

git reset --hard origin/master

34
đặt lại - quá mức là quá mức cần thiết và chứng tỏ bạn không biết về những sửa đổi bạn đã thực hiện. Điều này có thể dẫn đến việc mất mã.
Thomio

1
Trong trường hợp của tôi, tôi muốn thoát khỏi những thay đổi vô tình đã cam kết. Tôi biết có thể có các phương pháp khác để đạt được điều đó. Tôi đồng ý nếu bạn không muốn mất các thay đổi đã cam kết chưa được xử lý thì đây là mất dữ liệu.
Csaba Toth

8

Để trở về phiên bản mới nhất:

git checkout <branch-name> 

Ví dụ, git checkout masterhoặcgit checkout dev


7

Bạn có thể kiểm tra bằng cách sử dụng tên chi nhánh, cho một điều.

Tôi biết có một số cách để di chuyển TRỤ, nhưng tôi sẽ để lại cho một chuyên gia git để liệt kê chúng.

Tôi chỉ muốn đề xuất gitk --all- Tôi thấy nó rất hữu ích khi bắt đầu với git.


7

Tôi mới bắt đầu tìm hiểu sâu hơn về git, vì vậy tôi không chắc mình có hiểu đúng không, nhưng tôi nghĩ câu trả lời chính xác cho câu hỏi của OP là bạn có thể chạy git log --allvới một đặc tả định dạng như thế này : git log --all --pretty=format:'%h: %s %d'. Điều này đánh dấu phiên bản đã thanh toán hiện tại (HEAD)và bạn có thể lấy phiên bản tiếp theo từ danh sách.

BTW, thêm một bí danh như thế này .gitconfigvới định dạng tốt hơn một chút và bạn có thể chạy git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

Về các phiên bản tương đối, tôi tìm thấy bài đăng này , nhưng nó chỉ nói về các phiên bản cũ hơn, có lẽ không có gì để đề cập đến các phiên bản mới hơn.


6

Một số câu trả lời ở đây cho rằng bạn đang ở chi nhánh chính trước khi bạn quyết định kiểm tra một cam kết cũ hơn. Đây không phải là luôn luôn như vậy.

git checkout -

Sẽ đưa bạn trở lại chi nhánh mà bạn đã ở trước đó (bất kể đó có phải là chủ hay không).


Không cần thiết một nhánh, nó sẽ trỏ TRƯỚC đến nơi mà nó đã trỏ tới trước đó; nếu bạn đã làm git checkout hash2sau git checkout hash1, git checkout -sẽ đưa bạn trở lại hash1.
Mikhail Vasin

3

Khi bạn quay lại phiên bản trước,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

Bạn có thể thấy nhật ký tính năng (băm) của mình với lệnh này ngay cả trong tình huống này;

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master có thể được thay thế bằng một tên chi nhánh khác.

Sau đó kiểm tra nó, bạn sẽ có thể quay lại tính năng.

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

Với Git 2.23+ (tháng 8 năm 2019), cách thực hành tốt nhất sẽ là sử dụng git switchthay vì lệnh khó hiểugit checkout .

Để tạo một nhánh mới dựa trên phiên bản cũ hơn:

git switch -c temp_branch HEAD~2

Để quay lại nhánh chính hiện tại:

git switch master

0

Một giải pháp đơn giản và thanh lịch hơn là sử dụng

git stash

Nó sẽ trở về phiên bản cục bộ bực bội nhất của chi nhánh và cũng lưu các thay đổi của bạn trong stash, vì vậy nếu bạn muốn hoàn tác hành động này, hãy làm:

git stash apply

Tôi biết nó rất cũ nhưng tôi phải bình luận về điều này (vì tôi nghĩ giải pháp này không nên sử dụng) - Tôi sẽ không sử dụng giải pháp này vì nó không giải quyết được vấn đề này mà là một vấn đề khác. với giải pháp stash này mỗi khi bạn muốn kiểm tra một cam kết trước đó, bạn thực sự "lưu" dữ liệu rất cần thiết cho trường hợp này. Cách đúng đắn và thanh lịch hơn là (như đã nêu trước đây) chỉ cần thanh toán <chi nhánh>.
Maayao
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.