Làm cách nào để quay lại cam kết mới nhất sau khi kiểm tra một cam kết trước đó?


477

Đôi khi tôi kiểm tra một số phiên bản trước của mã để kiểm tra hoặc kiểm tra. Tôi đã thấy hướng dẫn về những việc cần làm nếu tôi muốn sửa đổi các cam kết trước đó - nhưng giả sử tôi không thực hiện thay đổi. Sau khi tôi thực hiện git checkout HEAD^, ví dụ , làm thế nào để tôi quay trở lại đỉnh của chi nhánh? .. git logkhông còn cho tôi thấy SHA của cam kết mới nhất.


11
Về git logcâu của câu hỏi của bạn, bạn luôn có thể chạy git log --all(hoặc hữu ích hơn, git log --oneline --graph --all).
tự đại diện

Câu trả lời:


606

Nếu bạn biết cam kết bạn muốn quay lại là người đứng đầu một số chi nhánh hoặc được gắn thẻ, thì bạn có thể chỉ cần

git checkout branchname

Bạn cũng có thể sử dụng git reflogđể xem những gì mà các cam kết khác của bạn (hoặc bất kỳ giới thiệu nào khác) đã chỉ ra trong quá khứ.


Chỉnh sửa để thêm:

Trong các phiên bản Git mới hơn, nếu bạn chỉ chạy git checkouthoặc một cái gì đó khác để di chuyển HEADmột lần, bạn cũng có thể làm

git checkout -

để quay trở lại bất cứ nơi nào trước khi thanh toán cuối cùng. Điều này được thúc đẩy bởi sự tương tự với thành ngữ shell cd -để quay trở lại bất kỳ thư mục làm việc nào trước đây.


27
Tôi muốn đề cập rằng ví dụ điển hình sẽ là "git checkout master". Một trong những khó khăn tôi đã học khi sử dụng git là không biết từ khóa cụ thể nào (ví dụ: "master") tôi thực sự có thể thay thế cho các từ giữ chỗ như "tên nhánh".
AbePralle

3
masterthực sự không phải là bất kỳ loại từ khóa nào HEAD. Nó chỉ là tên nhánh mặc định trong một kho lưu trữ mới. Bạn có thể chạy git branchđể lấy danh sách các nhánh trong kho lưu trữ của bạn và git tag -lcho danh sách các thẻ. Tương tự, originlà tên mặc định của điều khiển từ xa mà kho lưu trữ được sao chép từ đó, nhưng không có gì đặc biệt về nó.
Phil Miller

3
Nếu nó không rõ ràng, git reflogcung cấp cho bạn một danh sách băm, tại thời điểm đó bạn có thể sử dụng git checkout [commit-hash].
jbnunn

Tôi đã xóa một tập tin và thử lệnh, nhưng nó không hoàn toàn thiết lập lại nó. Trước hết, nó không đệ quy. Sau đó, khi tôi thử điều này trên tập tin tôi đã xóa, git sau đó nói với tôi rằng ĐẦU bị tách ra. Phải làm sao
Daniel S.

1
@DanielS.: Câu hỏi và câu trả lời của tôi là về các cam kết , trong khi bạn đang nói về các tệp. Git đối xử với họ khá khác nhau.
Phil Miller

27

chủ thanh toán git

chủ là tiền boa, hoặc cam kết cuối cùng gitk sẽ chỉ cho bạn thấy nơi bạn đang ở trên cây vào thời điểm đó. git reflog sẽ hiển thị tất cả các cam kết, nhưng trong trường hợp này, bạn chỉ muốn tiền boa, vì vậy git checkout master.


1
Điều này. Hoặcgit checkout branchname
Alex

19

Đến câu hỏi này ngay bây giờ và có một cái gì đó để thêm

Để đi đến cam kết gần đây nhất:

git checkout $(git log --branches -1 --pretty=format:"%H")

Giải trình:

git log --brancheshiển thị nhật ký của các xác nhận từ tất cả các nhánh cục bộ
-1giới hạn ở một cam kết →
--pretty=format:"%H"định dạng cam kết gần đây nhất để chỉ hiển thị
git checkout $(...)đầu ra sử dụng hàm băm của subshell làm đối số cho thanh toán

Ghi chú:

Điều này sẽ dẫn đến một đầu tách ra mặc dù (vì chúng tôi kiểm tra trực tiếp đến cam kết). Điều này có thể tránh được bằng cách trích xuất tên chi nhánh bằng cách sedgiải thích bên dưới.


Để đi đến chi nhánh của cam kết gần đây nhất:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

Giải trình:

git log --brancheshiển thị nhật ký xác nhận từ tất cả các nhánh cục bộ
-1giới hạn ở một cam kết →
--pretty=format:"%D"định dạng cam kết gần đây nhất để chỉ hiển thị tên ref
| sed 's/.*, //g'bỏ qua tất cả trừ lần cuối cùng của nhiều ref (*)
git checkout $(...)sử dụng đầu ra của subshell làm đối số để thanh toán

*) Các nhánh đầu và từ xa được liệt kê đầu tiên, các nhánh cục bộ được liệt kê cuối cùng theo thứ tự giảm dần theo thứ tự bảng chữ cái, do đó, nhánh còn lại sẽ là tên nhánh đầu tiên theo thứ tự bảng chữ cái

Ghi chú:

Điều này sẽ luôn chỉ sử dụng tên nhánh đầu tiên (theo bảng chữ cái) nếu có nhiều cho cam kết đó.


Dù sao, tôi nghĩ rằng giải pháp tốt nhất sẽ chỉ là hiển thị tên ref cho cam kết gần đây nhất để biết nơi thanh toán:

git log --branches -1 --pretty=format:'%D'

Ví dụ: tạo bí danh git topcho lệnh đó.


1
Bằng cách nào đó tôi đã thực hiện lệnh thứ hai ... Đã sửa nó, bây giờ nó sẽ kiểm tra chính xác bạn ra khỏi nhánh của cam kết gần đây nhất.
816-8055

Bí danh Bash / zsh cho lệnh quay trở lại đầualias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel

9

Hãy nhìn vào GUI đồ họa ... gitknó hiển thị tất cả các cam kết. Đôi khi làm việc đồ họa dễ dàng hơn ... ^^


vâng, đây thực sự là cách tôi đã làm trong quá khứ - nhưng hiện tại tôi không có GUI
Leo Alekseyev

7

Bạn có thể sử dụng một trong các lệnh git sau cho việc này:

git checkout master
git checkout branchname

4

hiển thị tất cả các chi nhánh và cam kết
git log --branches --oneline

hiển thị lần cuối
git log --branches -1 --oneline

hiển thị trước lần đăng nhập git cuối cùng
--branches -2 --oneline


Lệnh đầu tiên có thực sự cam kết mã nào hiện đang được dàn dựng hay tôi đang đọc sai mã này?
Lazerbeak12345

3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>

0

Nếu bạn có một nhánh khác với master, một cách dễ dàng là kiểm tra nhánh đó, sau đó kiểm tra master. Voila, bạn đã trở lại ở đỉnh của chủ. Có lẽ có những cách thông minh hơn ...


0

Bạn chỉ có thể làm git pull origin branchname. Nó sẽ lấy cam kết mới nhất một lần nữa.


Tôi không khuyên bạn điều này nếu bạn không muốn kéo từ thượng nguồn. Người ta chỉ nên xử lý xung đột hợp nhất khi chúng sẵn sàng.
Lazerbeak12345

Chà, trong trường hợp đó, người đứng đầu sẽ vẫn ở trạng thái tách rời ngay cả khi bạn kiểm tra cam kết mới nhất.
Ankit Singh

-2

Nếu cam kết mới nhất của bạn là trên nhánh chính, bạn chỉ cần sử dụng

git checkout master
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.