Git 我从哪里分支?

Git 我从哪里分支?,git,branch,git-branch,Git,Branch,Git Branch,我回到了一个老项目,我运行了nicegit status,以了解发生了什么,我注意到分支太多了!我想在再次开始这项工作之前做些家务活,但我不确定哪个部门来自哪个部门 例如,“branchA”是否源于“develop”?“branchB”是从“master”还是“branchA”派生出来的 如何回答上面的示例问题?对于这一点没有规范的答案,因为分支只是指向DAG中某些提交的指针。例如,master和foo可能指向同一个提交;如果然后从foo创建分支,它实际上与从master创建分支相同 这就是说,

我回到了一个老项目,我运行了nice
git status
,以了解发生了什么,我注意到分支太多了!我想在再次开始这项工作之前做些家务活,但我不确定哪个部门来自哪个部门

例如,“branchA”是否源于“develop”?“branchB”是从“master”还是“branchA”派生出来的


如何回答上面的示例问题?

对于这一点没有规范的答案,因为分支只是指向DAG中某些提交的指针。例如,
master
foo
可能指向同一个提交;如果然后从
foo
创建分支,它实际上与从
master
创建分支相同


这就是说,如果您可视化提交图(通过
gitk
或其他图形历史工具),您可以大致了解分支点在提交图中的位置,以及各种分支指针指向的位置。

您可以使用图形树查看器,我使用
gitg
查看分支和差异,尽管我大部分时间都在使用命令行进行实际工作。

如果您使用的是Windows或Linux(带有GUI),只需安装漂亮的git扩展即可。他们可以完美地将分支/合并树形象化

您好,

显示了作为两个分支的共同祖先的提交


简单用法:
gitmergebase
显示两个分支的公共提交。

遵守命名约定,避免所有混淆

当从
master
创建分支时—比方说,要实现电子邮件功能—可以将其命名为
master\u emailfeature
。然后,如果需要从该分支创建一个子分支以实现电子邮件的ssl,则可以将其命名为
master\u emailfeature\u sslandtls


只需查看分支的名称,就可以清楚地知道哪个分支是从哪个分支创建的。

如果您想知道本地分支来自哪个远程分支,此命令可以提供一些信息

git remote show origin

向下滚动,直到看到“为“git pull”配置的本地分支:”并且在下面,将显示所有本地分支的列表,每个远程分支都将与之合并。

如果您已经在一个分支上,那么您可以得到提交,即它从另一个分支分叉的点,比如说
master
,如下所示:

git merge-base --fork-point master
然后使用git show获取提交消息。 如果您没有提交ID,那么这个分支就不是来自于此

例如,我不确定是从
dev
还是
master
分叉:

$ git checkout my-branch
$ git merge-base --fork-point master
$ git merge-base --fork-point dev
1770f75fa178df89a40ddc5f13ecd6bc597c17df
$ git show 1770f75fa178df89a40ddc5f13ecd6bc597c17df
commit 1770f75fa178df89a40ddc5f13ecd6bc597c17df (origin/popup-stack-12, dev)
Merge: 37f79cf f8a9795
Author: Superman <super@example.com>
Date:   Sun Mar 29 23:14:40 2020 +0000
...
$git签出我的分支
$git merge base--分叉点主节点
$git merge base--分叉点开发
1770f75fa178df89a40ddc5f13ecd6bc597c17df
$git显示1770f75fa178df89a40ddc5f13ecd6bc597c17df
提交1770f75fa178df89a40ddc5f13ecd6bc597c17df(源/弹出堆栈-12,开发)
合并:37f79cf f8a9795
作者:超人
日期:Sun Mar 29 23:14:40 2020+0000
...

我从开发人员那里派生了这个分支。

命令行git可执行文件还能够显示分支和合并的基本树,使用--graph选项创建git日志。您可以使用其他选项对其进行各种漂亮的增强。试穿以下尺码:

最简单的:git日志——图形

尼斯:git日志--图形--装饰--装饰简化--颜色--单线--日期=本地


完整的monty:git log--graph--decoration--simplifyby decoration--color--oneline--date=local--pretty=format:“%C(auto)%h%d%C(reset)%s(%C(cyan)%ad%ae%C(reset))”

正如其他人提到的,没有标准答案,但是
git reflog
在某些情况下可以通过显示您的本地git历史记录来帮助您:

a1b2c3d4 (HEAD -> my_current_working_branch) HEAD@{0}: pull origin master: Merge made by the 'recursive' strategy.
aaaa1111 (origin/my_current_working_branch) HEAD@{1}: commit: Added bar
def123aa (forgotten_branch) HEAD@{2}: checkout: moving from forgotten_branch to my_current_working_branch

在这种情况下,我可以看到我从
遗忘的分支机构
分支到
我的当前工作分支机构
,并在中合并了
主分支机构


它不会总是提供您所需的信息,但在某些情况下会有所帮助。

如果使用git的“嫁接”,您可以创建循环,使其不再是DAG。显然这很糟糕。:-)(毫不奇怪……尽管它应该基本上“正常工作”,但我并没有尝试过。)我怀疑您也可以使用
过滤器分支创建循环,但我也没有尝试过。Straighforward merge似乎至少拒绝创建循环的尝试。可能重复的可能重复确实有点脆弱-它可能正是某些分支所需要的,但可能并不涵盖所有内容。很可能应该链接到它,抱歉,这无法完成。如果你想了解你的分支,git不是合适的工具。分支(在git中)是短暂的,因此非常不可靠。图形工具可以给你提示,但没有答案。正如它所说的,你提供了两个提交ID来进行比较。因此,如果在某个项目中有master和devel分支,
git merge base master devel
将告诉您作为这两个分支的共同祖先的提交。此命令仅返回提交哈希。关于更多信息,例如:git log-1提交散列?问题是关于分支点,而不是向何处推送和从何处拉取更改。它帮助了我:)