ÉDITER:
Voir @Simba Answer pour une solution valide
submodule.<name>.update
est ce que vous voulez changer, consultez la documentation - par défaut,checkout
submodule.<name>.branch
spécifiez la branche distante à suivre - par défautmaster
ANCIENNE RÉPONSE:
Personnellement, je déteste les réponses ici qui dirigent vers des liens externes qui peuvent cesser de fonctionner avec le temps et vérifier ma réponse ici (à moins que la question ne soit dupliquée) - diriger vers une question qui couvre le sujet entre les lignes d'un autre sujet, mais globalement égale: "Je suis ne répond pas, lisez la documentation. "
Revenons donc à la question: pourquoi cela se produit-il?
Situation que vous avez décrite
Après avoir extrait les modifications du serveur, la tête de mon sous-module est souvent détachée de la branche principale.
C'est un cas courant lorsque l'on n'utilise pas trop souvent des sous-modules ou qu'on vient de commencer avec des sous-modules . Je crois avoir raison de dire que nous avons tous été là à un moment donné où la tête de notre sous-module se détache.
- Cause: votre sous-module ne suit pas la branche correcte (maître par défaut).
Solution: assurez-vous que votre sous-module suit la bonne branche
$ 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>
- Cause: votre référentiel parent n'est pas configuré pour suivre la branche des sous-modules.
Solution: faites en sorte que votre sous-module suive sa branche distante en ajoutant de nouveaux sous-modules avec les deux commandes suivantes.
- Dites d'abord à git de suivre votre télécommande
<branch>
.
- vous dites à git d'effectuer un rebase ou une fusion au lieu de vérifier
- vous dites à git de mettre à jour votre sous-module à distance.
$ git submodule add -b <branch> <repository> [<submodule-path>]
$ git config -f .gitmodules submodule.<submodule-path>.update rebase
$ git submodule update --remote
- Si vous n'avez pas ajouté votre sous-module existant comme celui-ci, vous pouvez facilement résoudre ce problème:
- Vous voulez d'abord vous assurer que votre sous-module a extrait la branche dont vous souhaitez faire le suivi.
$ 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>
Dans les cas courants, vous avez déjà corrigé votre TETE DÉTACHÉE car elle était liée à l'un des problèmes de configuration ci-dessus.
fixation de la TÊTE DÉTACHÉE lorsque .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.
Mais si vous avez déjà réussi à apporter des modifications localement pour le sous-module et que vous avez commité, si vous les avez poussées vers remote puis lorsque vous avez exécuté 'git checkout', Git vous en informe:
$ 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:
L'option recommandée pour créer une branche temporaire peut être bonne, puis vous pouvez simplement fusionner ces branches, etc. Cependant, personnellement, j'utiliserais juste git cherry-pick <hash>
dans ce cas.
$ 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>
Bien qu'il existe d'autres cas où vous pouvez mettre vos sous-modules dans l'état DETACHED HEAD, j'espère que vous comprenez maintenant un peu plus comment déboguer votre cas particulier.