Di Git, saya mencoba melakukan squash commit
dengan menggabungkan cabang lain dan mengatur ulang HEAD
ke tempat sebelumnya melalui:
git reset origin/master
Tapi saya harus keluar dari sini. Bagaimana saya bisa memindahkan HEAD kembali ke lokasi sebelumnya?
Saya memiliki fragmen SHA-1 ( 23b6772
) dari commit yang saya perlukan untuk memindahkannya. Bagaimana saya bisa kembali ke komitmen ini?
git
git-checkout
git-reset
git-revert
git-reflog
timpone
sumber
sumber
git checkout 23b6772
harus dilakukan.Jawaban:
Sebelum menjawab, mari kita tambahkan beberapa latar belakang, menjelaskan apa ini
HEAD
.First of all what is HEAD?
HEAD
hanyalah referensi ke komit saat ini (terbaru) di cabang saat ini.Hanya ada satu
HEAD
pada waktu tertentu (tidak termasukgit worktree
).Konten
HEAD
disimpan di dalam.git/HEAD
dan berisi 40 byte SHA-1 dari komit saat ini.detached HEAD
Jika Anda tidak menggunakan komit terbaru - artinya
HEAD
menunjuk komit sebelumnya dalam sejarah, itu disebutdetached HEAD
.Pada baris perintah, akan terlihat seperti ini - SHA-1 bukan nama cabang karena
HEAD
tidak menunjuk ke ujung cabang saat ini:Beberapa opsi tentang cara memulihkan dari HEAD yang terpisah:
git checkout
Ini akan mengecek cabang baru yang menunjuk ke komit yang diinginkan.
Perintah ini akan checkout ke komit yang diberikan.
Pada titik ini, Anda dapat membuat cabang dan mulai bekerja sejak saat ini.
git reflog
Anda selalu dapat menggunakan itu
reflog
juga.git reflog
akan menampilkan perubahan apa pun yang memperbaruiHEAD
dan memeriksa entri reflog yang diinginkan akan mengaturHEAD
kembali komitmen ini.Setiap kali KEPALA diubah akan ada entri baru di
reflog
Ini akan membuat Anda kembali ke komit yang Anda inginkan
git reset --hard <commit_id>
"Pindahkan" KEPALA Anda kembali ke komit yang diinginkan.
git rebase --no-autostash
.git revert <sha-1>
"Undo" rentang komit atau komit yang diberikan.
Perintah reset akan "membatalkan" setiap perubahan yang dilakukan pada komit yang diberikan.
Komit baru dengan undo patch akan dilakukan sementara komit asli akan tetap ada dalam sejarah juga.
Skema ini menggambarkan perintah mana melakukan apa.
Seperti yang Anda lihat di sana,
reset && checkout
ubahHEAD
.sumber
Melakukan
Untuk melihat apakah Anda berada di posisi yang tepat:
Anda akan melihat sesuatu
Kemudian tulis ulang riwayat di remote Anda untuk mencerminkan perubahan:
sumber
git push --force
. Dalam banyak situasi itu akan membuat Anda menjadi orang yang paling tidak populer di tim untuk sementara waktu ....git push --force-with-lease
(artikel Thoughtbot: thoughtbot.com/blog/git-push-force-with- please )revert
komitmen, saya mendapati diri saya dalam situasi yang sangat sulit.force-with-lease
memberi saya kepercayaan diri untuk menulis ulang sejarah git dari cabang tanpa mempengaruhi pekerjaan orang lain. bravo!Solusi tercepat yang mungkin (hanya 1 langkah)
Menggunakan
git checkout -
Kamu akan lihat
Switched to branch <branch_name>
. Konfirmasikan itu cabang yang Anda inginkan.Penjelasan singkat: perintah ini akan memindahkan HEAD kembali ke posisi terakhirnya. Lihat catatan tentang hasil di akhir jawaban ini.
Mnemonic: pendekatan ini sangat mirip dengan menggunakan
cd -
untuk kembali ke direktori yang Anda kunjungi sebelumnya. Sintaks dan kasus yang berlaku adalah kecocokan yang cukup baik (misalnya, berguna ketika Anda benar-benar ingin HEAD kembali ke tempat sebelumnya).Solusi yang lebih metodis (2 langkah, tapi mudah diingat)
Pendekatan cepat memecahkan pertanyaan OP. Tetapi bagaimana jika situasi Anda sedikit berbeda: katakanlah Anda telah memulai ulang Bash kemudian menemukan diri Anda dengan KEPALA terlepas. Dalam hal ini, berikut adalah 2 langkah sederhana, mudah diingat.
1. Pilih cabang yang Anda butuhkan
Menggunakan
git branch -v
Anda melihat daftar cabang lokal yang ada. Ambil nama cabang yang sesuai dengan kebutuhan Anda.
2. Pindahkan KEPALA untuk itu
Menggunakan
git checkout <branch_name>
Kamu akan lihat
Switched to branch <branch_name>
. Keberhasilan!Hasil
Dengan metode mana pun, sekarang Anda dapat terus menambahkan dan melakukan pekerjaan Anda seperti sebelumnya: perubahan Anda berikutnya akan dilacak
<branch_name>
.Perhatikan bahwa keduanya
git checkout -
dangit checkout <branch_name>
akan memberikan instruksi tambahan jika Anda telah melakukan perubahan saat HEAD dilepaskan.sumber
git checkout 8acc968
makagit branch -v
adaMyBranch
dalam daftar di bawah ini ... tetapi kemudiangit checkout MyBranch
menghapus komentar saya.git checkout 8acc968
akan memeriksa komit, bukan cabang. JikaMyBranch
memiliki komitmen yang Anda inginkan, cobagit checkout MyBranch
. Jika tidak berisi perubahan dalam komit 8acc968, Anda harus menggabungkan perubahan itu setelah memeriksa cabang.git checkout
melihat komit sebelumnya dan ingin kembali ke komit terbaru. Tetapi tanpa hash komit terbaru, saya cukup banyak tersesat. Solusi ini sangat cocok untuk situasi saya!Pertanyaannya dapat dibaca sebagai:
Saya dalam keadaan terpisah dengan
HEAD
di23b6772
dan mengetikgit reset origin/master
(karena saya ingin squash). Sekarang saya sudah berubah pikiran, bagaimana saya bisa kembaliHEAD
menjadi23b6772
?Jawaban langsungnya adalah:
git reset 23b6772
Tetapi saya menjawab pertanyaan ini karena saya bosan mengetik (menyalin & menempel) melakukan hash atau singkatannya setiap kali saya ingin referensi sebelumnya
HEAD
dan Googling untuk melihat apakah ada jenis steno.Ternyata ada!
git reset -
(atau dalam kasus sayagit cherry-pick -
)Yang kebetulan sama
cd -
dengan kembali ke direktori saat ini di * nix! Jadi hore, saya belajar dua hal dengan satu batu.sumber
Ketika Anda menjalankan perintah
git checkout commit_id
maka HEAD terlepas dari13ca5593d(say commit-id)
dan cabang akan tersedia lagi.Pindah kembali ke lokasi sebelumnya jalankan langkah perintah bijak -
git pull origin branch_name
(katakanlah tuan)git checkout branch_name
git pull origin branch_name
Anda akan kembali ke lokasi sebelumnya dengan komit yang diperbarui dari repositori jarak jauh.
sumber
Hari ini, saya keliru memeriksa sebuah komit dan mulai mengerjakannya, membuat beberapa komit pada status HEAD lepas. Kemudian saya mendorong ke cabang jauh menggunakan perintah berikut:
Kemudian
Kemudian
Saya akhirnya mendapatkan semua perubahan di cabang saya yang saya buat di HEAD lepas.
sumber
Ini mungkin bukan solusi teknis, tetapi berhasil. (jika ada anggota tim Anda yang memiliki cabang yang sama di lokal)
Mari kita asumsikan nama cabang Anda sebagai branch-xxx .
Langkah-langkah untuk Memecahkan:
Catatan: Sekali lagi, ini bukan solusi teknis, tetapi pasti akan membantu.
sumber