.git:获取并应用已删除分支的提交

时间:2017-10-27 11:04:06

标签: git bitbucket fetch commit

我做了一些旧的改动,提交并推送到远程(bitbucket)回购。这些更改未合并到任何其他分支。分支本身已在本地和远程仓库中删除。

但是,正如我在bitbucket网站上看​​到的那样,提交包括删除分支仍然存在(在repo中)。我google了很多,但没有找到方法,如何检索 从远程删除分支的提交。我唯一能做的就是在bitbucket web中看到它们并在那里得到提交。

我看到了一些像

这样的例子
git checkout <sha>

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

但总是会出现以下错误

fatal: reference is not a tree: <sha>

那么,是否可以以及如何从远程,crate分支中检索(获取)这些提交,合并到发布分支?

UPD:

更具体地说,我创建了一个repo,new分支,在这个ne分支中进行提交并删除分支:

回购https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Managing-User-Secrets/?utm_source=vs_developer_news&utm_medium=referral

从已删除的分支https://github.com/yurybond/stackowerflow-rocks

链接到(独立)提交

问题仍然是:如何撤销属于被删除分支的提交(a1c1540abd453773b3ce6445d01e51ad336bbe84)?

7 个答案:

答案 0 :(得分:3)

您可以手动下载缺失 以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不仅会应用文本补丁,还会应用 在当前分支上重新创建整个提交。

如果从远程存储库中删除了分支,则无法执行此操作 从远程reposityr回来。但是,通常你还是 由于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'

修改file并提交更改:

$ echo new-branch >> file
$ git commit -am 'commit on new-branch'
[new-branch 9c457c6] commit on new-branch
 1 file changed, 1 insertion(+)

切换回master

$ git checkout -
Switched to branch 'master'
$ git branch
* master
  new-branch

删除new-branch

$ 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

Reflog显示了在存储库中执行的所有操作:

$ 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

如您所见,我们在9c457c6上进行了new-branch次提交。 仅当reflog过期且运行垃圾收集器9c457c6时 变得无法到达:

$ 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天后过期,并且会运行git gc 一些命令后自动执行,如果您已删除分支 最近你应该能够恢复它。

答案 1 :(得分:2)

如果Bitbucket存储库中确实存在此提交,则可以使用Bitbucket Web界面将其合并到另一个分支中。

  1. 转到分支机构 - &gt;在Bitbucket中创建一个新分支。将其命名为您想要的任何内容
  2. 创建分支时,单击比较(右上角的三个点菜单)
  3. 在比较屏幕中,选择更改源并粘贴您的提交参考。如果它得出结果,那么你很幸运。选择它。
  4. 选择更改目的地,并将其更改为新分支。
  5. 您应该能够浏览差异,看到您想要带来的所有更改。
  6. 如果您满意,请选择合并。
  7. 现在这里是踢球者。如果在步骤3粘贴提交引用失败,那么你运气不好。这意味着提交在远程或本地都不存在。

    如果你讨厌导航并希望直接链接到比较(虽然会与主人比较):https://bitbucket.org/<user>/<repository>/branches/compare/<commit-reference>..master

答案 2 :(得分:1)

好吧,因为你已经在本地删除了分支,你不能像其他人建议的那样用sha-1恢复它。

此外,reflog不能在远程端工作(另外它也会从远程端移除。

这为您提供了两种选择之一。要么写入Bitbucket支持,以便他们恢复你需要的东西。

或者在此尝试迈克尔的建议:Recovering a deleted branch from a remote on Bitbucket (git)

解决方案建议听起来可能会解决您的问题。请让我知道它是如何工作的

答案 3 :(得分:0)

我还没有在Stack Overflow上看到有关检出已删除的提交的任何内容。但是,应该可以通过以下方式对已删除的提交进行硬重置:

git checkout -b some_new_branch
git reset --hard <SHA-1 of deleted commit>

这会将分支some_new_branch重置为已删除的提交,也许这足以让您继续。

我假设您在Bitbucket中看到的已删除提交来自reflog。如果是这样,那么您还应该能够通过以下方式查看已删除的提交:

git reflog

如果您看到已删除的提交,那么它也可能会解释您遇到的错误。在这种情况下,如果删除的提交确实只存在于Bitbucket上,那么你需要一些其他的方法来获取它们。

答案 4 :(得分:0)

如果仍然可以在Bitbucket中看到提交(不在Recent activity中),那么仍然可以从某个分支或某个标记访问提交。您可以运行git fetch以获取这些引用的最新版本,如果本地存储库中不存在该特定提交,也将下载该特定提交。但是,错误fatal: reference is not a tree: <sha>表示sha不是提交。它很可能是一个blob。如果您找到了正确的提交,则git checkout <commit>git checkout -b <branch-name> <commit>应该有效。

答案 5 :(得分:0)

分支中是否有任何标签?关于为什么分支出现在bitbucket但没有使用fetch命令获取的原因尚不清楚。

无论如何,请尝试git fetch +refs/*:refs/*然后查看.git/FETCH_HEAD文件,希望您能找到您想要的其中一个提交。如果没有,将需要更多信息。我还会复制你当前的回购,以避免任何可能因为强制获取远程refspace而产生的麻烦。

答案 6 :(得分:0)

git fetch origin <sha>将从服务器获取提交,但这可能取决于您使用的是GitHub,BitBucket还是其他托管服务提供商