Si je cours git branch -d XYZ
, existe-t-il un moyen de récupérer la branche? Existe-t-il un moyen de revenir en arrière comme si je n'avais pas exécuté la commande delete branch?
Si je cours git branch -d XYZ
, existe-t-il un moyen de récupérer la branche? Existe-t-il un moyen de revenir en arrière comme si je n'avais pas exécuté la commande delete branch?
Réponses:
Oui, vous devriez pouvoir faire git reflog
et trouver le SHA1 pour le commit à la pointe de votre branche supprimée, alors juste git checkout [sha]
. Et une fois que vous êtes à ce commit, vous pouvez simplement git checkout -b [branchname]
recréer la branche à partir de là.
Nous remercions @Cascabel pour cette version condensée / monocouche.
Vous pouvez le faire en une seule étape:
git checkout -b <branch> <sha>
git checkout -b <branch> <sha>
.
<sha>
. Par exemple, comme mentionné ci-dessus -git checkout -b <branch> <sha>
CMD+K
)
git reflog --no-abbrev
pour voir le texte complet <sha>
abrégé par défaut.
git checkout remotes/origin/deleted_branch
.
La plupart du temps, les validations inaccessibles sont dans le reflog. Donc, la première chose à essayer est de regarder le reflog en utilisant la commande git reflog
(qui affiche le reflog pour HEAD
).
Peut-être quelque chose de plus facile si la validation faisait partie d'une branche spécifique encore existante est d'utiliser la commande git reflog name-of-my-branch
. Cela fonctionne également avec une télécommande, par exemple si vous avez forcé la poussée (conseil supplémentaire: préférez toujoursgit push --force-with-lease
plutôt que mieux éviter les erreurs et est plus récupérable).
Si vos commits ne sont pas dans votre reflog (peut-être parce qu'ils ont été supprimés par un outil tiers qui n'écrit pas dans le reflog), j'ai réussi à récupérer une branche en réinitialisant ma branche au sha du commit trouvé en utilisant une commande comme celle-ci (elle crée un fichier avec toutes les validations 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 l'utiliser plus d'une fois (ou si vous voulez l'enregistrer quelque part), vous pouvez également créer un alias avec cette 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 rechercher les validations trouvées, vous pouvez afficher chaque validation à l'aide de certaines commandes pour les examiner.
Pour afficher les métadonnées de validation (auteur, date de création et message de validation):
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
Pour ceux qui sont sous Windows et qui aiment les interfaces graphiques, vous pouvez facilement récupérer les validations (et également les fichiers intermédiaires non validés) avec GitExtensions en utilisant la fonctionnalité Repository
=> Git maintenance
=>Recover lost objects...
Une commande similaire pour récupérer facilement les fichiers intermédiaires supprimés: https://stackoverflow.com/a/58853981/717372
Si vous aimez utiliser une interface graphique, vous pouvez effectuer toute l'opération avec gitk.
gitk --reflog
Cela vous permettra de voir l'historique des validations de la branche comme si la branche n'avait pas été supprimée. Maintenant, faites simplement un clic droit sur le commit le plus récent de la branche et sélectionnez l'option de menu Create new branch
.
La solution la mieux votée fait en fait plus que ce qui était demandé:
git checkout <sha>
git checkout -b <branch>
ou
git checkout -b <branch> <sha>
vous déplacer vers la nouvelle branche avec toutes les modifications récentes que vous avez peut-être oublié de valider. Ce n'est peut-être pas votre intention, surtout lorsque vous êtes en "mode panique" après avoir perdu la branche.
Une solution plus propre (et plus simple) semble être le one-liner (après avoir trouvé le <sha>
avec git reflog
):
git branch <branch> <sha>
Désormais, ni votre branche actuelle ni les modifications non validées ne sont affectées. Au lieu de cela, seule une nouvelle branche sera créée jusqu'à la <sha>
.
Si ce n'est pas l'astuce, cela fonctionnera toujours et vous obtiendrez une branche plus courte, alors vous pouvez réessayer avec un nouveau <sha>
et un nouveau nom de branche jusqu'à ce que vous obteniez le bon résultat.
Enfin, vous pouvez renommer la branche restaurée avec succès en son nom ou toute autre chose:
git branch -m <restored branch> <final branch>
Inutile de dire que la clé du succès était de trouver le bon commit <sha>
, alors nommez vos commits à bon escient :)
Ajout à la réponse tfe : il y a aussi le script git-resurrect.sh dans la contrib/
zone des sources Git (dans le dépôt git.git), qui pourrait vous aider.
git-resurrect <name>
tente de trouver des traces d'un bout de branche appelé<name>
et essaie de le ressusciter. Actuellement, le reflog est recherché pour les messages d'extraction, ainsi que pour les-r
messages de fusion. Avec-m
et-t
, l'historique de toutes les références est analysé pourMerge <name> into other
/Merge <other> into <name>
(respectivement) valider les sujets, ce qui est plutôt lent mais vous permet de ressusciter les branches de sujets d'autres personnes.
J'ai utilisé les commandes suivantes pour rechercher et récupérer ma branche supprimée. Les premières étapes proviennent 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
Recherchez maintenant l'ID de validation git (GIT-SHA) basé sur les commentaires de validation et utilisez-le dans la commande ci-dessous. Découvrez une nouvelle branche appelée NEW-BRANCH avec le GIT-SHA précédemment trouvé:
$ git checkout -b NEW-BRANCH GIT-SHA
Si vous n'avez pas de reflog, par exemple. comme vous travaillez dans un référentiel nu où le reflog n'est pas activé et la validation que vous souhaitez récupérer a été créée récemment, une autre option consiste à rechercher les objets de validation récemment créés et à les parcourir.
Depuis l'intérieur du .git/objects
répertoire, exécutez:
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
Cela recherche tous les objets (validations, fichiers, balises, etc.) créés au cours des 12 dernières heures et les filtre pour afficher uniquement les validations. Leur vérification est alors un processus rapide.
J'essaierais d'abord le script git-ressurect.sh mentionné dans la réponse de Jakub .
man find
: "-ctime n - Le statut du fichier a été modifié pour la dernière fois il y a n * 24 heures." Nous devons donc également changer 12 à 0,5 pour avoir le comportement attendu des 12 dernières heures.
Pour les utilisateurs de GitHub sans Git installé:
Si vous souhaitez le restaurer à partir du site Web de GitHub , vous pouvez utiliser leur API pour obtenir une liste des événements liés au dépôt:
Première
trouver ces SHA (validation des hachages):
curl -i https://api.github.com/repos/PublicUser/PublicRepo/events
... ou pour des repos privés:
curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events
(sera invité à entrer le mot de passe GitHub)
Prochain
• Accédez aux succursales et supprimez celle-ci.
• Sur la même page, sans rechargement , ouvrez DevTools, panneau Réseau. Maintenant, préparez ...
• Cliquez sur restaurer. Vous remarquerez une nouvelle "ligne". Faites un clic droit dessus et sélectionnez "Copier en tant que cURL" et enregistrez ce texte dans un éditeur.
• Append à la fin de la ligne copiée de code, celui - ci: -H "Cookie="
.
Vous devriez maintenant obtenir quelque chose comme:
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
Dernière étape
PS
Je me rends compte que ce n'est peut-être pas la "solution la plus simple" ou la "bonne" solution, mais elle est offerte au cas où quelqu'un la trouverait utile.
git reflog
et a donc été utile, par exemple, pour avoir supprimé une branche distante et perdu l'accès à l'ordinateur, ce qui a été fait de sorte que rien de utile ne peut être obtenu reflog
. Notez que lorsque vous utilisez OAuth ou l'authentification à deux facteurs sur Github, la curl
commande prend la forme: curl -u username:token https://api.github.com/user
oucurl -H "Authorization: token TOKEN" https://api.github.com/repos/USER_OR_ORG_NAME/REPO_NAME/events
D'après ce que je comprends si la branche à supprimer peut être atteinte par une autre branche, vous pouvez la supprimer en toute sécurité à l'aide
git branch -d [branch]
et votre travail n'est pas perdu. N'oubliez pas qu'une branche n'est pas un instantané, mais un pointeur vers une branche. Ainsi, lorsque vous supprimez une branche, vous supprimez 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, ce ne sera pas aussi simple que de vérifier le hachage de validation, mais vous pouvez toujours le faire. C'est pourquoi Git ne peut pas 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 d'une vidéo incontournable de Scott Chacon sur Git. Vérifiez la minute 58:00 quand il parle des branches et comment les supprimer.
reflog
sont simplement exagérées.
Assurez-vous d'effectuer tout cela localement et confirmez que votre dépôt est dans l'état souhaité avant de passer à Bitbucket Cloud. Il peut également être judicieux de cloner votre référentiel actuel et de tester ces solutions en premier.
Deleted branch <your-branch> (was <sha>)
Pour restaurer la branche, utilisez:
git checkout -b <branch> <sha>
Si vous ne connaissez pas le «sha» du haut de votre tête, vous pouvez:
git reflog
git checkout -b <branch> <sha>
Si vos commits ne sont pas dans votre reflog:
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
2.Vous pouvez ensuite afficher chaque commit à l'aide de l'un d'eux:
git log -p <commit>
git cat-file -p <commit>
J'ai rebasé une branche à distance pour essayer d'effacer quelques commits que je ne voulais pas et j'allais choisir les bons que je voulais. Bien sûr, j'ai mal écrit les SHA ...
Voici comment je les ai trouvés (principalement une interface / interaction plus facile à partir des choses sur les réponses ici):
Commencez par générer une liste des validations lâches dans votre journal. Faites-le dès que possible et arrêtez de travailler, car ceux-ci peuvent être jetés par le garbage collector.
git fsck --full --no-reflogs --unreachable --lost-found > lost
Cela crée un lost
fichier avec toutes les validations que vous devrez consulter. Pour simplifier notre vie, coupons-en seulement le SHA:
cat lost | cut -d\ -f3 > commits
Vous avez maintenant un commits
fichier avec tous les commits que vous devez consulter.
En supposant que vous utilisez Bash, la dernière étape:
for c in `cat commits`; do git show $c; read; done
Cela vous montrera les informations de diff et de validation pour chacun d'eux. Et attendez que vous appuyiez Enter. Maintenant, notez tous ceux que vous voulez, puis sélectionnez-les. Une fois que vous avez terminé, appuyez simplement sur Ctrl-C.
GRAND OUI
si vous utilisez GIT, suivez ces étapes simples https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html
si vous utilisez smartgit et que vous poussez déjà cette branche, allez à l'origine, trouvez cette branche et faites un clic droit puis passez à la caisse
Allez d'abord dans git batch pour passer à votre projet comme:
cd android studio project
cd Myproject
then type :
git reflog
Vous avez tous une liste des changements et le numéro de référence prend le numéro de référence puis passez
à la caisse depuis Android studio ou depuis le git betcha. une autre solution, prenez le numéro de référence et allez dans le studio Android, cliquez sur git branches vers le bas, puis cliquez sur la case à cocher ou la révision après le numéro de référence, puis lol, vous avez les branches.
Ajout à la réponse de tfe, vous pouvez récupérer avec ce processus mentionné, à moins que ses validations ne soient pas récupérées. La branche Git est simplement un pointeur vers une validation particulière dans l'arbre de validation. Mais si vous supprimez le pointeur et que les validations sur cette branche ne sont pas fusionnées dans une autre branche existante, git le traite comme des validations pendantes et les supprime lors du garbage collection, qu'il peut exécuter automatiquement périodiquement.
Si votre branche n'a pas été fusionnée avec une branche existante et si elle a été récupérée, vous perdrez toutes les validations jusqu'au point d'où la branche a été bifurquée à partir d'une branche existante.
Un problème connexe: je suis arrivé sur cette page après avoir cherché "comment savoir quelles sont les branches supprimées".
Lors de la suppression de nombreuses anciennes branches, j'ai senti que j'avais supprimé par erreur l'une des nouvelles branches, mais je ne connaissais pas le nom pour la récupérer.
Pour savoir quelles branches ont été supprimées récemment, procédez comme suit:
Si vous accédez à votre URL Git, qui ressemblera à ceci:
https://your-website-name/orgs/your-org-name/dashboard
Ensuite, vous pouvez voir le flux, de ce qui est supprimé, par qui, dans un passé récent.
Je l'ai fait sur l'ordinateur dont je supprime la branche:
git reflog
réponse:
74b2383 (develope) HEAD@{1}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from develope to master
74b2383 (develope) HEAD@{3}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{4}: reset: moving to HEAD
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: clone: from http://LOCALGITSERVER/myBigProject/Android.git
et je récupère la branche avec cette commande:
git checkout -b newBranchName 74b2383
Le simple git reflog
fait de ne pas retourner le sha
pour moi. Seul le commit id
(qui est long de 8 caractères et un sha est beaucoup plus long)
J'ai donc utilisé
git reflog --no-abbrev
Et puis faites la même chose que mentionné ci-dessus:
git checkout -b <branch> <sha>
Notez que git branch delete supprime uniquement la copie locale, pas la copie sur le serveur. Tout d'abord, dans le panneau Git (icône git sur la barre d'outils de gauche), regardez à travers les branches et voyez si votre branche est toujours là sous "origine / votre_nom_branche". Si c'est le cas, sélectionnez-le et vous devriez récupérer votre code (suggérer de le copier / coller / enregistrer immédiatement localement ailleurs).
Si vous ne voyez pas "origin / your_branch_name", installez l'extension GitLens. Cela vous permet de fouiller visuellement dans les référentiels du serveur et de localiser la copie que vous avez synchronisée avec le serveur. Si vous avez plusieurs référentiels, notez qu'il peut être nécessaire d'ouvrir au moins un fichier à partir du référentiel souhaité afin de faire apparaître le référentiel dans GitLens. Alors:
Ouvrez le panneau GitLens
Développez le référentiel
Vous devriez voir une liste de catégories: Succursales / Contributeurs / Télécommandes / Cachettes / etc
Vous devriez trouver YourLostTreasure sous "Branches" ou éventuellement sous "Télécommandes -> Origines". J'espère que vous verrez une branche avec le nom souhaité - si vous la développez, vous devriez voir les fichiers que vous avez modifiés dans cette branche. Double-cliquez sur les noms de fichiers pour les ouvrir et sauvegardez immédiatement ce code.
Si vous ne voyez pas immédiatement votre branche perdue, fouillez et si vous trouvez quelque chose de prometteur, ouvrez-le immédiatement et saisissez le code. J'ai dû fouiller un peu jusqu'à ce que je trouve TheGoldenBranch, et même alors, le code manquait les un ou deux derniers enregistrements (peut-être parce que je n'ai pas réussi à me synchroniser avec le serveur avant d'essayer de fusionner une branche, mais en cliquant accidentellement sur) Supprimer la branche). Ma recherche a été inutilement allongée car lorsque j'ai trouvé la branche pour la première fois, je n'étais pas complètement sûr que le nom était correct, alors j'ai continué à chercher, et il a fallu un certain temps pour retrouver cette première branche. (Ainsi, Carpe Carpum et puis continuer à chercher.)