Apa yang dimaksud dengan git checkout?

96

Apa yang ada checkoutdi git?

Saya tahu begitu Anda melakukannya checkoutke cabang tertentu, HEADpoin ke cabang itu. Tapi apa sebenarnya artinya itu? Apakah itu berarti saya kemudian dapat bekerja di cabang itu? Jika ya, maka, tanpa memeriksa cabang, saya tidak dapat mengerjakannya?

Juga, apa remote checkoutartinya? Bagaimana ini berguna?

daehaai
sumber
1
Tidak ada yang diambil. Ya, saya pernah dan saya menemukan teori tentang apa artinya. yaitu menunjuk ke HEAD dll. Tapi saya ingin tahu dari sudut pandang "kode checkout - buat perubahan - check in" atau apakah berbeda?
daehaai
25
@antonijn - Saya sudah mencoba mencari di Google pertanyaan - ini adalah hasil pertama - agak menyedihkan bahwa begitu saya sampai di sini saya melihat pertanyaan itu ditutup dan sikap gila ini dimiliki semua orang - saya berasal dari latar belakang TFS, dan saya Saya mulai mencurigai "Checkout" berarti sesuatu yang sama sekali berbeda di GIT. Saya ingin tahu apa artinya di git-land.
BrainSlugs83

Jawaban:

60

Seperti yang Anda catat, HEADadalah label yang mencatat di mana Anda berada di pohon komit. Itu bergerak bersama Anda ketika Anda berpindah dari satu komitmen ke komitmen lainnya. git checkout <commit>adalah mekanisme dasar untuk bergerak di sekitar pohon komit, memindahkan fokus Anda ( HEAD) ke komit yang ditentukan.

Komit dapat ditentukan oleh salah satu dari sejumlah cara, melakukan hash, nama cabang, nama tag, sintaks relatif ( HEAD^, HEAD~1, dll) dan sebagainya. Seringkali berguna untuk mempertimbangkan checkout sebagai berganti cabang, dan ada beberapa opsi yang bekerja dari perspektif itu, tetapi semuanya mereferensikan komit.

Untuk menyelesaikan sebuah komit memiliki beberapa pengaruh sisi selain bergerak HEAD.

  • Direktori kerja diperbarui ke status komit yang diperiksa.
  • jika nama cabang ditentukan, checkout membuat cabang itu aktif. Cabang aktif akan bergerak seiring dengan komit baru yang ditambahkan.
    • dengan -bopsi cabang baru akan dibuat berdasarkan komit saat ini dan kemudian dibuat aktif.
    • dengan --trackopsi, cabang yang diperiksa dapat diberi tahu tentang cabang jarak jauh
    • dengan --orphanopsi cabang baru dibuat (seperti dengan -b) tetapi tidak akan didasarkan pada komit yang ada.

Ada beberapa opsi lagi, yang dapat Anda baca di halaman manual git checkout , yang semuanya berputar dari satu komit ke komit lainnya - hanya berbeda dalam efek apa yang dimiliki pemindahan selain pemindahan HEAD.

David Culp
sumber
Jadi, kedengarannya seperti "checkout" berarti sesuatu yang sama sekali berbeda (dibandingkan dengan TFS - padanan TFS akan "mendapatkan" "perubahan" tertentu). Senang saya melihat ini! - apakah ada konstanta ajaib untuk "terbaru"? (di TFS adalah "T") - dengan begitu kita dapat mengunduh kode versi terbaru tanpa mengetahui label "HEAD"?
BrainSlugs83
1
Jika Anda berada di cabang, nama cabang adalah komit terbaru untuk cabang itu - jika Anda tidak berada di cabang, Anda menggunakan komit terbaru. Saya akan menggunakan perintah log untuk menemukan komit terbaru di repositori tanpa memperhatikan cabang dan kemudian secara manual pindah ke sana - tapi saya yakin itu bisa otomatis jika diperlukan.
David Culp
Tentang paragraf terakhir: harap dicatat bahwa git checkout <commit> <path>tidak bertukar cabang.
galath
Penjelasan Anda tidak salah, tapi Anda lupa kasus penggunaan yang sangat penting (dan berpotensi berbahaya): git checkout <path>.
Eric Duminil
24

Izinkan saya menjelaskan beberapa kasus penggunaan checkout dengan file, folder dan cabang sehingga dapat membantu dalam memahami.

Katakanlah kita memiliki folder bernama devdan index.htmljuga Semuanya dilacak dan direktori kerja bersih.

Jika saya tidak sengaja mengubah nama file index.htmldan saya ingin membatalkannya, saya hanya akan menggunakannya git checkout index.htmluntuk memulihkan status file tersebut dari repositori cabang yang saat ini dipilih.

Sekarang jika saya membuat beberapa perubahan di devfolder dan ingin memulihkannya. Saya dapat menggunakan git checkout devtetapi bagaimana jika sudah ada cabang yang bernama devdaripada memeriksa folder itu, itu akan menarik cabang itu. Untuk menghindari itu saya lebih suka melakukannya git checkout -- dev.

Sekarang di sini tanda hubung ganda telanjang adalah singkatan dari cabang saat ini dan meminta git untuk folder devdari cabang yang saat ini dipilih.

Demikian pula Jika saya melakukannya git checkout alpha devakan menurunkan folder dev dari cabang alpha.

Jawaban ini untuk pertanyaan pertama Anda 'git checkout really mean'.

bawa g
sumber
2
Di baris terakhir Anda, jawaban ini untuk pertanyaan pertama Anda 'git checkout really mean'. apakah Anda memeriksa folder 'benar-benar' dari cabang 'jahat': P
Paramvir Singh Karwal
22

"Untuk memeriksa" berarti Anda mengambil komit yang diberikan dari repositori dan membuat ulang status file terkait dan pohon direktori di direktori kerja.

Ketika Anda memeriksa komit yang bukan merupakan kepala cabang (misalnya git checkout HEAD~2), Anda berada pada apa yang disebut kepala terpisah . Anda dapat membuat komit di sini, tetapi begitu Anda beralih ke cabang lain, komit tersebut tidak akan dapat dipulihkan oleh nama cabang dan bahkan mungkin dihapus oleh pengumpul sampah setelah beberapa waktu.

Michael Wild
sumber