Bagaimana cara kembali ke komit terbaru setelah memeriksa komit sebelumnya?

477

Kadang-kadang saya memeriksa beberapa versi kode untuk diperiksa atau diuji. Saya telah melihat instruksi tentang apa yang harus dilakukan jika saya ingin memodifikasi komit sebelumnya - tetapi anggap saya tidak melakukan perubahan. Setelah saya selesai mis. git checkout HEAD^, Bagaimana saya kembali ke ujung cabang? .. git logtidak lagi menunjukkan SHA dari komit terbaru.

Leo Alekseyev
sumber
11
Mengenai git logkalimat pertanyaan Anda, Anda selalu dapat menjalankan git log --all(atau lebih bermanfaat, git log --oneline --graph --all).
Wildcard

Jawaban:

606

Jika Anda tahu komit yang ingin Anda kembalikan adalah kepala cabang tertentu, atau ditandai, maka Anda bisa saja

git checkout branchname

Anda juga dapat menggunakan git refloguntuk melihat apa yang dilakukan orang lain terhadap KEPALA Anda (atau referensi lainnya) sebelumnya.


Diedit untuk menambahkan:

Di versi Git yang lebih baru, jika Anda hanya berlari git checkoutatau sesuatu yang lain untuk memindahkannya HEAD, Anda juga dapat melakukannya

git checkout -

untuk beralih kembali ke tempat itu sebelum checkout terakhir. Ini dimotivasi oleh analogi dengan idiom shell cd -untuk kembali ke direktori kerja apa pun yang sebelumnya ada.

Phil Miller
sumber
27
Saya ingin menyebutkan bahwa contoh khasnya adalah "git checkout master". Salah satu kesulitan yang saya pelajari untuk menggunakan git adalah tidak mengetahui kata kunci spesifik apa (mis. "Master") yang sebenarnya bisa saya gantikan dengan kata-kata placeholder seperti "branchname".
AbePralle
3
mastersebenarnya bukan kata kunci apa pun, tapi caranya HEAD. Itu hanya nama cabang default di repositori baru. Anda dapat menjalankan git branchuntuk mendapatkan daftar cabang di repositori Anda, dan git tag -luntuk daftar tag. Demikian pula, originadalah nama default remote yang replikasi kloning, tetapi tidak ada yang istimewa tentang itu.
Phil Miller
3
Jika tidak jelas, git reflogberi Anda daftar hash, yang bisa Anda gunakan git checkout [commit-hash].
jbnunn
Saya menghapus file dan mencoba perintah, tetapi itu tidak sepenuhnya mengatur ulang. Pertama-tama, ini bukan rekursif. Kemudian ketika saya mencoba ini pada file yang saya hapus, git kemudian memberi tahu saya bahwa HEAD terlepas. Apa yang harus dilakukan?
Daniel S.
1
@DanielS .: Pertanyaan dan jawaban saya adalah tentang komit , saat Anda berbicara tentang file. Git memperlakukan mereka agak berbeda.
Phil Miller
27

git checkout master

master adalah tip, atau commit terakhir. gitk hanya akan menunjukkan kepada Anda di mana Anda berada di pohon pada saat itu. git reflog akan menampilkan semua commit, tetapi dalam hal ini, Anda hanya menginginkan tipnya, jadi git checkout master.

Bruce Wells
sumber
1
Ini. Ataugit checkout branchname
Alex
19

Datangi pertanyaan ini sekarang dan ada sesuatu untuk ditambahkan

Untuk membuka komit terbaru:

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

Penjelasan:

git log --branchesmemperlihatkan log komit dari semua cabang lokal
-1membatasi satu komit →
--pretty=format:"%H"format komit terkini untuk hanya menampilkan komit yang
git checkout $(...)menggunakan output subkulit sebagai argumen untuk checkout

catatan:

Ini akan menghasilkan kepala terpisah (karena kami checkout langsung ke komit). Ini dapat dihindari dengan mengekstraksi nama cabang menggunakan sed, dijelaskan di bawah ini.


Untuk pergi ke cabang komit terbaru:

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

Penjelasan:

git log --branchesmemperlihatkan log komit dari semua cabang lokal
-1membatasi hingga satu commit →
--pretty=format:"%D"format commit terbaru untuk hanya menampilkan nama ref
| sed 's/.*, //g' - referensi abaikan semua kecuali yang terakhir dari beberapa referensi (*)
git checkout $(...) menggunakan output dari subkulit sebagai argumen untuk checkout

*) KEPALA dan cabang jarak jauh didaftar pertama, cabang lokal terdaftar terakhir dalam urutan abjad, sehingga yang tersisa akan menjadi nama cabang menurut abjad pertama

catatan:

Ini akan selalu hanya menggunakan nama cabang pertama (alfabet) jika ada beberapa untuk komit itu.


Bagaimanapun, saya pikir solusi terbaik hanya akan menampilkan nama-nama referensi untuk komit terbaru untuk mengetahui ke mana harus checkout:

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

Misalnya buat alias git topuntuk perintah itu.

816-8055
sumber
1
Entah bagaimana saya melakukan kesalahan pada perintah kedua ... Memperbaikinya, sekarang akan benar memeriksa Anda dari cabang komit terbaru.
816-8055
Bash / zsh alias untuk perintah untuk kembali kembali ke kepalaalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel
9

Lihatlah GUI grafis ... gitkini menunjukkan semua commit. Terkadang lebih mudah untuk bekerja secara grafis ... ^^

tanascius
sumber
ya, ini sebenarnya bagaimana saya melakukannya di masa lalu - tetapi saya tidak memiliki GUI yang tersedia saat ini
Leo Alekseyev
7

Anda dapat menggunakan salah satu dari perintah git berikut untuk ini:

git checkout master
git checkout branchname
hothead1000
sumber
4

tunjukkan semua cabang dan komit
git log - cabang --oneline

tampilkan komit terakhir
git log - cabang -1 --oneline

tampilkan sebelum komit terakhir
git log --branches -2 --oneline

abdesselam
sumber
Apakah perintah pertama benar-benar melakukan kode apa yang saat ini dipentaskan, atau saya salah membaca ini?
Lazerbeak12345
3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>
Atif Majeed
sumber
0

Jika Anda memiliki cabang yang berbeda dari master, salah satu cara mudah adalah dengan memeriksa cabang itu, lalu periksa master. Voila, kau kembali di ujung tuan. Mungkin ada cara yang lebih cerdas ...

ConorR
sumber
0

Anda cukup melakukannya git pull origin branchname. Ini akan mengambil komit terbaru lagi.

Ankit Singh
sumber
Saya tidak merekomendasikan ini jika Anda tidak ingin menarik dari hulu. Seseorang harus menangani konflik gabungan hanya ketika mereka siap.
Lazerbeak12345
Nah, dalam hal itu, kepala akan tetap terlepas bahkan jika Anda checkout ke komit terbaru.
Ankit Singh
-2

Jika komit terbaru Anda ada di cabang master, Anda bisa menggunakan

git checkout master
Jackie Xu
sumber