18

我知道 GIT 变基会重写历史——即提交 ID 会改变。但是,是否有任何方法可以跟踪分支何时重新建立以及来自哪个分支?

编辑:我有一个开发分支“A”和一个主题分支“B”。“A”由团队共享。在某些时候,“A”已经重新建立在一个主流分支上。由于 re-base(和后续提交),当我更新主题分支时,我看到了差异。我正在努力寻找合适的人来解决问题。

4

3 回答 3

19
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

于 2012-01-24T00:48:10.077 回答
16

你可能知道是谁干的!当你变基时,由于提交被重写,提交者信息将来自进行变基的人,而不是原作者。(这与作者信息是分开的。)

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>在他们的存储库中运行,以查看该分支的历史记录。

于 2012-01-24T01:34:57.187 回答
5

Reflog是一种记录分支尖端何时更新的机制。该命令用于管理其中记录的信息。

“基本上,您在存储数据的 Git 内部执行的每个操作,您都可以在 reflog 中找到它。Git 非常努力不丢失您的数据,所以如果出于某种原因您认为它有,那么您很有可能可以将其挖掘出来"

关于这个主题的更多信息

于 2012-01-23T22:09:09.247 回答