Git日志重组

时间:2012-01-23 21:56:50

标签: git git-rebase git-log

我知道GIT rebase会重写历史记录 - 即提交ID会改变。但是,有没有办法跟踪分支何时被重新分配以及从哪个分支?

编辑:我有一个开发分支'A'和一个主题分支'B'。团队共享'A'。在某些时候,'A'已经与主流分支重新建立。由于重新基础(以及后续提交),当我更新主题分支时,我看到了不一致。我试图找出正确的人来解决问题。

3 个答案:

答案 0 :(得分:11)

你可以告诉谁做了!当你重新定义时,由于提交被重写,提交者信息将来自进行rebase的人,而不是原始作者。 (这与作者信息分开。)

您可以在gitk(位于左下方的差异窗格中)或git log --pretty=fuller的输出中看到此信息(如更全面而非完整)。示例日志输出:

commit b8624718b97a39a04637c91ec3517c109f3f681d
Author:     Original Author <original@author.com>
AuthorDate: Sun Aug 8 02:15:10 2010 -0300
Commit:     New Committer <new@committer.com>
CommitDate: Mon Jan 23 17:29:39 2012 -0800

    a lovely commit message

...

提交者名称,电子邮件和日期来自实际编写提交的操作。请注意,如果多次重写,您将只获得最新信息。

至于重新定位的地方......如果重新提交的原始版本也在您的历史记录中,那很容易。只需搜索匹配提交的完整历史记录,例如通过提交消息的片段,或通过提交中更改的内容:

git log --all --grep='commit subject from a rebased commit'
git log --all -S'void this_function_was_added() {'

如果你在历史的任何地方都没有原始提交,那就更难了。希望您能够通过追踪执行该操作的人以及他们是否不知道,让他们在他们的存储库中运行git reflog show <branch>来查找该分支的历史记录。

答案 1 :(得分:8)

git reflog

将允许您查看所有git工作流程的历史记录。在我正在进行的项目中,以下是前三个reflog条目:

151a1da HEAD@{0}: filter-branch: rewrite
db8c822 HEAD@{1}: checkout: moving from fixes to master
db8c822 HEAD@{2}: checkout: moving from master to fixes

第一列显示SHAID。所以你可以在这个SHAID上使用标准的git命令     例如git show 151a1da

答案 2 :(得分:2)

  

Reflog 是一种记录分支提示更新时间的机制。该命令用于管理记录在其中的信息。

“基本上你在Git中执行存储数据的每一个动作,你都可以在reflog中找到它.Git很难不丢失你的数据,所以如果由于某种原因你认为它有,那么很有可能你可以使用git reflog挖掘它。这意味着你可以将它用作安全网:你不应该担心合并,rebase或其他一些行为会破坏你的工作,因为你可以再次找到它使用此命令。“

中有关此主题的更多信息