Mempertimbangkan bahwa ada beberapa perintah git yang tidak masuk akal dalam repositori telanjang (karena repositori telanjang tidak menggunakan indeks dan tidak memiliki direktori kerja),
git reset --hard HEAD^
bukanlah solusi untuk membatalkan perubahan terakhir dalam repositori semacam itu.
Mencari melalui Internet, yang dapat saya temukan terkait dengan topik ini adalah ini , di mana saya disajikan tiga cara untuk melakukan ini:
1. "perbarui referensi secara manual (yang melibatkan pipa ledeng)";
2. " git push -f
dari repositori non-telanjang";
3. " git branch -f this $that
".
Solusi mana yang menurut Anda lebih tepat atau cara lain apa yang dapat dilakukan untuk melakukannya? Sayangnya, dokumentasi yang saya temukan tentang repositori git bare cukup buruk.
Jawaban:
Anda bisa menggunakan
git update-ref
perintah. Untuk menghapus komit terakhir, Anda akan menggunakan:Atau jika Anda tidak berada di cabang tempat Anda tidak dapat menghapus komit terakhir:
Anda juga bisa memberikan sha1 jika Anda ingin:
Lihat dokumentasi perintah git-update-ref .
sumber
git update-ref <ref> <newvalue>
menjadi cabang yang benar, seperti "refs / heads / master" alih-alih HEAD, misalnya. Saya harap saya tidak salah paham dengan pertanyaan Anda.branch-name
argumen. Saat menggunakanupdate-ref
dengan "cabang" Anda benar-benar harus menentukan nama referensi lengkap cabang (yaitu, diawalirefs/heads/
dengan nama cabang pendek yang normal). Jika Anda hanya menggunakan nama pendek, Anda akan membuat / memperbarui,$GIT_DIR/branch-name
bukan$GIT_DIR/refs/heads/branch-name
. Adanya keduanyabranch-name
danrefs/heads/branch-name
akan menyebabkan peringatan “refname… is ambiguous”.Jika Anda menggunakan yang berikut ini dalam repo telanjang:
maka Anda tidak mengalami masalah yang Anda gunakan
--hard
dan--mixed
opsi dalam repo telanjang karena Anda tidak mencoba mengubah sesuatu yang tidak dimiliki repo telanjang (yaitu pohon kerja dan indeks). Dalam kasus Anda secara khusus, Anda ingin menggunakan (dari repo telanjang):Untuk mengganti cabang pada repo jarak jauh lakukan:
Untuk melihat penggunaan cabang yang dipilih saat ini:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
sumber
git checkout other_branch
tidak bekerja secara telanjang.The
git push -f
harus bekerja dengan baik:jika Anda clone bahwa repo telanjang, menghapus komit terakhir (
git reset --hard HEAD^
seperti yang Anda sebutkan, tetapi dalam repo non-telanjang lokal) dan mendorong kembali (-f
):sumber
git reset --soft <sha1>
seperti yang ditunjukkan pada jawaban saya di bawah ini tidak menjadi latihan yang disarankan untuk memindahkan HEAD pada repo kosong?reset --soft
harus berfungsi jika dilakukan langsung pada repo kosong. Saya menduga ini jarang dilakukan karena repo telanjang umumnya merupakan repo upstream (yaitu repo tempat Anda mendorong data), dan sebagian besar waktu, Anda tidak memiliki akses lokal langsung ke sana. Tetapi jika Anda melakukannya, maka ini tentunya contoh bagus lainnya darireset --soft
penggunaan " " (seperti dalam stackoverflow.com/questions/5203535/… ) Jadi +1 untuk jawaban Anda.Anda juga dapat menggunakan notasi git refspec dan melakukan sesuatu seperti ini:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
Ini memaksa pembaruan cabang tujuan (sebagaimana dilambangkan dengan ref) ke komit sumber sebagaimana dilambangkan dengan
+<object ref>
bagian.sumber