EDIT:
Lihat @Simba Answer untuk solusi yang valid
submodule.<name>.update
adalah apa yang ingin Anda ubah, lihat dokumen - defaultcheckout
submodule.<name>.branch
tentukan cabang jarak jauh yang akan dilacak - defaultmaster
JAWABAN TUA:
Secara pribadi saya benci jawaban di sini yang mengarahkan ke tautan eksternal yang mungkin berhenti bekerja dari waktu ke waktu dan memeriksa jawaban saya di sini (Kecuali jika pertanyaan itu rangkap) - mengarahkan ke pertanyaan yang mencakup subjek di antara baris subjek lain, tetapi secara keseluruhan sama dengan: "Saya tidak menjawab, baca dokumentasinya. "
Jadi kembali ke pertanyaan: Mengapa itu terjadi?
Situasi yang Anda jelaskan
Setelah menarik perubahan dari server, berkali-kali kepala submodule saya terlepas dari cabang utama.
Ini adalah kasus umum ketika seseorang tidak terlalu sering menggunakan submodul atau baru saja memulai dengan submodul . Saya percaya bahwa saya benar dalam menyatakan, bahwa kita semua telah ada di suatu titik di mana KEPALA submodul kita terlepas.
- Penyebab: submodule Anda tidak melacak cabang yang benar (master default).
Solusi: Pastikan submodule Anda melacak cabang yang benar
$ cd <submodule-path>
# if the master branch already exists locally:
# (From git docs - branch)
# -u <upstream>
# --set-upstream-to=<upstream>
# Set up <branchname>'s tracking information so <upstream>
# is considered <branchname>'s upstream branch.
# If no <branchname> is specified, then it defaults to the current branch.
$ git branch -u <origin>/<branch> <branch>
# else:
$ git checkout -b <branch> --track <origin>/<branch>
- Penyebab: Repo orang tua Anda tidak dikonfigurasikan untuk melacak cabang submodula.
Solusi: Buat submodule Anda melacak cabang jarak jauh dengan menambahkan submodul baru dengan dua perintah berikut.
- Pertama, Anda memberi tahu git untuk melacak remote Anda
<branch>
.
- Anda memberi tahu git untuk melakukan rebase atau menggabungkan alih-alih checkout
- Anda memberi tahu git untuk memperbarui submodule Anda dari jarak jauh.
$ git submodule add -b <branch> <repository> [<submodule-path>]
$ git config -f .gitmodules submodule.<submodule-path>.update rebase
$ git submodule update --remote
- Jika Anda belum menambahkan submodule yang ada seperti ini, Anda dapat dengan mudah memperbaikinya:
- Pertama, Anda ingin memastikan bahwa submodule Anda memiliki cabang diperiksa yang ingin dilacak.
$ cd <submodule-path>
$ git checkout <branch>
$ cd <parent-repo-path>
# <submodule-path> is here path releative to parent repo root
# without starting path separator
$ git config -f .gitmodules submodule.<submodule-path>.branch <branch>
$ git config -f .gitmodules submodule.<submodule-path>.update <rebase|merge>
Dalam kasus-kasus umum, Anda sudah memperbaiki HEAD DETACHED Anda sekarang karena itu terkait dengan salah satu masalah konfigurasi di atas.
memperbaiki KEPALA RINCI ketika .update = checkout
$ cd <submodule-path> # and make modification to your submodule
$ git add .
$ git commit -m"Your modification" # Let's say you forgot to push it to remote.
$ cd <parent-repo-path>
$ git status # you will get
Your branch is up-to-date with '<origin>/<branch>'.
Changes not staged for commit:
modified: path/to/submodule (new commits)
# As normally you would commit new commit hash to your parent repo
$ git add -A
$ git commit -m"Updated submodule"
$ git push <origin> <branch>.
$ git status
Your branch is up-to-date with '<origin>/<branch>'.
nothing to commit, working directory clean
# If you now update your submodule
$ git submodule update --remote
Submodule path 'path/to/submodule': checked out 'commit-hash'
$ git status # will show again that (submodule has new commits)
$ cd <submodule-path>
$ git status
HEAD detached at <hash>
# as you see you are DETACHED and you are lucky if you found out now
# since at this point you just asked git to update your submodule
# from remote master which is 1 commit behind your local branch
# since you did not push you submodule chage commit to remote.
# Here you can fix it simply by. (in submodules path)
$ git checkout <branch>
$ git push <origin>/<branch>
# which will fix the states for both submodule and parent since
# you told already parent repo which is the submodules commit hash
# to track so you don't see it anymore as untracked.
Tetapi jika Anda berhasil membuat beberapa perubahan secara lokal sudah untuk submodule dan melakukan, mendorong ini ke remote maka ketika Anda menjalankan 'git checkout', Git memberi tahu Anda:
$ git checkout <branch>
Warning: you are leaving 1 commit behind, not connected to any of your branches:
If you want to keep it by creating a new branch, this may be a good time to do so with:
Opsi yang disarankan untuk membuat cabang sementara bisa bagus, dan kemudian Anda bisa menggabungkan cabang-cabang ini dll. Namun saya pribadi akan menggunakan hanya git cherry-pick <hash>
dalam kasus ini.
$ git cherry-pick <hash> # hash which git showed you related to DETACHED HEAD
# if you get 'error: could not apply...' run mergetool and fix conflicts
$ git mergetool
$ git status # since your modifications are staged just remove untracked junk files
$ rm -rf <untracked junk file(s)>
$ git commit # without arguments
# which should open for you commit message from DETACHED HEAD
# just save it or modify the message.
$ git push <origin> <branch>
$ cd <parent-repo-path>
$ git add -A # or just the unstaged submodule
$ git commit -m"Updated <submodule>"
$ git push <origin> <branch>
Meskipun ada beberapa kasus lagi, Anda bisa mendapatkan submodul Anda ke status HEAD DETACHED, saya harap Anda sekarang mengerti sedikit lebih banyak tentang cara men-debug kasus khusus Anda.