Puis-je récupérer une branche après sa suppression dans Git?

Si je lance git branch -d XYZ , est-il un moyen de récupérer la branche? Y a-t-il un moyen de revenir en arrière comme si je n'avais pas lancé la commande delete branch?

794
demandé sur Peter Mortensen 2010-09-04 07:25:19

14 réponses

Oui, vous devriez pouvoir faire git reflog et trouver le SHA1 pour le commit à la pointe de votre branche supprimée, puis juste git checkout [sha] . Et une fois que vous êtes à cet engagement, vous pouvez juste git checkout -b [branchname] pour recréer la branche à partir de là.

1440
répondu tfe 2015-03-25 18:52:10

la plupart du temps les commits inaccessibles sont dans le refrog. Ainsi, la première chose à essayer est de regarder le refrog en utilisant la commande git reflog (qui affiche le refrog pour HEAD ).

peut-être quelque chose de plus facile si la propagation faisait partie d'une branche spécifique encore existante est d'utiliser la commande git reflog name-of-my-branch . Il fonctionne également avec une télécommande, par exemple, si vous avez forcé à pousser.


si vos commits ne sont pas dans votre remodelage (peut-être parce que supprimé par un outil tiers qui n'écrit pas dans le remodelage), j'ai récupéré avec succès une branche en rétablissant ma branche au sha de la commit trouvée en utilisant une commande comme celle-ci (elle crée un fichier avec toutes les commits pendantes):

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt

Si vous devez utiliser plus d'une fois (ou si vous voulez l'enregistrer quelque part), vous pouvez également créer un alias avec qui commande...

git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'

et l'utiliser avec git rescue

pour enquêter sur les commits trouvés, vous pouvez afficher chaque commit en utilisant quelques commandes pour les examiner.

pour afficher les métadonnées de propagation (auteur, date de création et message de propagation):

git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

pour voir aussi les diffs:

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

une fois que vous avez trouvé votre commit, créez une branche sur ce commit avec:

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
105
répondu Philippe 2017-10-07 07:53:02

si vous aimez utiliser une interface graphique, vous pouvez effectuer toute l'opération avec gitk.

gitk --reflog

Cela vous permettra de voir la branche de commettre l'histoire comme si la branche n'avait pas été supprimé. Maintenant, faites simplement un clic droit sur le dernier commit de la branche et sélectionnez l'option de menu Create new branch .

32
répondu nobar 2015-06-02 14:28:53

haut voté solution ne fait plus que ce qui est demandé:

git checkout <sha>
git checkout -b <branch>

ou

git checkout -b <branch> <sha>

vous déplace dans la nouvelle branche avec tous les changements récents que vous avez peut-être oublié de commettre. Ce n'est peut-être pas votre intention, surtout en mode "panique" après la perte de la branche.

Un plus propre (et plus simple) de la solution semble être le one-liner (après avoir trouvé le <sha> avec git reflog ):

git branch <branch> <sha>

maintenant, ni votre branche actuelle ni les changements non engagés ne sont touchés. Au lieu de cela, seule une nouvelle branche sera créée jusqu'au <sha> .

si ce n'est pas la pointe, il va encore travailler et vous obtenez une branche plus courte, alors vous pouvez réessayer avec nouveau <sha> et nouveau nom de branche jusqu'à ce que vous obtenez le bon.

enfin vous pouvez renommer la branche restaurée avec succès en ce qu'elle était nommé ou autre chose:

git branch -m <restored branch> <final branch>

inutile de dire, la clé du succès était de trouver le bon commit <sha> , ainsi nommez vos commits sagement :)

18
répondu Dmitri Zaitsev 2015-04-28 12:15:13

Ajouter à tfe réponse : il y a aussi le git-resurrect.sh "1519110920 de script" dans le contrib/ zone des sources Git (git.dépôt git), ce qui pourrait vous aider.

git-resurrect <name> tente de trouver des traces d'une pointe de branche appelé <name> , et tente de le ressusciter. Actuellement, le reflog est cherché des messages de caisse, et avec -r aussi fusionner les messages. Avec -m et -t , l'histoire de tous les refs est scannée pour Merge <name> into other / Merge <other> into <name> (respectivement) est plutôt lent mais vous permet de ressusciter le sujet d'autres personnes branche.

14
répondu Jakub Narębski 2017-07-20 08:54:31

si vous n'avez pas de réflexe, par exemple: parce que vous travaillez dans un dépôt nu qui n'a pas le reclog activé et que la propagation que vous voulez récupérer a été créée récemment, une autre option est de trouver les objets commit récemment créés et de les regarder à travers eux.

de l'intérieur de la .git/objects course répertoire:

find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit

Cette recherche tous les objets (s'engage, fichiers, balises, ... ) créé dans les 12 dernières heures et les filtres pour afficher uniquement les engager. La vérification est alors un processus rapide.

j'essaierais le git-ressurect.sh script mentionné dans réponse de Jakub tout d'abord.

9
répondu Robert Knight 2017-05-23 11:54:59

j'ai utilisé les commandes suivantes pour trouver et récupérer ma branche supprimée. Les premières étapes sont tirées de la description de gcb.

$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\  -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline

maintenant, cherchez l'id de propagation git (GIT-SHA) basé sur les commentaires de propagation et utilisez-le dans la commande ci-dessous. Caisse une nouvelle branche appelée New-BRANCH avec le git-SHA précédemment trouvé:

$ git checkout -b NEW-BRANCH GIT-SHA
7
répondu Patrick Koorevaar 2016-11-14 13:28:22

d'après ce que j'ai compris, si la branche à supprimer peut être atteinte par une autre branche, vous pouvez la supprimer en toute sécurité en utilisant

git branch -d [branch]

et votre travail n'est pas perdu. Rappelez-vous qu'une succursale n'est pas un cliché, mais un pointeur vers un. Ainsi, lorsque vous supprimez une branche de supprimer un pointeur.

vous ne perdrez même pas de travail si vous supprimez une branche qui ne peut pas être atteinte par une autre. Bien sûr, il ne sera pas aussi facile que de vérifier la validation de hachage, mais vous pouvez toujours le faire. C'est pourquoi Git est incapable de supprimer une branche qui ne peut pas être atteinte en utilisant -d . Au lieu de cela, vous devez utiliser

git branch -D [branch]

Cela fait partie de l'un doit regarder la vidéo de Scott Chacon sur Git. Vérifier la minute 58:00 quand il parle de branches et comment les supprimer.

Introduction à Git avec Scott Chacon de GitHub

6
répondu fabiopagoti 2017-07-20 08:57:50

pour GitHub utilisateurs sans Git installé:

si vous voulez le restaurer de GitHub site web, vous pouvez Hack leur site web ;)

• tout d'Abord, trouver ceux SHAs (commettre des hachages):

curl -i https://api.github.com/repos/PublicUser/PublicRepo/events

... ou pour les prises en pension privées:

curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events

... (mot de passe sera demandé)

* ensuite, passer à Github et créer une nouvelle branche temporaire qui sera supprimée pour toujours ( Chrome est préférable).

"151940920 • * allez à branches et supprimez celle-ci.

sur la même page, sans recharger , ouvrir DevTools, panneau réseau. Maintenant préparer...

• Cliquez sur restaurer. Vous remarquerez une nouvelle "ligne". Cliquez-droit dessus et sélectionnez "Copier en boucle" et sauvegarder ce texte dans un éditeur.

• ajoute à la fin de la ligne de code copiée, celle-ci: -H "Cookie=" .

, Vous devriez obtenir quelque chose comme ça:

curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed
"151940920 • * dernière étape: remplacer "BranchSHA" par votre SHA-hash et nom de branche avec le nom désiré (BTW, il est grand hack pour renommer la branche du web). Si vous n'étiez pas trop lent, vous devez faire cette demande de toute façon. Par exemple, il suffit de copier-coller à un terminal.

P. S.

je sais, ce n'est pas une solution très simple ou la bonne solution, mais juste au cas où quelqu'un, sans mot de passe racine et machine virtuelle, pendant hackathon aura besoin de faire quelque chose de bizarre comme ça?.. Il est tout à fait réel, je vous remercie donc d'avoir pris de votre temps et bonne chance :)

mise à JOUR

Ahaha, je suis tellement excité à ce sujet le fait que quelqu'un dans le World Wide Web trouvé ma réponse et en fait après l'avoir lu, trouvé drôle ou utile et rejeté mon esprit-soufflant, insensé et si faux-réponse de pratique :) c'est un monde merveilleux autour et nous, programmeurs et codeurs, sommes l'un des éléments les plus fous de lui <3

6
répondu Maxim Mazurok 2017-07-28 22:01:21

j'ai rebasé une branche de remote pour essayer d'effacer quelques commits que je ne voulais pas et j'allais cherrypick les bons que je voulais. Bien sûr que J'ai mal écrit le SHAs...

Voici comment je les ai trouvées (surtout une interface/interaction plus facile des choses sur les réponses ici):

tout d'abord, générez une liste des propagations libres dans votre journal de bord. Faites-le le plus tôt possible et arrêtez de travailler, car ceux-ci peuvent être jetés par le ramasseur d'ordures.

git fsck --full --no-reflogs --unreachable --lost-found > lost

cela crée un fichier lost avec toutes les propagations que vous aurez à regarder. Pour simplifier notre vie, n'en coupons que le SHA:

cat lost | cut -d\  -f3 > commits

Maintenant vous avez un fichier commits avec toutes les propagations que vous avez à regarder.

en supposant que vous utilisez Bash, la dernière étape:

for c in `cat commits`; do  git show $c; read; done

cela vous montrera la différence et les informations de commit pour chacun d'eux. Et attendez-vous à la presse inscrivez . Maintenant, notez toutes celles que vous voulez, puis de choisir dans. Une fois que vous avez terminé, Ctrl-C it.

4
répondu gcb 2017-07-20 09:01:04

Pour récupérer supprimé de la branche, allez d'Abord à travers le reflog de l'histoire,

git reflog -n 60

où n se réfère au dernier n commit. Alors trouvez la bonne tête et créez une branche avec cette tête.

git branch testbranch HEAD@{30}
2
répondu sajin tm 2016-02-23 13:57:14

d'abord aller à git batch le passage à votre projet comme:

cd android studio project
cd Myproject
then type :
git reflog

vous avez tous une liste des modifications et le numéro de référence prendre le numéro de référence puis la caisse

d'android studio ou de la git betcha. une autre solution prendre le numéro de référence et aller à Studio android cliquez sur branches git en bas puis cliquez sur l'étiquette de paiement ou de révision après le numéro de référence puis lol vous avez les branches.

1
répondu FAHAD HAMMAD ALOTAIBI 2015-08-31 22:09:41

en ajoutant à la réponse de tfe, vous pouvez récupérer avec ce processus mentionné, à moins que les commits ne soient pas ramassés. La branche Git est simplement un pointeur vers une propagation particulière dans l'arbre de propagation. Mais si vous supprimez le pointeur, et que les propagations sur cette branche ne sont pas fusionnées avec d'autres branches existantes, alors git les traite comme des propagations pendantes et les supprime pendant le ramassage des ordures, qu'il peut exécuter automatiquement périodiquement.

si votre succursale n'a pas été fusionnée branche, et si c'était des ordures collectées, vous perdrez tous les commits jusqu'à l'endroit où la branche a été fourche d'une branche.

1
répondu Rajeshwar Agrawal 2016-03-19 12:49:05

une question connexe: Je suis venu à cette page après avoir cherché "comment savoir ce que sont les branches supprimées".

alors que j'effaçais de nombreuses anciennes branches, j'ai senti que j'avais supprimé par erreur l'une des nouvelles branches, mais je ne savais pas le nom pour la récupérer.

pour savoir quelles branches sont supprimées récemment, faites ce qui suit:

si vous allez à votre URL Git, qui ressemblera à quelque chose comme ceci:

https://your-website-name/orgs/your-org-name/dashboard

, Alors vous pouvez voir le flux de ce qui est supprimé, par qui, dans le passé récent.

1
répondu Manohar Reddy Poreddy 2017-07-21 18:36:46