我做了一些旧的更改,提交并推送到远程(bitbucket)repo。这些更改未合并到任何其他分支。分支本身已从本地和远程回购中移除。
但是,正如我在bitbucket web中看到的,仍然存在(在repo中)已移除分支的提交。我搜索了很多,但是没有找到方法,如何检索
从远程提交已删除的分支。我唯一能做的就是在bitbucket web上看到它们,并在那里获得提交的sha。
我看到一些例子

git checkout <sha>


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

但总是会出现以下错误
fatal: reference is not a tree: <sha>

那么,有没有可能,我如何才能从远程检索(获取)这些提交,从它们的板条箱分支,合并到发布分支?
升级版:
更具体地说,我已经创建了一个repo,new branch,在这个ne branch中提交并删除branch:
回购https://github.com/yurybond/stackowerflow-rocks
从移除的分支链接到(独立)提交https://github.com/yurybond/stackowerflow-rocks/commit/a1c1540abd453773b3ce6445d01e51ad336bbe84
问题仍然是相同的:如何检索属于已移除分支的提交(A1C1540ABD453773B3CE6445d01e51AD336bbe84)?

最佳答案

您可以手动下载丢失
mbox格式提交并使用git am手动应用它们。为了
例子:
github(链接到的存储库):

  $ wget https://github.com/yurybond/stackowerflow-rocks/commit/a1c1540abd453773b3ce6445d01e51ad336bbe84.patch && git am a1c1540abd453773b3ce6445d01e51ad336bbe84.patch

gitlab
  $ wget https://git.weboob.org/weboob/devel/commit/bba7e1b8ffb0743b57f202cf9cdb43fda209fa43.patch && git am bba7e1b8ffb0743b57f202cf9cdb43fda209fa43.patch

bitbucket
  $ wget https://bitbucket.org/Kasreyn/linux-3-9-rc3-moxart/commits/434e8f69db2c3effdc8741139adb722a68dfcccd/raw -O 434e8f69db2c3effdc8741139adb722a68dfcccd.patch && git am 434e8f69db2c3effdc8741139adb722a68dfcccd.patch

注意git am不仅会应用文本修补程序,而且还会
在当前分支上重新创建一个完整的提交。
如果从远程存储库中删除分支,则无法
从远程休息室拿回来。不过,通常你还是
由于git reflog,可能能够在本地还原已删除的分支。见下表
例子。
首先,创建一个新的非裸存储库:
$ git init
Initialized empty Git repository in /tmp/reflog-test/.git/

添加file并在master分支上创建新提交:
$ touch file
$ git add .
$ git commit -m 'Initial commit'
[master (root-commit) 81fc76d] Initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file

切换到创造性地命名为new-branch的新分支:
$ git checkout -b new-branch
Switched to a new branch 'new-branch'

修改并提交更改:
$ echo new-branch >> file
$ git commit -am 'commit on new-branch'
[new-branch 9c457c6] commit on new-branch
 1 file changed, 1 insertion(+)

切换回file
$ git checkout -
Switched to branch 'master'
$ git branch
* master
  new-branch

删除master
$ git branch -D new-branch
Deleted branch new-branch (was 9c457c6).

它消失了:
$ git branch
* master
$ git log new-branch
fatal: ambiguous argument 'new-branch': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

但是,您应该仍然能够引用提交:
$ git show --stat 9c457c6
commit 9c457c69de8a54376a2614ca8cfc0f515c64676c
Author: Arkadiusz Drabczyk <adrabczyk@bigcorp.com>
Date:   Tue Apr 3 10:43:49 2018 +0200

commit on new-branch

 file | 1 +
 1 file changed, 1 insertion(+)

即使在任何树枝上都找不到。以下命令
不返回任何内容:
$ git branch --contains  9c457c6

new-branch显示一个人在存储库中执行的所有操作:
$ git reflog
dbc721a HEAD@{0}: checkout: moving from new-branch to master
9c457c6 HEAD@{1}: commit: commit on new-branch
dbc721a HEAD@{2}: checkout: moving from master to new-branch
dbc721a HEAD@{3}: commit (initial): Initial commit

正如您所看到的,它也有Reflog提交,我们在9c457c6上做过。
只有当new-branch过期并且垃圾收集器运行时
变得遥不可及:
$ git reflog expire --expire=all  --all
$ git gc --prune=now
Counting objects: 3, done.
Writing objects: 100% (3/3), done.
Total 3 (delta 0), reused 0 (delta 0)
$ git show 9c457c6
fatal: ambiguous argument '9c457c6': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

默认情况下reflog条目在90天后过期,并运行9c457c6
在执行某些命令后自动执行,因此如果已删除分支
相对最近你应该可以恢复它。

09-04 20:15
查看更多