Branche à partir d'un commit précédent à l'aide de Git

1798

Si j'ai n commits, comment puis-je créer une branche à partir du n-3 commit?

Je peux voir le hachage de chaque commit.

dole doug
la source

Réponses:

2547

Vous pouvez créer la branche via un hachage:

git branch branchname <sha1-of-commit>

Ou en utilisant une référence symbolique:

git branch branchname HEAD~3

Pour extraire la branche lors de sa création, utilisez

git checkout -b branchname <sha1-of-commit or HEAD~3>
CB Bailey
la source
42
Git 1.8.2 me permet d'utiliser le court sha1 pour la première forme.
Dan Benamy
53
@MattFenwick Git vous permettra d'utiliser des hachages raccourcis partout où un hachage est autorisé, tant que le hachage raccourci est `` unique '' dans le référentiel. Donc, si cela ne fonctionne pas, essayez d'ajouter un autre caractère à partir du hachage.
poke
29
Pour pousser correctement la nouvelle branche sur le serveur .. il fallait cette dernière étape:git push origin BRANCH_NAME
Gene Bo
3
démarrer une branche à partir de l' <sha1-of-commit>exécution, git checkout -b <name-of-branch> <sha1-of-commit>mais si la branche existe déjàgit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh
258

Pour ce faire sur github.com:

  1. Accédez à votre projet.
  2. Cliquez sur "Commits".
  3. Cliquez sur <> ("Parcourir le référentiel à ce stade de l'historique") sur le commit à partir duquel vous souhaitez créer une branche.
  4. Cliquez sur le "arbre: xxxxxx" en haut à gauche. Juste en dessous de la barre des statistiques linguistiques, vous aurez la possibilité de "Rechercher ou créer une branche" (il suffit de taper un nouveau nom de branche ici)Branche du commit précédent
OneSolitaryNoob
la source
4
La question ne concerne pas github, mais git. La plupart des serveurs git ne sont pas des github.
Anders Tornblad
46
Malgré le fait que ce soit Github pas git, c'était toujours extrêmement utile!
Liz
Malheureusement, il montre toujours des changements par rapport à d'autres commits, que je voulais éviter, c'est pourquoi j'ai cherché cette question
Maxim
83

La magie peut être effectuée par git reset .

  1. Créez une nouvelle branche et passez à celle-ci (afin que toutes vos dernières validations soient stockées ici)

    git checkout -b your_new_branch

  2. Revenez à votre branche de travail précédente (supposez qu'elle est maître)

    git checkout master

  3. Supprimez les derniers commits x, gardez le maître propre

    git reset --hard HEAD~x # in your case, x = 3

À partir de ce moment, toutes les dernières validations x ne se trouvent que dans la nouvelle branche, plus dans votre branche de travail précédente (maître).

Jing Li
la source
7
C'est ce que je cherchais car il supprime les commits du Master et fait comme si vous vous souveniez de faire la branche avant ces commits. Merci.
superbeck
7
N'oubliez pas que ce git reset --hardn'est pas une bonne idée si vous avez déjà poussé le commit à l'origine ...
LuisF
1
vous pouvez git push --force si vous aviez déjà poussé la branche avant
milan
Mais soyez très prudent lorsque vous utilisez --force blog.developer.atlassian.com/force-with-lease
peater
74

Si vous ne savez pas à l'avance à partir de quel commit vous souhaitez créer une branche, vous pouvez vérifier les validations et examiner leur code (voir source, compiler, tester) en

git checkout <sha1-of-commit>

une fois que vous avez trouvé le commit à partir duquel vous souhaitez créer une branche, vous pouvez le faire à partir du commit (c'est-à-dire sans revenir au maître en premier) simplement en créant une branche de la manière habituelle:

git checkout -b <branch_name>
stanm
la source
22
git checkout -b <branch-name> <sha1-of-commit>
Tyler Long
la source
1
En quoi est-ce différent de " git branch branchname <sha1-of-commit>" (de la réponse acceptée)?
Peter Mortensen le
Je ne sais pas. Je pense qu'ils sont équivalents. J'utilise toujours git checkout -bpour créer une nouvelle branche.
Tyler Long
10
stackoverflow.com/a/7987711/3590629 git branch ... crée la branche mais vous laisse sur la branche actuelle. git checkout -b ... crée la branche et vous y fait basculer.
esme_louise
9

Un moyen rapide de le faire sur votre dépôt Github serait comme suit:

  • Trouvez le commit spécifique de votre branche
  • À côté de l'identifiant SHA, cliquez sur «Parcourir le dépôt à ce stade de l'historique»
  • Ici, vous pouvez créer une nouvelle branche à partir de ce commit entrez la description de l'image ici
Vatsal Parekh
la source
1
Ceci est en fait obsolète
regetskcob
2
La question ne concerne pas github.
Anders Tornblad
8

Exécutez simplement:

git checkout -b branch-name <commit>

Par exemple :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

La checkoutcommande avec le paramètre -bcréera une nouvelle branche ET vous y basculera

d1jhoni1b
la source
1
J'aime beaucoup celui-ci. Merci
The Fool
est-il possible de créer une branche basée sur la validation SHA d'une branche de fonctionnalité qui a été supprimée via une pull request? Ou dois-je dériver de la validation de la demande d'extraction sur le maître?
user2966445
exécuter git fetchet git branchcommander sur le dossier de votre projet à l'aide du terminal, puis vérifier si la branche de fonctionnalité existe, si tel est le cas, alors oui, bien sûr, vous ne pourrez pas créer une branche à partir de branches supprimées, vous pouvez également annuler une suppression de branche au cas où le branche a disparu
d1jhoni1b
4

Une grande question connexe est: comment diable pouvez-vous comprendre cela en utilisant l' --helpoption de git? Essayons ça:

git branch --help

Nous voyons cette sortie:

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

Gobbledegook.

Cherchez dans le texte suivant le mot "commit". Nous trouvons ceci:

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

On arrive quelque part!

Maintenant, concentrez-vous sur cette ligne du gobbledegook:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

Condensez à ceci:

git branch <branchname> [<start-point>]

Et.. Voila.

Purplejacket
la source
1
Je déteste git. Merci.
Byron Whitlock
4

Pour ce faire dans Eclipse:

  • Allez dans la perspective "Git Repository Exploring".
  • Développez "Tags" et choisissez le commit à partir duquel vous souhaitez créer une branche.
  • Faites un clic droit sur le commit et choisissez "Créer une branche".
  • Indiquez un nom de branche.

Cela créera une succursale locale pour vous. Ensuite, chaque fois que vous transmettez vos modifications, votre branche est transmise au serveur distant.

Saurabhcdt
la source
3

Vous pouvez le faire dans Stash.

  1. Cliquez sur le commit
  2. En haut à droite de l'écran, cliquez sur "Marquer ce commit"
  3. Ensuite, vous pouvez créer la nouvelle branche à partir de la balise que vous venez de créer.
David Ruan
la source
De quelle GUI s'agit-il? GitHub?
ostrichofevil
Atlassian Stash
David Ruan
3

J'ai pu le faire comme ça:

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

Où vous devez entrer la valeur de saut. 0 est le dernier, 1 est le précédent, 2 est le commit avant cela, etc.

Mike Graf
la source
4
Pourquoi ne pas simplement utiliser HEAD~1(où 1 spécifie 1 commit back)?
jduncanator
1
Votre chemin est couvert par la réponse sélectionnée et fonctionne très bien. La mienne est une manière différente de la réponse sélectionnée.
Mike Graf
3

Cela crée la branche avec une seule commande:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

Je préfère cette méthode mieux que celles publiées ci-dessus, car elle crée la branche immédiatement (ne nécessite pas de commande push supplémentaire par la suite).

Alexander Samoylov
la source
3

Utilisation de Sourcetree | La manière la plus simple.

  • Commencez par extraire la branche que vous souhaitez prendre le commit spécifique pour créer une nouvelle branche.
  • Ensuite, regardez dans la barre d'outils, sélectionnez Référentiel> Branche ... le raccourci est Commande + Maj + B.
  • Et sélectionnez le commit spécifique que vous souhaitez prendre. Et donnez un nouveau nom de branche puis créez une branche!

entrez la description de l'image ici

Dary
la source
a finalement trouvé cette réponse utile. Merci
Firda Sahidi
1

C'est ce que j'ai fait:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

Dans ce cas, 8a75b001096536b3216022484af3026aa9c7bb5bétait et ancien commit appartenant à la masterbranche.

Jaime Montoya
la source
1

Accédez à une validation particulière d'un référentiel git

Parfois, lorsque vous travaillez sur un référentiel git, vous souhaitez revenir à une validation (révision) spécifique pour avoir un instantané de votre projet à un moment précis. Pour ce faire, il vous suffit du hachage SHA-1 du commit que vous pouvez facilement trouver en consultant le journal avec la commande:

git log --abbrev-commit --pretty=oneline

qui vous donnera une liste compacte de tous les commits et la version courte du hachage SHA-1.

Maintenant que vous connaissez le hachage du commit auquel vous souhaitez accéder, vous pouvez utiliser l'une des 2 commandes suivantes:

git checkout HASH

ou

git reset --hard HASH

check-out

git checkout <commit> <paths>

Indique à git de remplacer l'état actuel des chemins par leur état dans la validation donnée. Les chemins peuvent être des fichiers ou des répertoires.

Si aucune branche n'est donnée, git suppose la validation HEAD.

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

Si aucun chemin n'est indiqué, git se déplace HEADvers le commit donné (changeant ainsi le commit sur lequel vous vous asseyez et travaillez).

git checkout branch //means switching branches.

réinitialiser

git reset <commit> //re-sets the current pointer to the given commit.

Si vous êtes sur une branche (vous devriez généralement l'être) HEADet que cette branche est déplacée pour valider.

Si vous êtes dans un HEADétat détaché , git reset ne se déplace que HEAD. Pour réinitialiser une branche, commencez par la vérifier.

Si vous vouliez en savoir plus sur la différence entre git reset et git checkout, je vous recommande de lire le blog officiel de git .

LYES - CHIOUKH
la source
2
merci pour votre réponse, FYI: Ceci: git log --abbrev-commit --pretty=oneline peut être abrégé engit log --oneline
Suhaib
0

Sélectionnez Valider

Pour les utilisateurs de Git GUI, vous pouvez visualiser tout l'historique (si nécessaire), puis cliquer avec le bouton droit sur le commit à partir duquel vous souhaitez créer une branche et entrer le nom de la branche.

Entrez le nom de la succursale

Visualisez toute l'histoire

Ivan
la source
Cela ne fonctionnera que si l'utilisateur utilise un système d'exploitation basé sur l'interface utilisateur comme Windows et MAC
Saurabhcdt
C'est vrai. Ma réponse commence spécifiquement par les mots "Pour les utilisateurs de Git GUI ...". Je n'ai pas donné de réponse qui fonctionnera pour tout le monde - c'est déjà fait. J'ai donné une méthode alternative qui pourrait être plus facile pour beaucoup de gens. Je pense que la raison pour laquelle ma réponse n'est pas appréciée est que ce n'est pas une solution pour tout le monde, mais cela existe déjà avec quelques milliers de votes positifs. Cependant, cela ne rend pas ma réponse fausse "Pour les utilisateurs de Git GUI!". CREATE NEW BRANCH est là dans l'interface graphique. Je doute que je suis la seule personne au monde à l'utiliser!
Ivan
0

Pour effectuer la réponse acceptée dans Visual Studio 2015 et 2017:

Cliquez dans les modifications

Cliquez dans les modifications (flèche rouge ci-dessus)

Cliquez sur Actions pour afficher l'historique

Cliquez sur Actions (flèche rouge ci-dessus) et cliquez sur Afficher l'historique dans le menu déroulant

Et un nouvel onglet s'ouvrira:

Onglet Historique

Et vous devez cliquer avec le bouton droit sur le commit précédent auquel vous souhaitez que votre code revienne: clic droit sur le commit précédent

Choisissez de commander une nouvelle succursale et voilá!

Ci-dessous, bien que cela ne fasse pas partie de la question OP, mais je fais beaucoup à la fois et celle-ci est une étape piège, du moins pour moi: si vous souhaitez revenir à un commit précédent, sans extraire une nouvelle branche, NE choisissez PAS revert (! ?); vous devez choisir de redéfinir --mixed ou --hard:

faites un clic droit sur le commit précédent et redéfinissez

Marcelo Scofano
la source
Veuillez partager vos réponses en anglais car la plupart d'entre nous ici ne parlent pas ou ne connaissent pas d'autres langues étrangères que l'anglais.
Shamiul Hasan Rumman
@ShamiulHasanRumman, dans le texte qui explique les images - généralement ci-dessous - j'ai traduit le terme pointé de la flèche rouge en anglais, comme ça Cliquez dans les actions (flèche rouge ci-dessus) Ce n'était pas suffisant?
Marcelo Scofano
@MarceloScofano, a-t-il été difficile de changer d'éditeur en anglais avant de prendre les captures d'écran?
Andrew Surdu
1
@AndreiSurdu: parce que je n'ai jamais eu besoin de le faire, je m'attendais à ce que pour passer à l'anglais, je devais installer un paquet supplémentaire. Mais vous avez raison, il n'a besoin que d'un redémarrage VS, pas d'installation du tout. J'essaierai de changer les images ci-dessus dès que j'aurai du temps libre.
Marcelo Scofano
0

si vous utilisez un arbre source assez simple.

  • Cliquez avec le bouton droit sur le commit à partir duquel vous devez créer une nouvelle branche
  • Cliquez sur 'branche'
  • Saisissez le nom de la nouvelle branche dans la boîte de dialogue qui s'affiche et cliquez sur «créer une branche»
Ibtisam Asif
la source
0

Si vous recherchez une solution basée sur la ligne de commande, vous pouvez ignorer ma réponse. Je vais vous suggérer d'utiliser GitKraken . C'est un client Git UI extraordinaire. Il montre l'arbre Git sur la page d'accueil. Vous pouvez simplement les regarder et savoir ce qui se passe avec le projet. Sélectionnez simplement un commit spécifique, faites un clic droit dessus et sélectionnez l'option 'Créer une branche ici'. Il vous donnera une zone de texte pour entrer le nom de la branche. Entrez le nom de la succursale, sélectionnez «OK» et vous êtes prêt. C'est vraiment très simple à utiliser.

Shamiul Hasan Rumman
la source