Bagaimana cara kembali ke versi terbaru di Git?

303

Saya baru saja pindah dari SVN ke Git dan saya sedikit bingung tentang sesuatu. Saya perlu menjalankan versi script sebelumnya melalui debugger, jadi saya melakukan git checkout <previous version hash>dan melakukan apa yang perlu saya lakukan.

Sekarang saya ingin kembali ke versi terbaru, tetapi saya tidak tahu hash untuk itu. Saat saya mengetik git log, saya tidak melihatnya.

Bagaimana saya bisa melakukan ini? Juga, apakah ada cara yang lebih mudah untuk mengubah versi daripada mengetik hash - sesuatu seperti "kembali dua versi" atau "pergi ke yang paling baru secara kronologis"?

Nathan Long
sumber

Jawaban:

371

git checkout masterharus melakukan trik. Untuk kembali dua versi, Anda bisa mengatakan sesuatu seperti git checkout HEAD~2, tetapi lebih baik untuk membuat cabang sementara berdasarkan waktu itu, jadigit checkout -b temp_branch HEAD~2

Ana Betts
sumber
7
Keren! git checkout masterpersis bagaimana saya beralih kembali dari cabang. Jadi apakah itu berarti bahwa ketika saya memeriksa versi sebelumnya, saya pada dasarnya membuat cabang?
Nathan Long
4
@ Nathan: Dalam git cabang sebagian besar benar-benar pointer bergerak ke revisi tertentu. Jadi secara konseptual, Anda semacam membuat cabang, tetapi tidak dalam arti bahwa git memikirkan cabang.
DLH
2
Jadi dalam kasus paling sederhana, di mana saya punya banyak perubahan linier, ketika saya checkout revisi sebelumnya, saya memindahkan pointer HEAD di sana, yang berarti git logakan menampilkan relatif terhadap titik itu? Dan ketika saya checkout master, saya memindahkan pointer ke versi terbaru dari cabang master?
Nathan Long
7
@Nathan: Tepat. KEPALA adalah sesuatu yang disebut simbolis ref - itu umumnya pointer ke ref lain (cabang saat ini memeriksa) git checkoutadalah cara untuk memindahkan KEPALA. Saat Anda melepaskan KEPALA, Anda langsung mengarahkannya ke komit yang diberikan; ketika Anda memeriksa master lagi itu menunjuk kembali ke master. (Dan banyak banyak perintah seperti git logbenar - benar mengambil rentang revisi, yang default ke HEAD.)
Cascabel
3
Yap - HEAD adalah "kata ganti" yang digunakan untuk merujuk ke "Versi kode yang ada di direktori kerja". Ini juga kata ganti untuk "Orang tua dari apa pun yang Anda komit selanjutnya"
Ana Betts
54

Ketika Anda checkout ke komit tertentu, git membuat cabang terpisah. Jadi, jika Anda menelepon:

$ git branch 

Anda akan melihat sesuatu seperti:

* (detached from 3i4j25)
  master
  other_branch

Untuk kembali ke kepala cabang utama, Anda hanya perlu checkout ke cabang utama lagi:

$ git checkout master

Perintah ini secara otomatis akan menghapus cabang yang terlepas.

Jika git checkouttidak berhasil, Anda mungkin telah memodifikasi file yang bertentangan antar cabang. Untuk mencegah Anda kehilangan kode git, Anda harus berurusan dengan file-file ini. Anda memiliki tiga opsi:

  1. Menyimpan modifikasi Anda (Anda dapat mengubahnya nanti):

    $ git stash
    
  2. Buang perubahan yang mengatur ulang cabang yang terlepas:

    $ git reset --hard
    
  3. Buat cabang baru dengan modifikasi sebelumnya dan komit:

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

Setelah ini, Anda dapat kembali ke cabang master Anda (versi terbaru):

$ git checkout master
Thomio
sumber
36

Ini melakukan trik untuk saya (saya masih di cabang utama):

git reset --hard origin/master
averasko
sumber
34
reset --hard adalah kerja keras dan menunjukkan Anda tidak mengetahui modifikasi yang Anda buat. Ini dapat menyebabkan kehilangan kode.
Thomio
1
Dalam kasus saya, saya ingin menyingkirkan perubahan yang dilakukan tanpa sengaja tanpa komitmen. Saya tahu mungkin ada metode lain untuk mencapai itu. Saya setuju jika Anda tidak ingin kehilangan perubahan komitmen yang tidak dicopot, ini adalah kehilangan data.
Csaba Toth
8

Untuk kembali ke versi terbaru:

git checkout <branch-name> 

Misalnya, git checkout masterataugit checkout dev

Reggie Pinkham
sumber
7

Anda dapat memeriksa menggunakan nama cabang, untuk satu hal.

Saya tahu ada beberapa cara untuk memindahkan KEPALA di sekitar, tetapi saya akan menyerahkannya kepada seorang ahli git untuk menghitungnya.

Saya hanya ingin menyarankan gitk --all- saya merasa sangat membantu ketika memulai dengan git.

Jay
sumber
7

Saya baru mulai menggali lebih dalam git, jadi tidak yakin apakah saya mengerti benar, tapi saya pikir jawaban yang benar untuk pertanyaan OP adalah bahwa Anda dapat menjalankan git log --alldengan spesifikasi format seperti ini: git log --all --pretty=format:'%h: %s %d'. Ini menandai versi yang sudah diperiksa saat ini (HEAD)dan Anda dapat mengambil yang berikutnya dari daftar.

BTW, tambahkan alias seperti ini ke Anda .gitconfigdengan format yang sedikit lebih baik dan Anda dapat menjalankan git hist --all:

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

Mengenai versi relatif, saya menemukan posting ini , tetapi hanya berbicara tentang versi yang lebih lama, mungkin tidak ada yang merujuk ke versi yang lebih baru.

haridsv
sumber
6

Beberapa jawaban di sini menganggap Anda berada di cabang master sebelum Anda memutuskan untuk checkout komit yang lebih lama. Ini tidak selalu terjadi.

git checkout -

Akan mengarahkan Anda kembali ke cabang tempat Anda sebelumnya (terlepas apakah itu master atau tidak).

Itai Noam
sumber
Tidak perlu cabang, itu akan menunjuk KEPALA ke tempat itu menunjuk sebelumnya; jika Anda lakukan git checkout hash2setelah git checkout hash1, git checkout -akan membawa Anda kembali ke hash1.
Mikhail Vasin
3

Ketika Anda kembali ke versi sebelumnya,

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

Anda dapat melihat log fitur (hash) dengan perintah ini bahkan dalam situasi ini;

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

master dapat diganti dengan nama cabang lain.

Kemudian checkout, Anda dapat kembali ke fitur.

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

Dengan Git 2.23+ (Agustus 2019), praktik terbaik adalah menggunakan git switchalih-alih perintah yang membingungkangit checkout .

Untuk membuat cabang baru berdasarkan versi yang lebih lama:

git switch -c temp_branch HEAD~2

Untuk kembali ke cabang master saat ini:

git switch master
VONC
sumber
0

Solusi yang lebih elegan dan sederhana adalah menggunakan

git stash

Ini akan kembali ke versi lokal cabang yang paling membenci dan juga menyimpan perubahan Anda di simpanan, jadi jika Anda ingin membatalkan tindakan ini lakukan:

git stash apply
Ilya Gazman
sumber
Saya tahu ini sangat lama tetapi saya harus berkomentar mengenai hal ini (karena saya pikir solusi ini tidak boleh digunakan) - Saya tidak akan menggunakan solusi ini karena tidak menyelesaikan masalah ini tetapi masalah yang berbeda. dengan solusi simpanan ini setiap kali Anda ingin checkout ke komit sebelumnya Anda sebenarnya "menyimpan" data yang sangat tidak perlu untuk kasus ini. Cara yang benar dan lebih elegan adalah (seperti yang dinyatakan sebelumnya) untuk hanya checkout <branch>.
Maayao