我该如何查看已删除分支(使用git flow)的git历史记录?

10

我使用git flow通过git flow feature start <feature name>创建了两个分支。我不记得是否在这两个分支上都使用了git flow feature finish,或者将分支A合并到分支B中并删除分支A,然后从分支B运行git flow feature finish, 或者用git flow feature finish将分支B合并到develop中,然后用git merge将分支A合并到develop中,并解决合并冲突,最后用git branch -d <branch name>删除分支A

使用git reflog,我能找到分支A的最后一次记录是在序列中的e553bf0

e553bf0 HEAD@{40}: checkout: moving from feature/a to develop
6b30050 HEAD@{41}: checkout: moving from develop to feature/a
e553bf0 HEAD@{42}: checkout: moving from feature/a to develop
6b30050 HEAD@{43}: checkout: moving from develop to feature/a
e553bf0 HEAD@{44}: commit (merge): resolved merge conflicts
7a0ad6b HEAD@{45}: checkout: moving from feature/a to develop
6b30050 HEAD@{46}: checkout: moving from develop to feature/a
7a0ad6b HEAD@{47}: merge feature/b: Merge made by the 'recursive' strategy.
921ae46 HEAD@{48}: checkout: moving from feature/b to develop

此外,git log 显示

commit e553bf07272ab2b1975917b736b37127636c0db1
Merge: 7a0ad6b 6b30050
Author: Eric Baldwin <address-here>
Date:   Thu Jul 25 14:58:49 2013 -0400

    resolved merge conflicts

commit 7a0ad6b2277c0c0a7599193829f68517ac708ca2
Merge: 921ae46 02558b6
Author: Eric Baldwin <address-here>
Date:   Thu Jul 25 14:03:56 2013 -0400

    Merge branch 'feature/b' into develop

两个功能的代码目前都在 develop 分支,但我不知道合并的顺序。能否有人根据历史记录告诉我这三种情况中发生了哪一种?

编辑:

git log --oneline --graph develop 命令的输出:

* 2ebb938 misc
*   69f95f6 Merge 'feature/x' into 'develop' merge conflicts
|\  
| * 8b9b275 Merge 'develop' with feature/x; minor merge tweaks
| * eb89630 misc
| * 54884d2 misc
| *   76f02bb Merge branch 'develop' into feature/x
| |\  
| * | d06d673 misc
| * | 0ba5235 misc
* | | 5489590 misc
* | | a215bd2 misc
* | | 4aacaa7 misc
* | |   e553bf0 resolved merge conflicts
|\ \ \  
| * | | 6b30050 fixed test db error
| * | |   64909f9 Merge branch 'develop' into feature/a
| |\ \ \  
| * \ \ \   e7319e1 Merge branch 'develop' into feature/a
| |\ \ \ \  
| * | | | | 410786b misc
| * | | | | 67267f3 misc
| * | | | | ae4b800 misc
| * | | | |   9e281eb Merge branch 'develop' into feature/a
| |\ \ \ \ \  
| * | | | | | f8fa2ec misc
* | | | | | |   7a0ad6b Merge branch 'feature/b
|\ \ \ \ \ \ \  
| * | | | | | | 02558b6 ready to merge
| * | | | | | |   cc07f79 Merge branch 'develop' into feature/b
| |\ \ \ \ \ \ \  
| | | |_|_|/ / /  
| | |/| | | | |   
| * | | | | | | 4b6610f misc
| * | | | | | |   25e509b Merge branch 'develop' into feature/b
| |\ \ \ \ \ \ \  
| | | |_|_|/ / /  
| | |/| | | | |   
| * | | | | | |   df5640d merged with develop

你能否展示一下 git log --oneline --graph develop 的输出结果?另外,根据你的 reflog,6b30050feature/a 所在的位置,而 e553bf0develop 上的一个提交。你可以通过运行 git log --oneline --graph <sha> 来查看它们的历史记录。此外,显然你已经做了很多功课,并提供了大量有用的信息来帮助解决问题,点个赞! - user456814
感谢您的帮助,请查看上面 git log --oneline --graph develop 的输出。 - Eric Baldwin
我认为你在问题中混淆了分支名称。你的reflog和第一个log都说你在7a0ad6bB合并到了develop,但是你添加的第二个log说你在7a0ad6bA合并到了develop。请修正并更新你的问题。 - user456814
1个回答

5

看起来你优先将分支 A 合并到了开发分支,在 7a0ad6b 时刻。之后发生了什么就不太清楚了。根据你的 git log 输出,似乎你在 e553bf0 时刻将分支 B 合并到了开发分支。

* | |   e553bf0 resolved merge conflicts
|\ \ \  
| * | | 6b30050 fixed test db error
| * | |   64909f9 Merge branch 'develop' into feature/b

但是根据您的reflog,6b30050 实际上是 feature/a:
6b30050 HEAD@{43}: checkout: moving from develop to feature/a
e553bf0 HEAD@{44}: commit (merge): resolved merge conflicts

您没有在将输出复制到问题时不小心混淆分支名称,对吗?

仅查看引用日志

根据您原始的reflog,看起来您先将分支B合并到develop,然后尝试合并分支A,解决冲突,然后提交:

# Checkout develop
e553bf0 HEAD@{42}: checkout: moving from feature/a to develop

# Checkout branch A
6b30050 HEAD@{43}: checkout: moving from develop to feature/a

# Merge branch A? Resolve conflicts and commit
e553bf0 HEAD@{44}: commit (merge): resolved merge conflicts

# Checkout develop
7a0ad6b HEAD@{45}: checkout: moving from feature/a to develop

# Checkout branch A
6b30050 HEAD@{46}: checkout: moving from develop to feature/a

# Merge branch B into develop
7a0ad6b HEAD@{47}: merge feature/b: Merge made by the 'recursive' strategy.

# Move from branch B to develop (i.e. checkout commit 921ae46)
921ae46 HEAD@{48}: checkout: moving from feature/b to develop

查看已合并分支的历史记录

当你确定哪个合并是哪个时,可以使用以下命令查看分支日志:

git log --oneline --graph <sha of merge into develop>^2

这句话的意思是展示合并提交的第二个父节点的历史记录,如果你使用git flow,则该节点将是特性分支的末端。
如果有帮助的话,你还可以在用户的.gitconfig文件中使用别名同时查看develop分支的撰写日期和提交日期。
[alias]
    datelog = log --format=\"%C(yellow)%h%C(reset) %C(cyan dim)%ad %C(red bold)%cd %C(reset)%s\" --graph

它会首先以蓝色显示作者日期,然后以红色显示提交日期。使用提交日期,您可以确定分支AB是首先合并到develop中的。您还可以使用git log --format=fuller获取作者和提交日期的两个信息。

通常情况下请使用变基而非合并

最后,您知道如何进行rebase吗?通过使用rebase来同步而不是merge,您可以避免使用同步/合并提交来污染分支历史记录:

# From feature branch X, sync with develop
git rebase develop

# Switch to develop and merge
# (either fast-forward or merge commit, your choice)
git checkout develop
git merge --no-ff X

我错误地复制了 git log --oneline --graph develop 的内容。问题已经被编辑以显示正确的输出。关于 rebase vs merge,为什么要避免在分支历史中“污染”合并提交?在这种情况下,我的老板想知道提交是何时合并的,如果我使用 rebase,我将完全没有这些信息。感谢您的帮助,我也认为 e553bf0 是具有合并的提交,并且现在有更好的信息来支持这个理论。 - Eric Baldwin
@EricBaldwin,你不必对所有内容进行变基,例如将已完成的功能分支合并到develop中。但是,如果你需要将未完成的功能分支与develop同步,使用常规合并会使它们的历史记录变得更加复杂。在你的日志输出中,你将“Merge branch 'develop' into feature/a”合并了3次,“Merge branch 'develop' into feature/b”合并了2次。这些是你不需要的5个提交,它们会混淆你的历史记录。变基在频繁同步功能分支时表现出色,而无需添加这些额外的冗余合并提交。 - user456814
@EricBaldwin,如果您认为我的回答值得,请考虑给它点个赞。 - user456814

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接