在Git中删除后,我可以恢复分支吗?

如果我运行git branch -d XYZ ,有没有办法恢复分支? 有没有办法回去,如果我没有运行删除分支命令?

是的,你应该可以做到git reflog并find你的被删除的分支提交的SHA1,然后只是git checkout [sha] 。 一旦你在这个提交,你可以只是git checkout -b [branchname]从那里重新创build分支。

大部分时间不可达的提交都在reflog中。 因此, 首先要尝试的是使用命令git reflog (显示HEAD的reflog)来查看reflog。

也许更容易,如果提交是一个特定的分支仍然存在的一部分是使用命令git reflog name-of-my-branch 。 它也适用于远程,例如,如果你强迫推。


如果你的提交不在你的reflog中 (也许是因为被第三方工具删除了,而这些工具没有写在reflog里),我成功地恢复了一个分支,把我的分支重新设置为使用类似这样的命令用所有悬而未决的提交创build一个文件):

 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 

如果你不止一次使用它(或者想把它保存在某个地方),你也可以用这个命令创build一个别名。

 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' 

并使用它与git rescue

为了调查发现的提交,可以使用一些命令来显示每个提交以查看它们。

要显示提交元数据(作者,创builddate和提交消息):

 git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560 

要看到差异:

 git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560 

一旦你find你的提交,然后在这个提交上创build一个分支:

 git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560 

如果您喜欢使用GUI,则可以使用gitk执行整个操作。

 gitk --reflog 

这将允许您看到分支的提交历史logging,就好像分支还没有被删除一样。 现在只需右键单击最近提交到分支并select菜单选项Create new branch

顶级投票的解决scheme实际上超过了要求:

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

要么

 git checkout -b <branch> <sha> 

将您移到新分支,以及您可能忘记提交的所有最近更改。 这可能不是你的意图,特别是在失去分支后的“恐慌模式”。

一个更清洁(更简单)的解决scheme似乎是单行的(在find<sha>git reflog ):

 git branch <branch> <sha> 

现在您的当前分支和无限变化都不受影响。 相反,只有一个新的分支会一直创build到<sha>

如果它不是小费,它仍然可以工作,你得到一个较短的分支,那么你可以重试新的<sha>和新的分支名称,直到你得到它的权利。

最后,您可以将成功恢复的分支重命名为命名或其他任何内容:

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

不用说,成功的关键是find正确的提交<sha> ,所以明智地提交你的提交:)

添加到tfe答案 :还有Git源(在git.git存储库)的contrib/区域中的git-resurrect.sh脚本,这可能会帮助你。

git-resurrect <name>尝试查找名为<name>的分支提示的跟踪,并尝试重新生成它。 目前,search引用日志的结帐消息,并与-r也合并消息。 使用-m-t ,将所有参考文献的历史logging扫描为Merge <name> into other / Merge <other> into <name> (分别)提交主题,这是相当慢,但允许您复活其他人的主题分支。

如果你没有推荐日志,例如。 因为你正在一个没有启用reflog的裸仓库中工作,并且你想恢复的提交是最近创build的,所以另一个select是find最近创build的提交对象并查看它们。

.git/objects目录中运行:

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

这将查找在过去12小时内创build的所有对象(提交,文件,标签等),并对其进行过滤以仅显示提交。 检查这些是一个快速的过程。

我会尽量尝试在Jakub的答案中提到的git-ressurect.sh脚本。

从我的理解,如果要删除的分支可以由另一个分支到达,您可以安全地删除它使用

 git branch -d [branch] 

你的工作不会丢失。 请记住,分支不是一个快照,而是指向一个的指针。 所以当你删除一个分支时,你删除了一个指针。

如果删除了另一个无法访问的分支,则甚至不会丢失工作。 当然,这不会像检查提交散列一样简单,但是你仍然可以这样做。 这就是为什么Git无法删除使用-d无法访问的分支。 相反,你必须使用

 git branch -D [branch] 

这是Scott Chacon关于Git的必看video的一部分。 当他谈到分支时,请检查分钟58:00,以及如何删除它们。

与GitHub的Scott Chacon一起介绍Git

我用下面的命令来查找和检索我删除的分支。 第一步是从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 

现在根据提交注释查找git commit id(GIT-SHA),并在下面的命令中使用它。 用先前find的GIT-SHA检出一个叫NEW-BRANCH的新分支:

 $ git checkout -b NEW-BRANCH GIT-SHA 

我从偏远地区重新设立了一个分支机构,尝试清除一些我不想要的提交,然后挑选我想要的那些提交。 当然我写了SHA错误…

这里是我如何find他们(主要是一个更简单的界面/互动从这里的答案):

首先,在日志中生成一个松散的提交列表。 尽快做到这一点,停止工作,因为那些可能被垃圾收集器倾倒。

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

这将创build一个lost文件,所有提交你将不得不看。 为了简化我们的生活,让我们只削减它的SHA:

 cat lost | cut -d\ -f3 > commits 

现在你有一个commits文件,所有提交你必须看。

假设你正在使用Bash,最后一步:

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

这将显示每个人的差异和提交信息。 并等待你按Enter键 。 现在把所有你想要的东西写下来,然后把它们挑出来。完成后,只需按Ctrl-C即可。

对于没有安装Git的GitHub用户:

如果你想从GitHub网站恢复它,你可以攻击他们的网站;)

•首先,find那些SHA(提交哈希):

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

…或私人回购:

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

…(会提示密码)

•接下来,转到GitHub并创build一个新的临时分支,永远删除( Chrome是最好的)。

•转到分支并删除那个分支。

在同一页面上,不要重新加载 ,打开DevTools,networking面板。 现在准备…

•单击还原。 你会注意到一个新的“线”。 右键单击它并select“复制为cURL”并将其保存在某个编辑器中。

附加到复制的代码行的末尾,这一行是: -H "Cookie="

你现在应该得到这样的东西:

 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 

•最后一步:用所需的名称replace“SHA-HASH”和“BranchName”(顺便说一下,从Web重命名分支是很棒的)。 如果你不太慢,无论如何你都需要提出这个请求。 例如,只需复制粘贴到terminal。

PS

我知道,这不是非常简单的解决scheme或正确的解决scheme,但是如果有人没有root密码和虚拟机,在黑客马拉松期间需要做一些奇怪的事情?这是完全真实的,所以感谢您花时间还有祝你好运 :)

UPDATE

阿哈哈,我对万维网上的某个人find答案感到兴奋,事实上在阅读之后,发现它很有趣或者有用,并且赞成我的令人兴奋,疯狂和错误的练习答案:)这是一个美好的世界我们,程序员和程序员,是其中最疯狂的部分之一

为了恢复被删除的分支,首先查看reflog的历史logging,

 git reflog -n 60 

其中n表示最后的n个提交。 然后find适当的头,并创build一个与该头的分支。

 git branch testbranch HEAD@{30} 

首先去git批处理移动到你的项目,如:

 cd android studio project cd Myproject then type : git reflog 

你们都有一个更改列表和参考号码采取编号然后结帐
从android工作室或从git betcha。 另一个解决scheme采取编号,并去Android工作室点击GIT分支,然后点击结帐标签或修改过去的参考号码,然后哈哈,你有分支机构。

添加到tfe的答案,你可以恢复这个过程中提到的,除非它的提交没有垃圾收集。 Git分支只是一个指向提交树中特定提交的指针。 但是,如果你删除指针,并且该分支上的提交没有合并到其他现有的分支,那么git将它视为悬而未决的提交,并在垃圾回收期间将其删除,这可能会定期自动运行。

如果你的分支没有被合并到一个已经存在的分支,并且如果它被垃圾收集了,那么你将把所有的提交都放弃,直到分支从一个已经存在的分支中分出来。

一个相关的问题:我search“如何知道什么是删除分支”来到这个页面。

虽然删除了许多旧的分支,但是我错误地删除了一个较新的分支,但不知道名字是为了恢复它。

要知道最近删除了哪些分支,请执行以下操作:

如果你去你的Git的URL,看起来像这样:

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

然后,你可以看到最近被谁删除的东西。