Beralih sementara copy pekerjaan ke komit Git tertentu

248

Bagaimana cara beralih ke komit Git tertentu tanpa kehilangan semua komitmen yang dibuat setelah itu ?

Saya ingin bahwa file lokal akan diubah, tetapi database komit akan tetap utuh, hanya pointer posisi saat ini diatur ke komit yang dipilih saat ini.

Saya ingin mengubah status file ke komit tertentu, menjalankan proyek dan, setelah selesai, kembalikan file kembali ke komit terakhir.

Bagaimana melakukan ini tanpa zip folder seluruh proyek?

Paul
sumber

Jawaban:

344

Jika Anda berada di cabang tertentu mybranch, silakan saja dan git checkout commit_hash. Kemudian Anda dapat kembali ke cabang Anda dengan git checkout mybranch. Saya memiliki permainan yang sama membagi dua bug hari ini :) Juga, Anda harus tahu tentang git bisect .

Alexander Pavlov
sumber
6
Catatan yang bisa Anda lakukan git checkout commit_hashjika Anda berada di repositori bersih dan tidak perlu melakukan percabangan. Mungkin lebih mudah untuk beberapa kasus penggunaan (seperti milik saya).
enderland
@enderland: KEPALA Anda selalu menunjuk beberapa cabang, biasanya :)
Alexander Pavlov
Saya memiliki masalah ketika saya harus menggunakan seluruh hash komit karena sebagian tidak diterima.
mightyiam
6
Suara positif untuk git bisectreferensi; alat yang sangat berguna!
Niek
54

Pertama, gunakan git loguntuk melihat log, pilih komit yang Anda inginkan, catat hash sha1 yang digunakan untuk mengidentifikasi komit. Selanjutnya, jalankan git checkout hash. Setelah selesai git checkout original_branch,. Ini memiliki keuntungan karena tidak memindahkan HEAD, itu hanya memindahkan copy pekerjaan ke komit tertentu.

Femaref
sumber
4
Saya pikir maksud Anda git checkout <original_branch>. git checkout HEADsecara efektif adalah NOOP
Abe Voelker
3
git reset --hard <hash>mengubah KEPALA cabang saat ini, sementara dengan git checkout <hash>Anda mendapatkan checkout terpisah yang tidak mengubah cabang apa pun, dan Anda dapat dengan mudah kembali tanpa mengetahui ID hash asli dari cabang Anda seperti yang ditunjukkan dalam jawaban ini.
jofel
@Femaref Pertanyaan Pemula: mengingat konteks pertanyaan ini (beralih ke komit sebelumnya untuk sementara), mengapa akan menguntungkan atau merugikan untuk memindahkan atau tidak memindahkan KEPALA?
gila tentang natty
@nuttyaboutnatty Dengan asumsi edit saya disetujui, itu akan menjawab pertanyaan Anda. HEAD benar-benar tersentuh dalam peristiwa apa pun; tetapi dalam checkout, HEAD referensi cabang menunjuk ke dirinya sendiri tidak dipindahkan.
echristopherson
15

Selain jawaban lain di sini yang menunjukkan kepada Anda bagaimana git checkout <the-hash-you-want>layak Anda tahu Anda dapat kembali ke tempat Anda menggunakan:

git checkout @{-1}

Ini seringkali lebih nyaman daripada:

git checkout what-was-that-original-branch-called-again-question-mark

Seperti yang mungkin Anda antisipasi, git checkout @{-2}akan membawa Anda kembali ke cabang Anda di dua git checkouts lalu, dan sama untuk nomor lainnya. Jika Anda dapat mengingat di mana Anda berada untuk jumlah yang lebih besar, Anda harus mendapatkan semacam medali untuk itu.


Sedih untuk produktivitas, git checkout @{1}tidak membawa Anda ke cabang di mana Anda akan berada di masa depan, yang memalukan.

Benjohn
sumber
1
Perhatikan bahwa itu git checkout -adalah singkatan alias untukgit checkout @{-1}
Nathanael
@Nathanael OMGOD , tidak mungkin ... ini mengubah segalanya! Baik, terima kasih! ... Saya akan memasukkan ini ke dalam jawabannya, tetapi saya pikir ini juga berguna untuk mengetahui tentang @{n}sintaks umum , karena ini bekerja dengan banyak perintah git. Saya merasa sulit untuk menambahkan tulisan cepat tanpa membuat jawaban yang agak membingungkan. Alih-alih, saya memilih komentar Anda - Saya harap orang-orang akan melihatnya. Terima kasih lagi.
Benjohn
1
Tidak masalah. Diskusi ini bersinggungan dengan pertanyaan aktual. Lebih banyak bonus! Saya sering menggunakan sintaks yang sama untuk menggabungkan fitur menjadi rilis. misalnya git merge -untuk menggabungkan cabang yang terakhir Anda periksa ke cabang yang saat ini diperiksa. Seperti cd -di bash.
Nathanael