Mengingat perubahan yang telah dilakukan menggunakan commit
, dan kemudian menggunakan kembali revert
, apa cara terbaik untuk membatalkan pemulihan itu?
Idealnya, ini harus dilakukan dengan komit baru, agar tidak menulis ulang sejarah.
Mengingat perubahan yang telah dilakukan menggunakan commit
, dan kemudian menggunakan kembali revert
, apa cara terbaik untuk membatalkan pemulihan itu?
Idealnya, ini harus dilakukan dengan komit baru, agar tidak menulis ulang sejarah.
Jawaban:
Jika Anda belum mendorong perubahan itu, git reset --hard HEAD^
Kalau tidak, mengembalikan reverting baik-baik saja.
Cara lain adalah dengan git checkout HEAD^^ -- .
dan kemudian git add -A && git commit
.
git cherry-pick
atau sebagai alternatif git revert
adalah cara yang paling mudah untuk mengembalikan sebuah pemulihan.
Otherwise, reverting the revert is perfectly fine.
dan kemudian juga menjelaskan apa yang git checkout HEAD^^ -- .
sedang dilakukan.
git add -A
... kecuali jika Anda ingin menambahkan setiap file ke kontrol versi, yang kemungkinan besar tidak apa yang Anda inginkan.
git cherry-pick <original commit sha>
Akan membuat salinan komit asli, pada dasarnya menerapkan ulang komit
Mengembalikan revert akan melakukan hal yang sama, dengan pesan komit yang berantakan:
git revert <commit sha of the revert>
Salah satu dari cara-cara ini akan memungkinkan Anda untuk git push
tanpa menimpa riwayat, karena itu menciptakan komit baru setelah pengembalian.
Saat mengetik komit sha, Anda biasanya hanya membutuhkan 5 atau 6 karakter pertama:
git cherry-pick 6bfabc
Revert commit sama seperti commit lainnya di git. Artinya, Anda dapat mengembalikannya, seperti pada:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
Itu jelas hanya masuk akal setelah perubahan didorong, dan terutama ketika Anda tidak bisa memaksa mendorong ke cabang tujuan (yang merupakan ide bagus untuk cabang master Anda ). Jika perubahan belum didorong, lakukan saja cherry-pick, kembalikan, atau cukup hapus komit pengembalian sesuai kiriman lainnya.
Di tim kami, kami memiliki aturan untuk menggunakan revert on Revert commit yang dilakukan di cabang utama, terutama untuk menjaga sejarah tetap bersih, sehingga Anda dapat melihat commit mana yang mengembalikan apa:
7963f4b2a9d Revert "Revert "OD-9033 parallel reporting configuration"
"This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
...
a0e5e86d3b6 Revert "OD-9055 paralel reporting configuration"
This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
...
Merge pull request parallel_reporting_dbs to master* commit
'648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'
Dengan cara ini, Anda dapat melacak sejarah dan mencari tahu keseluruhan cerita, dan bahkan mereka yang tidak memiliki pengetahuan tentang warisan dapat mengatasinya sendiri. Sedangkan, jika Anda memilih atau mengganti barang, informasi berharga ini hilang (kecuali Anda memasukkannya dalam komentar).
Jelas, jika suatu komit dikembalikan dan dipulihkan kembali lebih dari sekali, itu menjadi sangat berantakan.
Mengembalikan revert akan melakukan trik
Sebagai contoh,
Jika abcdef
adalah komit dan ghijkl
komit yang Anda miliki saat mengembalikan komit abcdef
, jalankan:
git revert ghijkl
Ini akan mengembalikan revert
Ini terlihat bodoh bagi saya. Tetapi saya telah berada dalam situasi yang sama dan saya kembali untuk komitmen yang dikembalikan. Saya melakukan number reverts jadi saya harus melakukan revert untuk setiap 'reit commit'.
Sekarang sejarah komit saya terlihat sedikit aneh.
Ini adalah proyek kesayangan jadi tidak masalah. Tetapi untuk proyek kehidupan nyata saya akan memberikan preferensi untuk pergi ke komit terakhir sebelum mengembalikan semua kode yang dikembalikan bersama dalam satu komit dan komentar yang lebih masuk akal.
Begini cara saya melakukannya:
Jika cabang my_branchname
dimasukkan dalam gabungan yang bisa dipulihkan. Dan saya ingin membatalkan my_branchname
:
Saya pertama kali melakukan git checkout -b my_new_branchname
dari my_branchname
.
Lalu saya melakukan di git reset --soft $COMMIT_HASH
mana $COMMIT_HASH
hash komit dari komit tepat sebelum komit pertama my_branchname
(lihat git log
)
Kemudian saya membuat komit baru git commit -m "Add back reverted changes"
Kemudian saya mendorong cabang baru git push origin new_branchname
Lalu saya membuat permintaan tarik untuk cabang baru.
Jika Anda tidak menyukai gagasan "reverting a revert" (terutama ketika itu berarti kehilangan informasi riwayat untuk banyak komit), Anda selalu dapat menuju ke dokumentasi git tentang "Reverting a faulty merger" .
Diberikan situasi awal sebagai berikut
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E <-- fixed-up topic branch
(W adalah pengembalian awal Anda dari gabungan M; D dan E adalah perbaikan untuk cabang fitur yang awalnya rusak / komit)
Anda sekarang dapat memutar ulang komit ke A, sehingga tidak satupun dari mereka "milik" gabungan yang dikembalikan:
$ git checkout E
$ git rebase --no-ff P
Salinan baru dari cabang Anda sekarang dapat digabungkan master
lagi:
A'---B'---C'------------D'---E' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E
Untuk mendapatkan kembali perubahan yang tidak dipentaskan dan dipentaskan yang dikembalikan setelah komit:
git reset HEAD@{1}
Untuk memulihkan semua penghapusan yang tidak bertahap:
git ls-files -d | xargs git checkout --