Git, saya ingin membatalkan semuanya! Perintah koreksi kesalahan

gambar



Git adalah sistem yang praktis namun rumit. Kesulitannya, pertama-tama, adalah bahwa melalui kecerobohan Anda bisa membuat kesalahan, yang kemudian sulit atau bahkan tidak mungkin untuk diperbaiki. Dokumentasi Git memberikan penjelasan tentang banyak perintah untuk membantu Anda memperbaiki bug.



Tetapi masalahnya, untuk memperbaiki masalah, Anda perlu mengetahui nama perintah yang tepat. Dan di sini kita memiliki masalah ayam dan telur yang khas. Artikel ini menjelaskan perintah yang membantu Anda memecahkan situasi masalah.



Sial, aku melakukan sesuatu yang salah. Beri aku mesin waktu ajaib!



git reflog
# you will see a list of every thing you've
# done in git, across all branches!
# each one has an index HEAD@{index}
# find the one before you broke everything
git reset HEAD@{index}
# magic time machine
      
      





gambar



Perintah ini memungkinkan Anda memulihkan data yang tidak sengaja terhapus dengan mengembalikan penggabungan yang menyebabkan masalah. refLog sangat sering digunakan - ucapkan terima kasih karena telah menyarankan untuk menambahkan perintah ini.



Saya membuat komit, tetapi segera menyadari ada kesalahan, itu perlu diperbaiki!



# make your change
git add . # or add individual files
git commit --amend --no-edit
# now your last commit contains that change!
# WARNING: never amend public commits
      
      





Perintah tersebut memungkinkan untuk memperbaiki hal-hal kecil yang tidak menyenangkan - ketika Anda melakukan sesuatu, dan kemudian melihat masalah seperti spasi yang hilang setelah tanda "=". Ya, dimungkinkan untuk membuat perubahan dengan komit baru dengan menggabungkan keduanya dengan rebase -i. Tapi jalannya masih panjang.



NB! Jangan pernah mengubah komit di cabang publik. Gunakan perintah hanya untuk komit di cabang lokal, jika tidak, Anda akan mengalami masalah.



Saya ingin mengubah pesan dari komit terakhir!



git commit --amend
# follow prompts to change the commit message
      
      





Itu hanya ... persyaratan posting yang bodoh.



Saya tidak sengaja berkomitmen untuk menjadi master, meskipun seharusnya di cabang baru!



# create a new branch from the current state of master
git branch some-new-branch-name
# remove the last commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# your commit lives in this branch now :)
      
      





Jika Anda sudah berkomitmen ke utas publik, perintah tidak akan berfungsi. Dalam kasus ini, git reset HEAD @ {tentukan jumlah komit yang akan dikembalikan}, bukan HEAD ~.



Ya, saya salah berkomitmen ke cabang yang salah



# undo the last commit, but leave the changes available
git reset HEAD~ --soft
git stash
# move to the correct branch
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here";
# now your changes are on the correct branch
      
      





Ada cara lain yang digunakan banyak developer untuk menggunakan cherry-pick.



git checkout name-of-the-correct-branch
# grab the last commit to master
git cherry-pick master
# delete it from master
git checkout master
git reset HEAD~ --hard
      
      





Saya perlu menjalankan diff, tetapi tidak ada yang berhasil.



Jika Anda yakin bahwa perubahan telah dilakukan, tetapi diff kosong, mungkin Anda mengindeks perubahan melalui add. Karena itu, ada baiknya menggunakan bendera khusus.



git diff --staged



Secara umum, ini bukan bug, tetapi fitur, tetapi sangat jelas Β― \ _ (ツ) _ / Β―



Saya sangat ingin membatalkan komit yang dibuat 5 komit yang lalu



# find the commit you need to undo
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git revert [saved hash]
# git will create a new commit that undoes that commit
# follow prompts to edit the commit message
# or just save and commit
      
      





Untungnya, Anda tidak perlu mengembalikan 5 komit dengan menyalin dan menempelkan file lama dan baru. Anda dapat membatalkan semua ini dengan pengembalian.



Selain itu, Anda tidak hanya dapat melakukan rollback pada komit, tetapi juga seluruh file. Benar, ini sudah menjadi perintah lain ...



Batalkan perubahan dalam file



Dan ini dia, perintah lainnya ini.



# find a hash for a commit before the file was changed
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git checkout [saved hash] -- path/to/file
# the old version of the file will be in your index
git commit -m "Wow, you don't have to copy-paste to undo"
      
      





Ketika saya pertama kali menemukan kesempatan ini, itu COOL, COOL, K-R-U-T-O. Tetapi jika Anda memikirkannya - mengapa checkout adalah opsi terbaik untuk membuang perubahan dalam file? : shakes-fist-at-linus-torvalds:



Semuanya, saya menyerah



cd ..
sudo rm -r fucking-git-repo-dir
git clone https://some.github.url/fucking-git-repo-dir.git
cd fucking-git-repo-dir
      
      





Terima kasih kepada Eric V. Untuk metode ini. Dan sampaikan semua keluhan tentang penggunaan sudo kepadanya.



Jika Anda perlu menghilangkan perubahan dan mengembalikan sepenuhnya ke versi aslinya, Anda dapat mencoba melakukannya. Tapi ingat - perintah ini merusak dan tidak bisa diubah.



# get the lastest state of origin
git fetch origin
git checkout master
git reset --hard origin/master
# delete untracked files and directories
git clean -d --force
# repeat checkout/reset/clean for each borked branch
      
      





Perhatian! Artikel ini tidak dimaksudkan sebagai panduan komprehensif. Dan ya, ada cara lain untuk melakukan hal yang sama, dan bahkan lebih baik. Tapi saya menemukan opsi ini dengan coba-coba. Kemudian saya mendapat ide gila untuk membagikan temuan saya. Ambil atau pergi!



gambar



Komentar ahli



Daniil Pilipenko , direktur pusat perekrutan spesialis TI di SymbioWay dan penginjil backend universitas online Skillbox, menambahkan pendapatnya tentang Git dan relevansinya bagi pengembang.



Git muncul pada tahun 2005, dan butuh waktu lama untuk mengambil alih pasar. Saya ingat ketika kami menerapkan SVN di tim pengembangan pada tahun 2008. Dan bahkan pada tahun 2012, sebuah perusahaan yang dekat dengan saya menerapkan Mercurial dengan gencar. Selama bertahun-tahun, telah menjadi jelas bagi banyak orang bahwa Git adalah sistem kontrol versi terbaik dan sekarang digunakan oleh hampir semua pengembang.



Jika Anda seorang pengembang pemula yang ingin melamar pekerjaan, pastikan untuk mempelajari Git! Anda harus tahu apa itu sistem kontrol versi dan mengapa itu diperlukan, apa itu komit, cabang, bagaimana mengkloning repositori dan mengirim perubahan yang dibuat ke server, bagaimana mendapatkan perubahan baru dari server, bagaimana menggabungkan, jenis β€œreset” apa yang ada di sana. Pada awalnya, topik ini mungkin tampak tidak dapat dipahami dan sulit bagi Anda, tetapi Anda hanya perlu membiasakan diri menggunakan Git, dan Anda tidak akan dapat menghentikannya.



All Articles