Saya selalu memikirkan git reset
dan git checkout
sama, dalam arti bahwa keduanya membawa proyek kembali ke komitmen tertentu. Namun, saya merasa mereka tidak bisa persis sama, karena itu akan berlebihan. Apa perbedaan yang sebenarnya antara keduanya? Saya agak bingung, karena svn hanya svn co
perlu mengembalikan komit.
TAMBAH
VonC dan Charles menjelaskan perbedaan antara git reset
dan git checkout
sangat baik. Pemahaman saya saat ini adalah bahwa git reset
mengembalikan semua perubahan kembali ke komit tertentu, sedangkan git checkout
kurang lebih mempersiapkan cabang. Saya menemukan dua diagram berikut cukup berguna untuk sampai pada pemahaman ini:
TAMBAH 3
Dari http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html , checkout dan reset dapat ditiru rebase itu.
git checkout bar
git reset --hard newbar
git branch -d newbar
sumber
-- files
varian; Saya tidak yakin.) Diagram yang membuatnya tampak seperti perbedaan utama adalah apakah mereka mempengaruhi indeks atau WD. Lihat jawaban saya tentang itu. Diagram 2 dan 3 sangat membantu untuk melihat perbedaan nyata. Diagram ke-4 dan ke-5 berguna untuk memeriksa apakah Anda memahami apa yang dilakukan perintah-perintah ini, tetapi tidak akan benar-benar membantu Anda sampai di sana.think-like-a-git.net
artikel yang ditautkan ) diperlukan untuk mencegah hilangnya data.Jawaban:
git reset
secara khusus tentang memperbarui indeks , memindahkan HEAD.git checkout
adalah tentang memperbarui pohon kerja (ke indeks atau pohon yang ditentukan). Ini akan memperbarui KEPALA hanya jika Anda checkout cabang (jika tidak, Anda berakhir dengan KEPALA terpisah ).(sebenarnya, dengan Git 2.23 Q3 2019, ini akan
git restore
, belum tentugit checkout
)Sebagai perbandingan, karena svn tidak memiliki indeks, hanya pohon yang berfungsi,
svn checkout
akan menyalin revisi yang diberikan pada direktori terpisah.Setara lebih dekat untuk
git checkout
akan:svn update
(jika Anda berada di cabang yang sama, artinya URL SVN yang sama)svn switch
(jika Anda checkout misalnya cabang yang sama, tetapi dari URL repo SVN lain)Ketiga modifikasi pohon mereka yang bekerja (
svn checkout
,update
,switch
) hanya memiliki satu perintah dalam git:git checkout
.Tetapi karena git juga memiliki gagasan tentang indeks ("area pementasan" antara repo dan pohon yang bekerja), Anda juga memilikinya
git reset
.Thinkeye menyebutkan dalam komentarnya artikel " Reset Demystified ".
Namun pada poin-poin tersebut:
LarsH menambahkan dalam komentar :
De Novo setuju dalam komentar :
sumber
git reset
adalah tentang memodifikasi "label" cabang dan secara opsional memperbarui indeks atau pohon kerja sebagai efek samping.git checkout
adalah tentang memperbarui pohon kerja dan beralih cabang "terpilih" saat iniHEAD
.git reset
100% tentangHEAD
. Ia bekerja bahkan dalam mode HEAD yang terlepas ( stackoverflow.com/a/3965714/6309 ), artinya di mana tidak ada cabang (!). git checkout juga berfungsi dalam mode HEAD terpisah, atau dapat digunakan untuk checkout SHA1 dalam mode HEAD terpisah: sekali lagi tidak ada cabang yang terlibat dalam kasus itu.git checkout a839e8f
memperbarui KEPALA untuk menunjuk untuk melakukana839e8f
.Dalam bentuknya yang paling sederhana,
reset
reset indeks tanpa menyentuh pohon yang bekerja, sementaracheckout
mengubah pohon yang bekerja tanpa menyentuh indeks.Atur ulang indeks untuk mencocokkan
HEAD
, pohon yang bekerja dibiarkan sendirian:Secara konseptual, ini memeriksa indeks ke pohon kerja. Agar benar-benar melakukan apa pun yang harus Anda gunakan
-f
untuk memaksanya untuk menimpa perubahan lokal. Ini adalah fitur keselamatan untuk memastikan bahwa bentuk "tidak ada argumen" tidak merusak:Setelah Anda mulai menambahkan parameter memang benar bahwa ada beberapa tumpang tindih.
checkout
biasanya digunakan dengan cabang, tag atau komit. Dalam hal ini akan meresetHEAD
dan indeks ke komit yang diberikan serta melakukan checkout dari indeks ke pohon kerja.Juga, jika Anda memasok
--hard
kereset
Anda dapat memintareset
untuk menimpa pohon kerja serta mengatur ulang indeks.Jika Anda saat ini memiliki cabang yang diperiksa, ada perbedaan penting antara
reset
dancheckout
ketika Anda memasok cabang alternatif atau komit.reset
akan mengubah cabang saat ini ke titik di komit yang dipilih sedangkancheckout
akan meninggalkan cabang saat ini tetapi akan checkout cabang yang disediakan atau komit sebagai gantinya.Bentuk lain dari
reset
dancommit
melibatkan jalur penyediaan.Jika Anda memberikan jalur kepada
reset
Anda tidak dapat menyediakan--hard
danreset
hanya akan mengubah versi indeks dari jalur yang disediakan ke versi di komit yang disediakan (atauHEAD
jika Anda tidak menentukan komit).Jika Anda menyediakan jalur untuk
checkout
, sepertireset
itu akan memperbarui versi indeks dari jalur yang disediakan untuk mencocokkan komit yang disediakan (atauHEAD
) tetapi itu akan selalu checkout versi indeks dari jalur yang disediakan ke pohon kerja.sumber
Satu kasus penggunaan sederhana ketika mengembalikan perubahan:
1. Gunakan reset jika Anda ingin membatalkan pementasan file yang dimodifikasi.
2. Gunakan checkout jika Anda ingin membuang perubahan pada file yang tidak dipentaskan.
sumber
Perbedaan utama dalam singkatnya adalah bahwa
reset
memindahkan referensi cabang saat ini , sementaracheckout
tidak (itu bergerak KEPALA).Seperti yang dijelaskan buku Pro Git di bawah Reset Demystified ,
Lihat juga jawaban VonC untuk kutipan teks dan diagram yang sangat membantu dari artikel yang sama, yang tidak akan saya tiru di sini.
Tentu saja ada lebih banyak rincian tentang apa efek
checkout
danreset
dapat memiliki pada indeks dan pohon bekerja, tergantung pada apa parameter yang digunakan. Mungkin ada banyak persamaan dan perbedaan antara kedua perintah. Tetapi seperti yang saya lihat, perbedaan yang paling penting adalah apakah mereka memindahkan ujung cabang saat ini.sumber
Dua perintah (reset dan checkout) sangat berbeda.
checkout X
TIDAKreset --hard X
Jika X adalah nama cabang,
checkout X
akan mengubah cabang saatreset --hard X
ini sementara tidak.sumber
mnemonik singkat:
sumber