Apakah ada cara untuk mendapatkan checkout cabang sebelumnya?

703

Saya agak ingin setara cd -dengan git. Jika saya di cabang masterdan saya checkout foo, saya akan senang bisa mengetik sesuatu seperti git checkout -kembali ke master, dan dapat mengetik lagi untuk kembali ke foo.

Apakah ada yang seperti ini? Apakah akan sulit untuk diimplementasikan?

Matt Briggs
sumber
2
Saya ingin mengetikkan panah ATAS untuk menemukan perintah checkout git saya sebelumnya: p
Kit Ho
11
yang melibatkan memindahkan tangan Anda dari posisi rumah, mengetik gc- adalah WAY lebih cepat kemudian menekan sampai Anda menemukan apa yang Anda cari
Matt Briggs
@MattBriggs apakah Anda benar-benar mengetik gc-atau singkatan untukgit checkout -
jewbix.cube
2
@ jewbix.cube Anda perlu belajar tentang alias, baik untuk shell Anda dan untuk git.
Gauthier
@ KitHo: Saya mendapati diri saya ingin melakukan itu terus-menerus, tetapi perintah yang saya inginkan bahkan mungkin tidak ada dalam sejarah jika, misalnya, saya baru saja membuat cabang.
M_M

Jawaban:

1227

Dari catatan rilis untuk 1.6.2

@{-1}adalah cara untuk merujuk ke cabang terakhir yang Anda kunjungi. Ini
diterima tidak hanya di mana nama objek diharapkan, tetapi di mana pun nama cabang diharapkan dan bertindak seolah-olah Anda mengetikkan nama cabang.
Misalnya git branch --track mybranch @{-1},, git merge @{-1}dan
git rev-parse --symbolic-full-name @{-1}akan berfungsi seperti yang diharapkan.

dan

git checkout -adalah singkatan untuk git checkout @{-1}.

Karl Bielefeldt
sumber
46
wow, saya benar-benar harus mencobanya! pikir - adalah shell-isme, dan bahwa jika fungsionalitas dalam git, itu akan menjadi sesuatu yang berbeda
Matt Briggs
9
Ini tidak berfungsi dengan baik ketika Anda checkout komit SHA dua kali, dalam hal ini @ {- 1} menunjuk ke tempat Anda sebelum checkout pertama ..
user716468
1
Saya menggunakan ZSH, dan saya harus membungkus @ {- 1} dengan tanda kutip. Jika tidak, git tersedak: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
Ini mungkin pertama kalinya jawaban SO membuatku tersenyum tak terkendali. Kupikir ini akan jauh lebih sulit!
Owen
25
Pujian ekstra untuk pedagogi yang digunakan: Tunjukkan fasilitas umum, lalu sebutkan singkatan ringkas tapi kurang umum! … Saya cukup sering menggunakan @{u}, yang merupakan cabang hulu dari cabang saat ini. Ini sangat berguna untuk misalnya git log @{u}..yang mendaftar komit upstream yang belum ditarik. Dan kebalikannya git log ..@{u}yang hanya komitmen lokal yang belum didorong.
Benjohn
208

Cara paling sederhana untuk melakukan ini saat ini adalah:

git checkout -

... yang merupakan alias dari:

git checkout @{-1}

git checkout dikurangi

Jika Anda ingin tahu lebih banyak tentang ini, saya menulis seluruh artikel tentang hal ini di sini: Checkout Cabang Sebelumnya Di Git .

marcgg
sumber
3
Sempurna. Saya mencari cara git untuk melakukan ini sehingga saya bisa membuat alias yang tepat ini. Senang melihatnya hanya ada.
Tabitha
3
Apakah ada cara untuk mendaftar cabang sebelumnya tanpa memeriksanya?
Erotemik
7
@Erotemic using bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin
Luar biasa melihat 'git checkout -' alias itu hal! Itu persis ux yang saya cari :)
James Tayler
@Erotemic dalam PowerShell akan git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . Dalam bash Anda harus menulis sesuatu yang setara (dapatkan reflog dan filter ke baris yang berisi string ": checkout:" dan kemudian ekstrak nama cabang). Inilah yang sebenarnya dilakukan git
Mariusz Pawelski
28

Seperti yang ditunjukkan oleh @Karl dan dari git checkoutmanual:

Sebagai kasus khusus, sintaks "@ {- N}" untuk cabang terakhir ke-N memeriksa cabang (alih-alih melepaskan). Anda juga dapat menentukan - yang identik dengan "@ {- 1}".

Jadi keduanya git checkout -dan git checkout @{-1}akan bekerja dalam hal ini

Paling dekat saya percaya menggunakan git reflogdan parse yang terbaru moving from branch1 to branch2dangit checkout branch1

manojlds
sumber
11

Hanya menambahkan beberapa detail pada jawaban sebelumnya untuk memahami mekanisme yang git checkout @{-N}digunakan. Ini berjalan reflog untuk memeriksa sejarah checkout, jadi jika Anda ingin menerapkan sesuatu yang serupa pada Anda sendiri, Anda harus dapat mengurai output git reflogmencari checkout:garis. Anda dapat memeriksa implementasi di sumber git sha1_name.c, khususnya fungsinya interpret_nth_prior_checkout.

ddd
sumber
2
untuk yang malas
Mariusz Pawelski
10

Versi Git 2.23memperkenalkan git switchperintah yang dapat Anda gunakan untuk melakukan itu (dan banyak lagi). Mengutip dokumentasi resmi:

Beralih ke cabang tertentu. Pohon yang bekerja dan indeks diperbarui agar sesuai dengan cabang. Semua komit baru akan ditambahkan ke ujung cabang ini.

Dalam kasus spesifik Anda, Anda dapat mengeluarkan git switch -untuk kembali ke cabang tempat Anda sebelumnya. Anda dapat menjalankan perintah yang sama lagi untuk kembali ke cabang pertama.

PS Bukan berarti Anda belum tahu bagaimana melakukan itu (maksud saya sudah 7 tahun sejak Anda mengajukan pertanyaan ini), tetapi perintah ini kurang membingungkan dan ramah untuk pemula karena membahas kebingungan umum yang muncul saat menggunakan git checkout.

Mike
sumber
5

Saya mendarat ke pertanyaan ini dengan pemikiran yang sama untuk checkout cabang saya sebelumnya. Saya menggunakan ohmyz di Mac. Perintah di bawah ini membantu saya.

$ gco -
$ git checkout -
Venkat.R
sumber
Hanya kepala-up yang ohmyz super lambat dibandingkan dengan manajer paket zsh lainnya. Saya akan merekomendasikan melihat antigen atau zplug .
spex
2
Jika tidak jelas, ini berfungsi karena plugin Oh My Zsh's Git didefinisikan gcosebagai cara penulisan yang singkat git checkout. Jadi gco -telepon saja git checkout -.
Rory O'Kane
offcourse teman saya. tidak perlu dijelaskan git checkout -. untuk failafe diperbarui.
Venkat.R
1

Solusi paling populer adalah:

git checkout @{-N}

Di mana N - langkah menghitung cabang untuk kembali pada sejarah checkout.

Jackkobec
sumber
1

Berikut adalah petunjuk untuk bagian-bagian dokumentasi Git yang menjelaskan git checkout -dan git checkout @{-1}solusi yang diberikan oleh jawaban lain:

  • Ketika menentukan revisi Git untuk perintah apa pun @{-<n>}, mis.@{-1} Berarti " cabang ke- n / komit diperiksa sebelum yang sekarang." Dokumentasi untuk git checkout <branch>mengulangi: "Anda dapat menggunakan @{-N}sintaks untuk merujuk ke cabang terakhir ke-N / komit yang diperiksa menggunakan git checkoutoperasi."

  • Untuk <branch>argumen darigit checkout , "Anda juga dapat menentukan ' -' yang identik dengan ' @{-1}'."

Rory O'Kane
sumber