Pertanyaan Bagaimana cara memindahkan HEAD kembali ke lokasi sebelumnya? (Kepala terpisah)


Dalam git, saya mencoba melakukan squash dengan bergabung di cabang lain dan kemudian mengatur ulang HEAD ke tempat sebelumnya melalui:

git reset origin/master

Tapi saya harus melangkah keluar dari ini. Bagaimana cara memindahkan KEPALA kembali ke lokasi sebelumnya?

Saya memiliki frag SHA1 (23b6772) dari komitmen yang saya perlukan untuk memindahkannya.
Bagaimana saya bisa kembali ke komitmen ini?


75
2017-12-29 21:53


asal


Jawaban:


Sebelum menjawab, tambahkan beberapa latar belakang, jelaskan apa ini HEAD.

First of all what is HEAD?

HEAD hanyalah referensi ke commit saat ini (terbaru) pada cabang saat ini.
Hanya ada satu HEAD pada waktu tertentu. (tidak termasuk git worktree)

Isi dari HEAD disimpan di dalam .git/HEAD dan berisi 40 byte SHA-1 dari commit saat ini.


detached HEAD

Jika Anda tidak melakukan commit terbaru - artinya itu HEAD menunjuk ke komitmen sebelumnya dalam sejarah yang disebut detached HEAD.

enter image description here

Pada baris perintah ini akan terlihat seperti ini - SHA-1 bukannya nama cabang sejak HEAD tidak mengarah ke ujung cabang saat ini

enter image description here


Beberapa opsi tentang cara memulihkan diri dari HEAD yang terpisah:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Ini akan memeriksa cabang baru yang mengarah ke komit yang diinginkan.
Perintah ini akan melakukan checkout ke suatu commit yang diberikan.
Pada titik ini Anda dapat membuat cabang dan mulai bekerja mulai dari titik ini.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Anda selalu dapat menggunakan reflog demikian juga.
git reflog akan menampilkan perubahan apa pun yang memperbarui HEAD dan memeriksa entri reflog yang diinginkan akan mengatur HEAD kembali ke commit ini.

Setiap kali HEAD diubah, akan ada entri baru di reflog

git reflog
git checkout HEAD@{...}

Ini akan membuat Anda kembali ke komitmen yang Anda inginkan

enter image description here


git reset --hard <commit_id>

"Pindahkan" KEPALA Anda kembali ke komit yang diinginkan.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Catatan: (Sejak Git 2.7)
    Anda juga bisa menggunakan git rebase --no-autostash demikian juga.


git revert <sha-1>

"Batalkan" komit atau rentang commit yang diberikan.
Perintah reset akan "membatalkan" setiap perubahan yang dibuat dalam commit yang diberikan.
Komitmen baru dengan patch undo akan dilakukan sementara komitmen awal akan tetap ada dalam sejarah.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Skema ini mengilustrasikan perintah mana yang melakukan apa.
Seperti yang Anda lihat di sana reset && checkout memodifikasi HEAD.

enter image description here


190
2017-12-29 21:56



Berikut ini pendekatan yang mungkin sangat sederhana dan mudah diingat. Periksa 2 ketentuan dan selesaikan dengan 1 perintah. Maka Anda kembali ke jalurnya.

Jika

Anda berada di 'kepala terpisah'
(yaitu jenis git status; kamu melihat HEAD detached at <commit_id>)

Dan

cabang yang ada sesuai dengan kebutuhan Anda
(yaitu jenis git branch -v; Anda melihat nama cabang dengan pesan komit terkait yang mewakili pekerjaan yang ingin Anda lanjutkan)

Kemudian

cukup periksa cabang itu (yaitu jenis git checkout <branch_name>; kamu melihat Switched to branch <branch_name>).

Hasil

Anda sekarang dapat terus menambahkan dan melakukan pekerjaan Anda seperti sebelumnya; perubahan akan dilacak <branch_name>.

Perhatikan bahwa jika Anda telah menyimpan pekerjaan ketika HEAD terlepas, dalam banyak kasus pekerjaan itu akan digabung secara otomatis dalam proses di atas. Jika Anda melihat pesan tentang konflik penggabungan, jangan panik. Ada beberapa tutorial hebat dengan langkah-langkah sederhana untuk memperbaiki konflik dan menyelesaikan penggabungan.


6
2017-08-09 14:10



Pertanyaannya bisa dibaca sebagai:

Saya berada di negara terpisah dengan HEAD di 23b6772 dan diketik git reset origin/master (karena saya ingin squash). Sekarang saya berubah pikiran, bagaimana saya kembali HEAD berada di 23b6772?

Jawaban langsungnya adalah: git reset 23b6772

Tapi saya memukul pertanyaan ini karena saya bosan mengetik (menyalin & menempel) commit hash atau singkatannya setiap kali saya ingin referensi sebelumnya HEAD dan Googling untuk melihat apakah ada tulisan singkat apa pun.

Ternyata ada!

git reset - (atau dalam kasus saya git cherry-pick -)

Yang notabene adalah sama cd - untuk kembali ke sebelumnya direktori saat ini di * nix! Jadi hore, pelajari dua hal dengan satu batu.


2
2017-07-22 04:46