Saya ingin membagi komit dan tidak yakin opsi reset mana yang digunakan.
Saya melihat halaman Dalam bahasa Inggris biasa, apa yang dilakukan "git reset"? , tapi saya sadar saya tidak terlalu mengerti apa itu indeks git atau area pementasan dan karenanya penjelasannya tidak membantu.
Juga, kasus penggunaan untuk --mixed
dan --soft
terlihat sama dengan saya dalam jawaban itu (ketika Anda ingin memperbaiki dan komitmen kembali). Bisakah seseorang memecahnya lebih banyak? Saya sadar --mixed
mungkin adalah pilihan untuk pergi, tetapi saya ingin tahu mengapa . Terakhir, bagaimana --hard
?
Dapatkah seseorang memberi saya contoh alur kerja tentang bagaimana memilih 3 opsi akan terjadi?
git
version-control
Michael Chinen
sumber
sumber
soft: stage everything
,mixed: unstage everything
,hard: ignore everything
hingga komit saya ulang dari.David Zych
dengan penjelasan yang jelas - davidzych.com/difference-between-git-reset-soft-mixed-and-hardJawaban:
Saat Anda memodifikasi file di repositori Anda, perubahan itu awalnya tidak dipentaskan. Untuk mengkomitnya, Anda harus mengaturnya — yaitu, menambahkannya ke indeks — menggunakan
git add
. Saat Anda membuat komitmen, perubahan yang dilakukan adalah yang telah ditambahkan ke indeks.git reset
perubahan, minimal, di mana cabang saat ini (HEAD
) menunjuk. Perbedaan antara--mixed
dan--soft
apakah indeks Anda juga dimodifikasi atau tidak. Jadi, jika kita berada di cabangmaster
dengan serangkaian komitmen ini:HEAD
menunjuk keC
dan indeks cocokC
.Ketika kami menjalankan
git reset --soft B
,master
(dan dengan demikianHEAD
) sekarang menunjuk keB
, tetapi indeks masih memiliki perubahan dariC
;git status
akan menampilkannya seperti yang dipentaskan. Jadi jika kita jalankangit commit
pada titik ini, kita akan mendapatkan komit baru dengan perubahan yang sama denganC
.Oke, jadi mulai dari sini lagi:
Sekarang mari kita lakukan
git reset --mixed B
. (Catatan:--mixed
adalah opsi default). Sekali lagi,master
danHEAD
arahkan ke B, tetapi kali ini indeks juga dimodifikasi agar sesuaiB
. Jika kita berlarigit commit
pada titik ini, tidak ada yang akan terjadi sejak indeks cocokHEAD
. Kami masih memiliki perubahan di direktori kerja, tetapi karena mereka tidak ada dalam indeks,git status
menunjukkannya sebagai tidak stage. Untuk mengkomitnya, Anda akangit add
dan kemudian melakukan seperti biasa.Dan akhirnya,
--hard
sama dengan--mixed
(itu mengubahHEAD
indeks Anda dan), kecuali itu--hard
juga memodifikasi direktori kerja Anda. Jika kamiC
menjalankan dan menjalankangit reset --hard B
, maka perubahan yang ditambahkanC
, serta perubahan yang tidak dikomit yang Anda miliki, akan dihapus, dan file dalam copy pekerjaan Anda akan cocok dengan komitB
. Karena Anda dapat secara permanen kehilangan perubahan dengan cara ini, Anda harus selalu menjalankangit status
sebelum melakukan hard reset untuk memastikan direktori kerja Anda bersih atau bahwa Anda baik-baik saja dengan kehilangan perubahan yang tidak dikomit.Dan akhirnya, visualisasi:
sumber
reset --hard
hilang selamanya.--mixed
mengubah indeks Anda tetapi tidak direktori kerja Anda, jadi modifikasi lokal apa pun tidak terpengaruh.- A - B - C′
, di mana C ′ berisi perubahan yang sama seperti C (dengan cap waktu yang berbeda dan mungkin melakukan pesan). 2 dan 4 akan meninggalkan Anda- A - D
, di mana D berisi perubahan gabungan B dan C.Secara sederhana:
--soft
: perubahan tidak berkomitmen , perubahan dibiarkan bertahap ( indeks ).--mixed
(default) : uncommit + unstage changes, perubahan dibiarkan dalam pohon kerja .--hard
: uncommit + unstage + delete changes, tidak ada yang tersisa.sumber
Perlu diketahui, ini adalah penjelasan yang disederhanakan yang dimaksudkan sebagai langkah pertama untuk memahami fungsi yang rumit ini.
Semoga bermanfaat bagi pelajar visual yang ingin memvisualisasikan seperti apa keadaan proyek mereka setelah masing-masing perintah ini:
Bagi mereka yang menggunakan Terminal dengan warna dihidupkan (git config --global color.ui auto):
git reset --soft A
dan Anda akan melihat barang B dan C berwarna hijau (dipentaskan dan siap untuk dikomit)git reset --mixed A
(ataugit reset A
) dan Anda akan melihat barang B dan C berwarna merah (tidak dipentaskan dan siap dipentaskan (hijau) dan kemudian dikomit)git reset --hard A
dan Anda tidak akan lagi melihat perubahan B dan C di mana saja (seolah-olah tidak pernah ada)Atau bagi mereka yang menggunakan program GUI seperti 'Tower' atau 'SourceTree'
git reset --soft A
dan Anda akan melihat barang B dan C di area 'file bertahap' siap untuk dikomitgit reset --mixed A
(ataugit reset A
) dan Anda akan melihat barang-barang B dan C di area 'file tidak dipentaskan' siap dipindahkan ke panggung dan kemudian dilakukangit reset --hard A
dan Anda tidak akan lagi melihat perubahan B dan C di mana saja (seolah-olah tidak pernah ada)sumber
git reset
hanya mengubah tampilangit status
keluaran.Semua jawaban yang lain yang besar, tapi saya merasa terbaik untuk memahami mereka dengan mogok file ke dalam tiga kategori:
unstaged
,staged
,commit
:--hard
harus mudah dimengerti, itu mengembalikan segalanya--mixed
(default) :unstaged
file: jangan diubahstaged
file: pindah keunstaged
commit
file: pindah keunstaged
--soft
:unstaged
file: jangan diubahstaged
file: jangan diubahcommit
file: pindah kestaged
Singkatnya:
--soft
Opsi akan memindahkan semuanya (kecualiunstaged
file) kestaging area
--mixed
Opsi akan memindahkan semuanyaunstaged area
sumber
Berikut adalah penjelasan dasar untuk pengguna TortoiseGit:
git reset --soft
dan--mixed
biarkan file Anda tidak tersentuh.git reset --hard
sebenarnya mengubah file Anda agar sesuai dengan komit yang Anda atur ulang.Dalam TortoiseGit, Konsep indeks sangat disembunyikan oleh GUI. Ketika Anda memodifikasi file, Anda tidak perlu menjalankan
git add
untuk menambahkan perubahan ke area / indeks staging. Ketika hanya berurusan dengan modifikasi file yang ada yang tidak mengubah nama file,git reset --soft
dan--mixed
itu sama! Anda hanya akan melihat perbedaan jika Anda menambahkan file baru atau mengganti nama file. Dalam hal ini, jika Anda menjalankan git reset --mixed, Anda harus menambahkan kembali file Anda dari daftar File Bukan Versi .sumber
--mixed
dan--soft
.Dalam kasus ini saya suka visual yang mudah-mudahan bisa menjelaskan ini:
git reset --[hard/mixed/soft]
:Jadi masing-masing efek lingkup berbeda
sumber
Tiga jenis penyesalan
Banyak jawaban yang ada sepertinya tidak menjawab pertanyaan yang sebenarnya. Mereka adalah tentang apa yang dilakukan perintah, bukan tentang apa yang Anda (pengguna) inginkan - use case . Tapi itu yang ditanyakan OP!
Mungkin lebih bermanfaat untuk menuliskan deskripsi dalam hal apa tepatnya yang Anda sesali pada saat Anda memberi
git reset
perintah. Katakanlah kita punya ini:Berikut adalah beberapa kemungkinan penyesalan dan apa yang harus dilakukan tentang mereka:
1. Saya menyesal bahwa B, C, dan D tidak satu komit.
git reset --soft A
. Saya sekarang dapat langsung melakukan dan presto, semua perubahan sejak A adalah satu komit.2. Saya menyesal bahwa B, C, dan D bukan sepuluh komitmen.
git reset --mixed A
. Komit hilang dan indeks kembali pada A, tetapi area kerja masih terlihat seperti setelah D. Jadi sekarang saya dapat menambahkan-dan-komit dalam pengelompokan yang berbeda.3. Saya menyesal bahwa B, C, dan D terjadi pada cabang ini ; Saya berharap saya bercabang setelah A dan mereka terjadi di cabang lain.
Buat cabang baru
otherbranch
, lalugit reset --hard A
. Cabang saat ini sekarang berakhir pada A, denganotherbranch
berasal dari itu.(Tentu saja Anda juga bisa menggunakan hard reset karena Anda berharap B, C, dan D tidak pernah terjadi sama sekali.)
sumber
Anda tidak perlu memaksakan diri untuk mengingat perbedaan di antara mereka. Pikirkan bagaimana Anda benar-benar membuat komit.
1. Buat beberapa perubahan.
2.git tambahkan.
3.gc -m "Saya Melakukan Sesuatu"
Lembut, Campur dan Keras adalah cara yang memungkinkan Anda untuk menghentikan operasi yang Anda lakukan dari 3 menjadi 1.
Lembut "pura-pura" untuk tidak pernah melihat Anda melakukan "gc -m".
Campur "pura-pura" untuk tidak pernah melihat Anda melakukan "git add."
Sulit "pura-pura" untuk tidak pernah melihat Anda telah membuat perubahan file.
sumber
Sebelum masuk ke tiga opsi ini, seseorang harus memahami 3 hal.
1) Sejarah / KEPALA
2) Tahap / indeks
3) Direktori kerja
reset --soft: Riwayat berubah, KEPALA berubah, Direktori kerja tidak berubah.
reset - dicampur: Sejarah berubah, KEPALA berubah, Direktori kerja berubah dengan data tidak bertahap.
reset --hard: Riwayat berubah, KEPALA berubah, Direktori kerja diubah dengan data yang hilang.
Selalu aman untuk menggunakan Git --soft. Seseorang harus menggunakan opsi lain dalam persyaratan yang kompleks.
sumber
Ada sejumlah jawaban di sini dengan kesalahpahaman tentang
git reset --soft
. Meskipun ada kondisi khusus di managit reset --soft
hanya akan berubahHEAD
(mulai dari keadaan kepala terpisah), biasanya (dan untuk penggunaan yang dimaksudkan), itu memindahkan referensi cabang yang saat ini Anda periksa. Tentu saja tidak dapat melakukan ini jika Anda tidak memiliki cabang diperiksa (maka kondisi khusus di managit reset --soft
hanya akan berubahHEAD
).Saya menemukan ini sebagai cara terbaik untuk dipikirkan
git reset
. Anda tidak hanya bergerakHEAD
( semuanya melakukan itu ), Anda juga memindahkan ref cabang , misalnyamaster
,. Ini mirip dengan apa yang terjadi ketika Anda menjalankangit commit
(cabang saat ini bergerak bersamaHEAD
), kecuali alih-alih membuat (dan pindah ke) komit baru , Anda pindah ke komit sebelumnya .Inilah intinya
reset
, mengubah cabang menjadi sesuatu selain dari komit baru, bukan berubahHEAD
. Anda dapat melihat ini dalam contoh dokumentasi:Apa gunanya rangkaian perintah ini? Anda ingin memindahkan cabang , di sini
master
, jadi saat Andamaster
check out, Anda larigit reset
.Jawaban pilihan teratas di sini umumnya baik, tetapi saya pikir saya akan menambahkan ini untuk memperbaiki beberapa jawaban dengan kesalahpahaman.
Ubah cabang Anda
git reset --soft <ref>
: mengatur ulang penunjuk cabang untuk cabang yang saat ini diperiksa ke komit pada referensi yang ditentukan<ref>
,. File dalam direktori dan indeks kerja Anda tidak berubah. Berkomitmen dari tahap ini akan membawa Anda kembali ke tempat Anda sebelumnyagit reset
perintah.Ubah indeks Anda juga
git reset --mixed <ref>
atau setara
git reset <ref>
:Apakah yang
--soft
dilakukan DAN juga mengatur ulang indeks agar sesuai dengan komit pada referensi yang ditentukan. Sementaragit reset --soft HEAD
tidak melakukan apa-apa (karena dikatakan memindahkan cabang yang diperiksa ke cabang yang diperiksa)git reset --mixed HEAD
,, atau yang setaragit reset HEAD
, adalah perintah yang umum dan berguna karena mengatur ulang indeks ke keadaan komit terakhir Anda.Ubah direktori kerja Anda juga
git reset --hard <ref>
: melakukan apa yang--mixed
dilakukan DAN juga menimpa direktori kerja Anda. Perintah ini mirip dengangit checkout <ref>
, kecuali bahwa (dan ini adalah poin penting tentangreset
) semua bentukgit reset
gerakan yangHEAD
ditunjuk oleh ref cabang .Catatan tentang "perintah ini dan itu menggerakkan HEAD":
Tidak berguna untuk mengatakan perintah memindahkan file
HEAD
. Perintah apa pun yang mengubah posisi Anda di riwayat komit Anda akan memindahkan perintahHEAD
. Itulah yangHEAD
adalah , pointer ke mana pun Anda berada.HEAD
adalah Anda , dan akan bergerak kapan pun Anda melakukannya.sumber
Jawaban singkat dalam konteks apa 3 opsi digunakan:
Untuk menyimpan perubahan saat ini dalam kode tetapi untuk menulis ulang riwayat komit:
soft
: Anda dapat mengkomit semuanya sekaligus dan membuat komit baru dengan deskripsi baru (jika Anda menggunakan torotise git atau sebagian besar GUI lainnya, ini yang digunakan, karena Anda masih dapat mencentang file mana yang Anda inginkan dalam komit dan membuat banyak melakukan itu dengan file yang berbeda. Dalam Sourcetree semua file akan dipentaskan untuk komit.)mixed
: Anda harus menambahkan masing-masing file lagi ke indeks sebelum Anda membuat komitmen (di Sourcetree semua file yang diubah tidak akan dipentaskan)Untuk benar-benar kehilangan perubahan dalam kode juga:
hard
: Anda tidak hanya menulis ulang riwayat tetapi juga kehilangan semua perubahan sampai ke titik yang Anda atur ulangsumber
Perbedaan mendasar antara berbagai opsi perintah git reset adalah seperti di bawah ini.
sumber
--soft
: Memberitahu Git untuk menyetel ulang HEAD ke komit lain, jadi indeks dan direktori kerja tidak akan diubah dengan cara apa pun. Semua file yang diubah antara KEPALA asli dan komit akan dipentaskan.--mixed
: Sama seperti soft, ini akan mengatur ulang HEAD ke komit lain. Ini juga akan mengatur ulang indeks agar sesuai dengan itu sementara direktori kerja tidak akan disentuh. Semua perubahan akan tetap di direktori kerja dan muncul sebagai diubah, tetapi tidak dipentaskan.--hard
: Ini me-reset segalanya - me-reset HEAD kembali ke komit lain, me-reset indeks untuk mencocokkannya, dan me-reset direktori kerja untuk mencocokkannya juga.Perbedaan utama antara
--mixed
dan--soft
apakah indeks Anda juga dimodifikasi. Periksa lebih lanjut tentang ini di sini .sumber
Jawaban mkarasek luar biasa, dalam istilah sederhana dapat kita katakan ...
git reset --soft
: mengaturHEAD
ke komit yang dimaksudkan tetapi pertahankan perubahan Anda dari komitmen terakhirgit reset --mixed
: sama dengangit reset --soft
tetapi satu-satunya perbedaan adalah un stage perubahan Anda dari komit terakhirgit reset --hard
: setel AndaHEAD
di komit yang Anda tentukan dan setel ulang semua perubahan Anda dari komit terakhir termasuk perubahan komit.sumber