Apa perbedaan antara Git Revert, Checkout, dan Reset?

274

Saya mencoba untuk belajar bagaimana untuk mengembalikan atau file rollback dan proyek-proyek ke keadaan sebelumnya, dan tidak memahami perbedaan antara git revert, checkoutdan reset. Mengapa ada 3 perintah berbeda untuk tujuan yang tampaknya sama, dan kapan seseorang harus memilih satu dari yang lain?

Haziz
sumber

Jawaban:

461

Ketiga perintah ini memiliki tujuan yang sepenuhnya berbeda. Mereka bahkan tidak jauh mirip.

git revert

Perintah ini menciptakan komit baru yang membatalkan perubahan dari komit sebelumnya. Perintah ini menambahkan sejarah baru ke proyek (itu tidak mengubah sejarah yang ada).

git checkout

Perintah ini memeriksa konten dari repositori dan meletakkannya di pohon pekerjaan Anda. Itu juga dapat memiliki efek lain, tergantung pada bagaimana perintah itu dipanggil. Misalnya, itu juga dapat mengubah cabang yang sedang Anda kerjakan. Perintah ini tidak membuat perubahan apa pun pada riwayat.

git reset

Perintah ini sedikit lebih rumit. Ini sebenarnya melakukan beberapa hal yang berbeda tergantung pada bagaimana ia dipanggil. Ini memodifikasi indeks (yang disebut "area pementasan"). Atau perubahan yang dilakukan oleh kepala cabang saat ini mengarah ke. Perintah ini dapat mengubah riwayat yang ada (dengan mengubah komit yang direferensikan cabang).

Menggunakan perintah ini

Jika komit telah dibuat di suatu tempat dalam sejarah proyek, dan Anda kemudian memutuskan bahwa komit itu salah dan seharusnya tidak dilakukan, maka itu git revertadalah alat untuk pekerjaan itu. Ini akan membatalkan perubahan yang dilakukan oleh komit buruk, merekam "undo" dalam sejarah.

Jika Anda telah memodifikasi file di pohon kerja Anda, tetapi belum melakukan perubahan, maka Anda dapat menggunakan git checkoutuntuk checkout salinan baru-dari-repositori file.

Jika Anda telah membuat komit, tetapi belum membagikannya dengan orang lain dan Anda memutuskan tidak menginginkannya, maka Anda dapat menggunakannya git resetuntuk menulis ulang sejarah sehingga seolah-olah Anda tidak pernah membuat komit itu.

Ini hanya beberapa skenario penggunaan yang mungkin. Ada perintah lain yang dapat berguna dalam beberapa situasi, dan ketiga perintah di atas memiliki kegunaan lain juga.

Dan Moulding
sumber
13
Jadi tiga perintah dapat digunakan untuk UNDO beberapa pekerjaan, yang berarti mereka tidak begitu "sepenuhnya berbeda". Konsep yang sama, konteks yang berbeda.
Bruno Santos
16
@BrunoSantos: Tempat lilin, pipa timah, belati, dan tali semuanya dapat digunakan untuk membunuh orang, tetapi itu tidak berarti semua hal itu sangat mirip.
Dan Moulding
12
@Dan Mounlding - Sebenarnya, ada banyak kasus di mana git resetdan git checkoutdapat melakukan hal yang persis sama. Mengatakan bahwa mereka "bahkan tidak jauh mirip" bukan hanya berlebihan: itu bahkan tidak benar jauh. Kedua perintah ini dapat melakukan banyak hal yang berbeda, beberapa di antaranya benar-benar tumpang tindih. Contoh: git reset --harddan git checkout -- .akan melakukan hal yang sama persis. Dan berbicara secara logis, git reset --hard <path>dan git checkout <path>juga harus melakukan hal yang persis sama - git namun mencegah Anda melakukan itu. Membingungkan kedua perintah ini SANGAT mudah.
DanGordon
5
@DanGordon Saya menyadari kita mungkin hanya akan memiliki perbedaan pendapat di sini. Meskipun demikian, saya merasa saya harus memberikan beberapa penjelasan. Anda tidak dapat melakukan git reset --hard <path>seperti yang Anda bisa git checkout <path>karena kedua perintah melakukan sesuatu yang sama sekali berbeda. git resetmemberitahu Git untuk memindahkan HEAD ke komit yang berbeda. git checkoutdi sisi lain tidak meminta Git untuk melakukan apa pun dengan KEPALA sama sekali. Itu meninggalkan KEPALA sendirian dan hanya memeriksa file. Ya, Anda dapat membuat mereka sedemikian rupa sehingga mereka memiliki efek yang serupa. Tetapi apa yang sebenarnya mereka lakukan benar - benar berbeda.
Dan Moulding
46

Katakanlah Anda memiliki komitmen:

C
B
A

git revert B, akan membuat komit yang membatalkan perubahan pada B.

git revert A, akan membuat komit yang membatalkan perubahan A, tetapi tidak akan menyentuh perubahanB

Perhatikan bahwa jika perubahan Btergantung pada perubahan A, pengembalian Atidak dimungkinkan.

git reset --soft A, akan mengubah histori komit dan repositori; staging dan direktori kerja masih akan dalam kondisi C.

git reset --mixed A, akan mengubah histori komit, repositori, dan pementasan; direktori kerja masih dalam status C.

git reset --hard A, akan mengubah histori komit, repositori, staging dan direktori kerja; Anda akan kembali ke keadaan Asepenuhnya.

Akavall
sumber
1
Jadi jawaban yang intuitif .. bagaimana kalau checkout
MJ Studio
29
  • git revertdigunakan untuk membatalkan komit sebelumnya. Di git, Anda tidak dapat mengubah atau menghapus komit sebelumnya. (Sebenarnya Anda bisa, tetapi dapat menyebabkan masalah.) Jadi, alih-alih mengedit komit sebelumnya, kembalikan memperkenalkan komit baru yang membalikkan komit sebelumnya.
  • git reset digunakan untuk membatalkan perubahan dalam direktori kerja Anda yang belum dikomit.
  • git checkoutdigunakan untuk menyalin file dari beberapa komit lain ke pohon kerja Anda saat ini. Itu tidak secara otomatis melakukan file.
Jonathan
sumber
7
Saya yakin Anda salah tentang "git reset". "git reset" me-reset KEPALA Anda ke salah satu dari komit sebelumnya, itu tidak mengatur ulang direktori kerja Anda. Direktori kerja "reset" oleh "git checkout [nama file]"
luigi7up
11
git reset --softme-reset HEAD saja, git reset --hardme-reset HEAD dan direktori kerja Anda.
Ehryk
git reset --mixed (default): uncommit + unstage changes
NattyC
21
  • git checkout memodifikasi pohon kerja Anda,
  • git reset memodifikasi referensi cabang mana yang Anda tuju,
  • git revert menambahkan komit untuk membatalkan perubahan.
dan_waterworth
sumber
4
git reset tidak hanya memodifikasi komit yang ditunjuk cabang , itu juga digunakan untuk menghapus file dari indeks, dan dapat memodifikasi copy pekerjaan dengan git reset --mixed(default).
git reset --soft: perubahan tidak komit, perubahan dibiarkan bertahap (indeks). git reset --mixed (default): uncommit + unstage changes, perubahan dibiarkan dalam pohon kerja. git reset --hard: uncommit + unstage + delete changes, tidak ada yang tersisa.
NattyC
6

Reset - Pada level komit, pengaturan ulang adalah cara untuk memindahkan ujung cabang ke komit yang berbeda. Ini dapat digunakan untuk menghapus komit dari cabang saat ini.

Kembalikan - Mengembalikan Membatalkan komit dengan membuat komit baru. Ini adalah cara yang aman untuk membatalkan perubahan, karena tidak memiliki kesempatan untuk menulis ulang riwayat komit. Bandingkan ini dengan git reset, yang mengubah riwayat komit yang ada. Untuk alasan ini, git revert harus digunakan untuk membatalkan perubahan pada cabang publik, dan git reset harus dicadangkan untuk membatalkan perubahan pada cabang pribadi.

Anda dapat melihat tautan ini - Reset, Checkout, dan Kembalikan

Sachchidanand Singh
sumber
5

Jika Anda melanggar pohon tetapi tidak melakukan kode, Anda dapat menggunakan git reset, dan jika Anda hanya ingin mengembalikan satu file, Anda dapat menggunakan git checkout.

Jika Anda memecahkan pohon dan melakukan kode, Anda dapat menggunakan git revert HEAD.

http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html

LostMohican
sumber