查找git提交的子代,而不是当前分支或任何分支

时间:2013-01-03 09:19:10

标签: git

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

我有效地做了这件事: 我有一个提交树:

A-B-C-D
      ^

我的分支指向D。

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

A-B-C-D
     \
      E
      ^

但是在git rev-list或者像Sourcetree这样的可视化工具中,毫不奇怪,它显示为

A-B-C-E
      ^

没有提及D.

显然,提交D在我的仓库中是stil,但没有提交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

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

2 个答案:

答案 0 :(得分:2)

尝试git reflog / git log -ggit 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 84be5git 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

另请参阅:<{strong> reflog, your safety net gitready(例如)。

答案 1 :(得分:0)

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