Git: "Pas actuellement sur une branche." Existe-t-il un moyen simple de revenir sur une branche, tout en conservant les modifications?

202

J'ai donc fait un peu de travail dans le référentiel et quand je suis sur le point de valider, je me rends compte que je ne suis actuellement sur aucune branche.

Cela se produit souvent lorsque je travaille avec des sous-modules et je suis en mesure de le résoudre, mais le processus est fastidieux et j'ai pensé qu'il devait y avoir un moyen plus simple de le faire.

Existe-t-il un moyen simple de revenir sur une branche, tout en conservant les modifications?

Erik B
la source

Réponses:

214

Si vous ne vous êtes pas engagé:

git stash
git checkout some-branch
git stash pop

Si vous vous êtes engagé et n'avez rien changé depuis:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Si vous vous êtes engagé et avez effectué un travail supplémentaire:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop
araqnid
la source
16
Celui-ci n'aide pas si vous vous êtes déjà engagé. Aucun downvote cependant car cela n'était pas spécifié dans la question.
Dean Rather
24
si vous avez déjà validé: notez le hachage du commit que vous avez fait (utilisez git showou git rev-parse HEAD), passez à la branche puis git cherry-picksuivi du hash de commit.
araqnid
7
S'il est validé, récupérez le hachage du dernier commit. Passez à la succursale où vous souhaitez être, etgit merge _hash_
Daniel
SOYEZ VRAIMENT PRUDENT. SI VOUS AVEZ COMMIS LE CHANGEMENT et que vous suivez ces étapes ... Vous verrez le message ... "Votre branche et origine / maître ont divergé".
thinkanotherone
1
@thinkanotherone Si vous avez déjà validé vos modifications, il n'y aurait rien à cacher et vérifier une autre branche n'est pas la fin du monde. Le commit que vous venez de faire est toujours là et vous pouvez le fusionner avec cette branche en utilisant git merge <hash-of-the-commit-you-just-made>.
Erik B
160

cela m'a aidé

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
babay
la source
25
Si vous avez déjà effectué plusieurs validations, voici ce que vous devez faire.
Benjamin Oakes
Je ne l'ai pas essayé, mais il semble que cela fonctionnerait. Cependant, je pense que c'est un scénario peu probable. Je crois que la plupart des gens se rendront compte qu'ils ne sont sur aucune branche avant de s'engager et d'utiliser la réponse acceptée pour résoudre ce problème.
Erik B
49
Vous seriez surpris.
Eric
@ErikB Je ne savais même pas qu'il n'y avait rien de tel que de ne pas être sur une branche. Cette réponse m'a été très utile.
Konstantin Schubert
2
belle réponse, en fait juste tapé et travaillé, contrairement à presque tout ce que l'on rencontre en tant que débutant GIT - vous voudrez peut-être souligner que newbranch est un nom arbitraire et non destiné à être remplacé par un hachage de validation
Toni Leigh
22
git checkout master

C'est le résultat quelque chose comme ceci:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Alors faisons-le:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e
m_messiah
la source
Je ne l'ai pas essayé, mais il semble que cela fonctionnerait très bien. Je suppose que si vous exécutiez git gcentre l'exécution de ces deux commandes, vous perdriez ces commits, mais à moins que vous ne s'exécutiez git gcautomatiquement, cela devrait être une approche assez sans risque. J'irais toujours avec la réponse de babay, mais si vous voulez vous éviter d'écrire deux commandes supplémentaires, je suppose que c'est la voie à suivre.
Erik B
J'avais quitté la branche principale à un moment donné, je ne suis pas totalement sûr. J'avais commis mes changements, il n'y avait aucun changement sur le maître. Ces instructions ont apporté mes changements à la branche principale et tout est bon.
Matti Jokipii
+1 J'étais nerveux à l'idée de vérifier une autre branche tout en laissant des commits derrière, voyant ce message ajouter de la confiance pour y aller.
J-Dizzle
11

Partir d'une autre manière ici

git branch newbranch
git checkout master 
git merge newbranch 
Observateur
la source
3
@ErikB Il a peut-être effectué plusieurs validations. Dans ce cas, voir la réponse de babay.
Benjamin Oakes
@BenjaminOakes C'est peut-être le cas, mais ces commandes git ne sont même pas valides.
Erik B
@ErikB Certainement vrai. :) la réponse de babay est la forme valide de ce qu'Alex semble avoir essayé de faire.
Benjamin Oakes
9

Alternativement, vous pouvez configurer vos sous-modules de sorte que plutôt que d'être dans leur état de tête détachée par défaut, vous extrayiez une branche.

Modifié pour ajouter:

Une façon consiste à extraire une branche particulière du sous-module lorsque vous l'ajoutez avec l'indicateur -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Une autre façon consiste à simplement aller dans le répertoire du sous-module et à le vérifier

git checkout master
Abizern
la source
1
Pourriez-vous me dire comment faire cela?
Erik B
existe-t-il un moyen de mettre à jour un sous-module existant ce mode de branche par défaut? mettre à jour gitmodulespeut-être?
Hertzel Guinness
@HertzelGuinness Pas vraiment. Le sous-module est extrait à un sha de validation particulier. Une branche n'est qu'un pointeur vers le sha et le sha vers lequel il pointe peut changer. Cela n'est pas utile car il ne gèle pas l'état du sous-module extrait. Extraire une branche n'est qu'une commodité si vous apportez des modifications au sous-module.
Abizern
5

Une façon de se retrouver dans cette situation consiste à effectuer un rebase à partir d'une branche distante. Dans ce cas, les nouveaux commits sont pointés par HEADmais masterne les pointent pas - ils pointent vers où ils se trouvaient avant de rebaser l'autre branche.

Vous pouvez faire de ce commit votre nouveau masteren faisant:

git branch -f master HEAD
git checkout master

Cela se met masterà jour de force pour pointer vers HEAD(sans vous mettre dessus master) puis passe à master.

Ian
la source
Fonctionne parfaitement selon les besoins. J'avais déjà organisé les fichiers et commis, mais je n'ai pas pu pousser en raison de l'erreur ci-dessus. Au-dessus de deux lignes de code ont parfaitement fonctionné et poussé mon code comme prévu.
invinciblemuffi
4

J'ai récemment rencontré à nouveau ce problème. Cela fait un moment que je n'ai pas travaillé pour la dernière fois avec des sous-modules et après avoir appris plus sur git, j'ai réalisé qu'il suffit de vérifier la branche sur laquelle vous souhaitez vous engager. Git gardera l'arbre de travail même si vous ne le cachez pas.

git checkout existing_branch_name

Si vous souhaitez travailler sur une nouvelle branche, cela devrait fonctionner pour vous:

git checkout -b new_branch_name

La récupération échouera si vous avez des conflits dans l'arborescence de travail, mais cela devrait être assez inhabituel et si cela se produit, vous pouvez simplement le cacher, le faire éclater et résoudre le conflit.

Par rapport à la réponse acceptée, cette réponse vous fera économiser l'exécution de deux commandes, qui ne prennent pas vraiment beaucoup de temps à exécuter de toute façon. Par conséquent, je n'accepterai pas cette réponse, à moins qu'elle n'obtienne miraculeusement plus de votes positifs (ou du moins proches) que la réponse actuellement acceptée.

Erik B
la source
2

La méthode suivante peut fonctionner:

git rebase HEAD master
git checkout master

Cela rebasera vos modifications HEAD actuelles au-dessus du maître. Ensuite, vous pouvez changer de branche.


Une autre méthode consiste à vérifier d'abord la succursale:

git checkout master

Ensuite, Git devrait afficher SHA1 de vos commits détachés, vous pouvez ensuite les sélectionner, par exemple

git cherry-pick YOURSHA1

Ou vous pouvez également fusionner le dernier:

git merge YOURSHA1

Pour voir tous vos commits de différentes branches (pour vous assurer que vous les avez), exécutez: git reflog.

Kenorb
la source
0

Je sais que j'ai dit à babay en 2012 que je pensais qu'il était peu probable que quelqu'un ne se rende pas compte qu'il n'était pas dans une succursale et ne s'engageait pas. Cela vient de m'arriver, donc je suppose que je dois admettre que je me trompais, mais étant donné qu'il a fallu attendre 2016 pour que cela m'arrive, vous pourriez dire que c'est en fait peu probable.

Quoi qu'il en soit, la création d'une nouvelle branche est exagérée à mon avis. Tout ce que tu dois faire est:

git checkout some-branch
git merge commit-sha

Si vous n'avez pas copié le commit-sha avant de vérifier l'autre branche, vous pouvez facilement le trouver en exécutant:

git reflog
Erik B
la source
c'est un problème rare (peu probable) pour un seul homme. Cela ne m'est plus arrivé depuis 2012. Mais si vous multipliez les chances de monter en nombre d'utilisateurs de git ... Ce sera très probable. Cela peut arriver tous les jours à quelqu'un. :)
babay