2

我有可能找到提交的孩子吗?我在手册页或其他人的建议中找到的所有命令通常都涉及分支名称。

我有效地做的是:我有一个提交树:

A-B-C-D
      ^

我的分支指向 D。

然后我回滚到 C,并提交 E:

A-B-C-D
     \
      E
      ^

然而git rev-list,在 Sourcetree 或可视化工具(如 Sourcetree)中,毫不奇怪,它显示为

A-B-C-E
      ^

没有参考 D。

显然,提交 D 仍然在我的仓库中,但是没有提交 ID,我很难找到它。是否有显示提交的子项的命令,无论它们在哪个分支上,或者它们是否在一个分支上?

编辑

从下面 Nevik 的回答来看,--all似乎没有显示未引用的提交。采用这个提交结构:

> git log --graph --oneline
* 0ff0f06 d
* ac06e14 c
* 3c45cce b
* b3aa730 a

然后回滚到 c:

> git reset --soft ac06
> git log --graph --oneline --all
* ac06e14 c
* 3c45cce b
* b3aa730 a

然后重置回d:

> git reset --soft 0ff0
> git log --graph --oneline --all
* 0ff0f06 d
* ac06e14 c
* 3c45cce b
* b3aa730 a

所以提交肯定仍在回购中。

4

2 回答 2

2

试试git reflog/ git log -g( git log --walk-reflogs) 或git reflog <branch>.


一个例子:

让我们从以下情况开始

> git log --graph --oneline
* 84be53e d
* 8932c9a c
* 05cbe59 b
* 469baa5 a

“删除”顶部提交。git commit --amend这与纠正顶部(最新)提交非常相似:

> git reset --soft HEAD~1

注意:这相当于git reset --soft 8932c

正如您所写--all的那样,在这种情况下没有帮助,因为 84be53e 变得无法访问。

> git log --graph --oneline --all
* 8932c9a c
* 05cbe59 b
* 469baa5 a

git reflog救援... :-)

> git reflog
8932c9a HEAD@{0}: reset: moving to HEAD~1
84be53e HEAD@{1}: commit: d
8932c9a HEAD@{2}: commit: c
05cbe59 HEAD@{3}: commit: b
469baa5 HEAD@{4}: commit (initial): a

如果您在分支之间切换,那么特定于分支的 reflog 可能会更好:

> git branch
* master
> git reflog master
8932c9a master@{0}: reset: moving to HEAD~1
84be53e master@{1}: commit: d
8932c9a master@{2}: commit: c
05cbe59 master@{3}: commit: b
469baa5 master@{4}: commit (initial): a

注意:如果您使用 git-aware shell 提示来显示当前分支,则git branch不需要使用检查当前分支。

现在您可以使用git reset --soft 84be5orgit reset --soft HEAD@{1}git reset --soft master@{1}(或使用更短的形式表示最新:)git reset --soft @{1}

> git reset --soft @{1}
> git log --graph --oneline --all
* 84be53e d
* 8932c9a c
* 05cbe59 b
* 469baa5 a

另请参阅: reflog,您gitready上的安全网(例如)。

于 2013-01-03T10:24:08.010 回答
0

您可以使用--all开关git loggit rev-list显示来自所有分支的提交(甚至是那些不在分支上的提交)。

于 2013-01-03T09:20:28.420 回答