Rumah >alat pembangunan >git >Apakah perbezaan antara set semula dan kembalikan dalam git
Perbezaan: 1. Set semula ialah pemulangan semula sepenuhnya kepada versi komit yang ditentukan, dan semua komit selepas komit akan dikosongkan manakala revert hanya membatalkan pengubahsuaian komit yang ditentukan dan tidak menjejaskan komit berikutnya. 2. Tiada rekod akan dijana selepas penetapan semula dilaksanakan, tetapi rekod akan dijana selepas pengembalian dilaksanakan.
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Git 2.30.0, komputer Dell G3.
Git ialah alat pengurusan versi kami yang biasa digunakan Apabila pasukan kami bekerjasama untuk membangunkan projek, pelbagai konflik sering berlaku disebabkan oleh pengubahsuaian dan penyerahan kod dan fail, serta perubahan yang kerap dalam keperluan produk, mengakibatkan Kami mempunyai. untuk membuat keputusan untuk melancarkan semula versi dan menarik balik penyerahan, jadi pada masa ini, arahan tetapan semula dan kembalikan berguna!
Tetapkan semula dan kembalikan kedua-duanya mempunyai maksud membatalkan dan melancarkan semula, tetapi masing-masing mempunyai kelebihan tersendiri dan perbezaannya masih sangat besar , jadi arahan mana yang hendak digunakan mesti diputuskan berdasarkan situasi sebenar. Artikel ini ialah Biarkan semua orang memahami perbezaan antara kedua-duanya, dan kemudian gunakan arahan yang betul dengan tepat dan cepat untuk menyelesaikan masalah praktikal!
下面的例子中,我有3次提交: 初始状态,只有readme一个文件,内容为Creating a new branch is quick. t1提交后状态:只有readme一个文件,内容修改为Creating a new branch is quick 1. t2提交后状态:只有readme一个文件,内容修改为Creating a new branch is quick 1 2. t3提交后状态:新增了test文件.
Artikel ini mengambil git bash sebagai contoh:
Mari kita bincangkan tentang penetapan semula dahulu:
set semula, penggunaan: git reset --hard commit
, komit ialah SHA1 yang dijana selepas penyerahan Selepas melaksanakan arahan ini, kod akan kembali sepenuhnya kepada keadaan penyerahan ini jelas sepenuhnya, termasuk rekod komit!
Contoh:
Projek asal, termasuk fail Readme.txt:
Kandungan fail:
Pada ketika ini saya akan mengubah suai kandungan fail sebagai:
Mencipta cawangan baharu adalah pantas 1.
Jadikan yang pertama penyerahan :
Rekod penyerahan:
Direktori gudang jauh dan kandungan fail yang diserahkan:
Tidak masalah, teruskan mengubah suai kandungan fail: Mencipta cawangan baharu adalah pantas 1 2. dan buat penyerahan kedua:
Sekarang saya akan menambah fail ujian dan membuat penyerahan ketiga:
Baiklah, sekarang keperluan produk telah berubah fungsi baru (pengubahsuaian kedua readme dan fail ujian baharu) tidak diperlukan lagi untuk kembali ke penyerahan pertama "t1". commit to t1 boleh disalin daripada sejarah komit gudang jauh, atau anda boleh melihatnya dengan arahan
:git log
(Petua, jika ":" muncul pada baris terakhir , kemudian masukkan wq untuk keluar dan kembali ke baris arahan )
Salin komit dan laksanakan arahan:
git reset --hard 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
segera, HEAD telah menjadi Points to t1, tetapi apabila anda menyegarkan latar belakang, anda mendapati bahawa tiada perubahan Ini kerana kita masih perlu melakukan push, tetapi apa yang perlu diperhatikan di sini ialah kod tempatan telah dikembalikan versi lama, tetapi gudang jauh adalah versi baharu yang tidak konsisten dengan yang tempatan, jadi anda akan mendapat ralat apabila menggunakan git push Di sini kita perlu menggunakan penyerahan paksa,
, kita juga boleh menggunakan untuk melihat status semasa: git push -f
git status
意思是告诉你,远程仓库代码较新,需要你执行 git pull
操作以同步代码,但这并不是我们的需求,所以我们不用理会,执行,git push -f
:
再看仓库:
历史记录只剩下了t1:
readme内容也得到了恢复:
可见,reset是彻彻底底的回退,该commit之后的所有修改将完全消失,包括提交记录。
优点:
缺点:
再说revert:
revert执行后会产生新的commit记录,是通过一次新的commit来恢复到之前旧的commit,但revert会保留恢复的该次提交后面的其它提交内容,假如后面的提交与要恢复的提交更改了同一地方,此时用revert就会产生冲突!
我们继续以上面的例子为例,我重新执行了t2和t3提交,恢复到reset之前的状态:
此时,我们按reset的思路,使用revert恢复到t1,执行命令:
git revert 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
报错:
提示冲突了?让我们解决掉冲突后提交…
<<<<<<< HEAD Creating a new branch is quick 1 2. ======= Creating a new branch is quick. >>>>>>> parent of 8cbf16c (t1)
上面的冲突表示,当前的内容是:
Creating a new branch is quick 1 2.
而我们要恢复的内容是:
Creating a new branch is quick.
如果对revert命令没有深入了解的话,就可能会产生疑惑,为什么会冲突?而且我实际上是想像reset一样恢复或者说是回退到t1(这里要再次说明一下t1的状态:只有一个readme文件,且内容是Creating a new branch is quick 1),但为什么冲突提示要恢复到Creating a new branch is quick.???这不是初始状态吗?
其实,准确来说,revert是撤销/撤回/反提交的意思,我们不能按reset的思路理解,我们执行git revert t1
,这么做其实结果是要撤销t1的提交,注意,仅仅是撤销t1的提交,把t1的修改恢复到t1之前也就是初始的状态,而不会影响t2,t3的提交。但如果t2,t3中修改了t1修改的同一地方,那么就会产生冲突,因为revert意图撤销t1的修改,但发现t2和t3把t1的修改再次修改了,此时,revert意图变得不清晰,因为它无法确定到底是应用你最新的修改,还是恢复到初始状态,这将由你来决定!
所以我们想要恢复t1的状态,那我们就应该撤销t2对t1的修改git revert t2
:
git revert fc4889dcb327cff9f8078db6a0d5c601b8e91ae9
执行后会自动进入编辑界面:
这里需要我们修改或输入提交日志,按 “i”,进入输入状态,写完后按ESC退出输入状态,再按“:wq”退出!
成功后,执行 git push:
查看仓库后台:
项目目录:
readme内容:
可见,revert操作成功后,产生了新的commit记录,t2对t1的修改已经恢复,现在的readme就是t1提交后的状态,但同时test文件仍然存在,即t3的提交不受影响!
Tetapi jika anda ingin memadamkan penyerahan t2t3 seperti tetapan semula, maka anda boleh kembalikan t3 dahulu, dan kemudian kembalikan t2, yang boleh mencapai kesan yang sama Tetapi dalam kes ini, mengapa tidak menggunakan tetapan semula ? Jika anda ingin mencapai kesan penetapan semula dan juga ingin mempunyai rekod untuk mengelakkan penyesalan, maka ini sahaja. . . Ia satu soalan yang patut difikirkan!
Ringkasan perbezaan antara git reset dan revert:
Petua
: Dalam alat pembangunan IDEA, pilih fail, klik kanan pada pilihan git dan anda akan temui Rollback: Ini perlu dibezakan daripada reset dan revert bukan milik perintah git diubah suai tetapi belum dilakukan Apabila keadaan konsisten dengan kod gudang jauh, anda boleh melakukan operasi rollback!
Pembelajaran yang disyorkan: "Tutorial Git
"
Atas ialah kandungan terperinci Apakah perbezaan antara set semula dan kembalikan dalam git. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!