Có cách nào để git kiểm tra chi nhánh trước?


703

Tôi sắp xếp tương đương cd -với git. Nếu tôi ở trong chi nhánh mastervà tôi thanh toán foo, tôi rất thích có thể nhập một cái gì đó như git checkout -quay trở lại mastervà có thể nhập lại để trở lại foo.

Có bất cứ điều gì như thế này tồn tại? Nó sẽ khó thực hiện?


2
Tôi muốn gõ mũi tên UP để tìm lệnh kiểm tra git trước đây của mình: p
Kit Ho

11
liên quan đến việc di chuyển bàn tay của bạn khỏi vị trí nhà, gõ gc- là CÁCH nhanh hơn sau đó nhấn lên cho đến khi bạn tìm thấy những gì bạn đang tìm kiếm
Matt Briggs

@MattBriggs bạn có thực sự gõ gc-hoặc là viết tắt chogit checkout -
jewbix.cube

2
@ jewbix.cube Bạn cần tìm hiểu về bí danh, cả cho vỏ của bạn và cho git.
Gauthier

@KitHo: Tôi thấy mình muốn làm điều đó liên tục, nhưng lệnh tôi muốn thậm chí không tồn tại trong lịch sử nếu, ví dụ, tôi chỉ tạo chi nhánh.
M_M

Câu trả lời:


1227

Từ ghi chú phát hành cho 1.6.2

@{-1}là một cách để đề cập đến chi nhánh cuối cùng bạn đã ở. Điều này được
chấp nhận không chỉ ở nơi mà một tên đối tượng được mong đợi, mà bất cứ nơi nào một tên chi nhánh được mong đợi và hoạt động như thể bạn đã gõ tên chi nhánh.
Ví dụ git branch --track mybranch @{-1}, git merge @{-1}
git rev-parse --symbolic-full-name @{-1}sẽ làm việc như mong đợi.

git checkout -là một tốc ký cho git checkout @{-1}.


46
wow, tôi hoàn toàn nên thử nó! hình - là một vỏ sò, và nếu chức năng là trong git, nó sẽ là một cái gì đó khác
Matt Briggs

9
Điều này không hoạt động tốt khi bạn kiểm tra SHA cam kết hai lần, trong trường hợp đó @ {- 1} chỉ ra vị trí của bạn trước lần thanh toán đầu tiên ..
user716468

1
Tôi đang sử dụng ZSH và tôi phải trích dẫn @ {- 1} trong dấu ngoặc kép. Nếu không thì git nghẹn ngào:error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git.
Murphy Randle

14
Đây có lẽ là lần đầu tiên một câu trả lời SO khiến tôi mỉm cười không kiểm soát. Nghĩ rằng điều này sẽ khó khăn hơn nhiều!
Owen

25
Kudos thêm cho sư phạm được sử dụng: Hiển thị cơ sở chung, sau đó đề cập đến tốc ký nhỏ gọn nhưng ít chung chung! Tôi thường sử dụng @{u}, đó là nhánh ngược dòng của nhánh hiện tại. Nó rất hữu ích, ví dụ như git log @{u}..liệt kê các cam kết ngược dòng chưa được kéo. Và điều ngược lại git log ..@{u}chỉ là những cam kết cục bộ chưa được thúc đẩy.
Stewohn

208

Cách đơn giản nhất để làm điều này hiện nay là:

git checkout -

... đó là một bí danh của:

git checkout @{-1}

kiểm tra git trừ

Nếu bạn muốn biết thêm về điều này, tôi đã viết toàn bộ bài viết về nó ở đây: Thanh toán Chi nhánh trước trong Git .


3
Hoàn hảo. Tôi đã tìm kiếm cách git để làm điều này là để tôi có thể tạo bí danh chính xác này. Vui mừng khi thấy nó chỉ tồn tại.
Tabitha

3
Có cách nào để liệt kê các nhánh trước mà không cần kiểm tra chúng không?
Erotemia

7
@Erotemia sử dụng bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin

Thật tuyệt vời khi thấy bí danh 'git -' là một điều! Đó chính xác là ux tôi đang tìm kiếm :)
James Tayler

@Erotemia trong powershell nó sẽ được git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . Trong bash, bạn phải viết một cái gì đó tương đương (lấy reflog và lọc nó thành các dòng chứa chuỗi ": checkout:" và sau đó trích xuất tên nhánh). Đây thực sự là những gì git làm
Mariusz Pawelski

28

Như @Karl chỉ ra và từ git checkouthướng dẫn sử dụng:

Trong trường hợp đặc biệt, cú pháp "@ {- N}" cho nhánh cuối cùng của N sẽ kiểm tra nhánh (thay vì tách ra). Bạn cũng có thể chỉ định - đồng nghĩa với "@ {- 1}".

Vì vậy, cả hai git checkout -git checkout @{-1}sẽ làm việc trong trường hợp này

Gần nhất tôi tin là sử dụng git reflogvà phân tích mới nhất moving from branch1 to branch2git checkout branch1


11

Chỉ cần thêm một số chi tiết cho các câu trả lời trước để hiểu cơ chế git checkout @{-N}hoạt động. Nó đi bộ reflog để kiểm tra lịch sử thanh toán, vì vậy nếu bạn muốn tự mình thực hiện một cái gì đó tương tự, bạn có thể phân tích đầu ra của việc git reflogtìm kiếm các checkout:dòng. Bạn có thể kiểm tra việc thực hiện trong nguồn git sha1_name.c, cụ thể là chức năng interpret_nth_prior_checkout.



10

Phiên bản Git đã 2.23giới thiệu git switchlệnh mà bạn có thể sử dụng để làm điều đó (và hơn thế nữa). Trích dẫn tài liệu chính thức:

Chuyển sang một chi nhánh được chỉ định. Cây làm việc và chỉ mục được cập nhật để phù hợp với chi nhánh. Tất cả các cam kết mới sẽ được thêm vào đầu của chi nhánh này.

Trong trường hợp cụ thể của bạn, bạn có thể phát hành git switch -để quay lại chi nhánh mà bạn đã ở trước đó. Bạn có thể thực hiện lại lệnh tương tự để trở về nhánh đầu tiên.

PS Không phải là bạn chưa biết cách làm điều đó (ý tôi là đã 7 năm kể từ khi bạn hỏi câu hỏi này), nhưng lệnh này ít gây nhầm lẫn và thân thiện với người mới bắt đầu vì nó giải quyết một sự nhầm lẫn phổ biến phát sinh khi sử dụng git checkout.


5

Tôi rơi vào câu hỏi này với cùng suy nghĩ để kiểm tra chi nhánh trước đây của tôi. Tôi đang sử dụng ohmyz trong Mac. Lệnh dưới đây đã giúp tôi.

$ gco -
$ git checkout -

Chỉ cần một cái đầu là ohmyz là siêu chậm so với các trình quản lý gói zsh khác. Tôi khuyên bạn nên xem xét về kháng nguyên hoặc zplug .
spex

2
Trong trường hợp không rõ ràng, điều này hoạt động vì plugin Git của Oh My Zsh định nghĩa gcolà một cách viết ngắn git checkout. Vì vậy, gco -chỉ cần gọi git checkout -.
Rory O'Kane

bạn bè của tôi không cần thiết phải giải thích nó git checkout -. cho cập nhật failafe.
Venkat.R

1

Giải pháp phổ biến nhất là:

git checkout @{-N}

Trong đó N - bước đếm của các nhánh để quay lại lịch sử thanh toán.


1

Dưới đây là các gợi ý cho các phần trong tài liệu của Git mô tả git checkout -git checkout @{-1}các giải pháp được đưa ra bởi các câu trả lời khác:

  • Khi chỉ định sửa đổi Git cho bất kỳ lệnh nào @{-<n>}, ví dụ:@{-1} có nghĩa là chi nhánh / cam kết thứ n đã được kiểm tra trước lệnh hiện tại. Tài liệu để git checkout <branch>nhắc lại: Triệu Bạn có thể sử dụng @{-N}cú pháp để tham khảo nhánh / cam kết cuối cùng được kiểm tra bằng cách sử dụng git checkoutthao tác.

  • Đối với <branch>đối số củagit checkout , bạn cũng có thể chỉ định ' -' đồng nghĩa với ' @{-1}'.

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.