[git]如何查看远程分支的来源自哪个分支

2022-04-14 14:59:29 +08:00
 RedBeanIce
git reflog show origin/offer_branch1

git reflog | grep offer_branch1

网上的方法都实验了一下,没有用

我的目标是,我远程有一个分支,我想知道他是从哪里来的(从 mater 呢,还是从哪里)

D:\git\offer>git reflog show origin/offer_branch1
c771b09ec (origin/offer_branch1, offer_branch1) refs/remotes/origin/offer_branch1@{0}: update by push
b6c0dc035 refs/remotes/origin/offer_branch1@{1}: update by push
4dd06da86 refs/remotes/origin/offer_branch1@{2}: update by push
9ca1762e4 refs/remotes/origin/offer_branch1@{3}: update by push
cdaf15d33 refs/remotes/origin/offer_branch1@{4}: update by push
14507a4ae refs/remotes/origin/offer_branch1@{5}: update by push
0f2911036 refs/remotes/origin/offer_branch1@{6}: update by push
01fe3bc21 refs/remotes/origin/offer_branch1@{7}: update by push
8b15c769d refs/remotes/origin/offer_branch1@{8}: update by push
756392784 refs/remotes/origin/offer_branch1@{9}: update by push
9537dd380 refs/remotes/origin/offer_branch1@{10}: fetch origin --recurse-submodules=no --progress --prune: storing head

$ git reflog | grep offer_branch1
c771b09ec HEAD@{0}: checkout: moving from offer_branch to offer_branch1
401ed70fa HEAD@{1}: checkout: moving from offer_branch1 to offer_branch
c771b09ec HEAD@{2}: checkout: moving from offer_temp3 to offer_branch1
a5ab1a592 HEAD@{3}: checkout: moving from offer_branch1 to offer_temp3
c771b09ec HEAD@{4}: checkout: moving from offer_temp2 to offer_branch1
f94f145bb HEAD@{5}: checkout: moving from offer_branch1 to offer_temp2
c771b09ec HEAD@{8}: checkout: moving from offer_temp2 to offer_branch1
f94f145bb HEAD@{9}: checkout: moving from offer_branch1 to offer_temp2
c771b09ec HEAD@{12}: checkout: moving from offer_temp3 to offer_branch1
062a48dbd HEAD@{58}: merge origin/offer_branch1: Merge made by the 'recursive' strategy.
f3b731970 HEAD@{65}: checkout: moving from offer_branch1 to offer_temp
cdaf15d33 HEAD@{70}: checkout: moving from offer_temp to offer_branch1
1b967ae32 HEAD@{73}: checkout: moving from offer_branch1 to offer_temp2
14507a4ae HEAD@{75}: checkout: moving from offer_temp2 to offer_branch1
f3b731970 HEAD@{78}: checkout: moving from offer_branch1 to offer_temp
8b15c769d HEAD@{82}: checkout: moving from offer_branch to offer_branch1
6327e6b40 HEAD@{88}: checkout: moving from offer_branch1 to offer_branch
756392784 HEAD@{90}: checkout: moving from offer_branch to offer_branch1
48b39e0be HEAD@{93}: checkout: moving from offer_branch1 to offer_branch
9537dd380 HEAD@{95}: checkout: moving from offer_branch to offer_branch1

2700 次点击
所在节点    git
15 条回复
wangsyi13
2022-04-14 15:07:40 +08:00
看不到吧,我理解是只能看到从哪个点分出来的,然后能看到这个点都在哪个分支上有,得出来结果不一定是唯一的
RedBeanIce
2022-04-14 16:42:05 +08:00
@wangsyi13 也差不多?我就想知道,我的这个分支,是从哪个分支的哪个点拉出来的
dablwow
2022-04-14 18:20:06 +08:00
是想实现什么目的?看描述有点像是 XY problem
libook
2022-04-14 18:30:48 +08:00
如果两个分支从某一次提交前的所有提交都一样,那么可以说这两个分支是同源的。

但 A 是从 B 分出来还是 B 是从 A 分出来,就没法说了。

举个例子,有一种操作是从 master 里分出分支 A ,然后没有任何提交又从分支 A 分出分支 B ,此时分支 B 算是从哪个分支分出来的?
在从 master 分出 A 之后,master 上有新提交,A 上没有,把 master merge 到 A 上,再从 A 分出新分支 B ,此时分支 B 算是从哪个分支分出来的?

这应该是个 XY problem ,可以说一下背景和需求。
tairan2006
2022-04-14 18:35:56 +08:00
用图形化工具看所有分支的 history ,可以看到是从哪里分出来的
kxuanobj
2022-04-14 18:56:00 +08:00
git merge-base 是你想找的吗?或者它的 --fork-point 参数?
kxuanobj
2022-04-14 18:56:56 +08:00
mingyuewandao
2022-04-15 10:27:27 +08:00
git branch -vv
RedBeanIce
2022-04-15 13:28:59 +08:00
@dablwow 我已经描述了,远程分支一共 80 个,其中有一个分支是我的,我想知道他是从哪个分支分出去的。这个分支目前都已经有多次提交( 20 来次),,但是由于忘记了或者是什么,我不知道他是从哪个分支分出去的(但是我记得是三个其中的一个,这三个分支目前都已经有多次提交)
RedBeanIce
2022-04-15 13:30:18 +08:00
@libook 请看最新,增加了一些描述,但是应该不是 xy

@tairan2006 请问可以推荐吗,可能 idea 的树形图没看懂
RedBeanIce
2022-04-15 13:34:57 +08:00
@kxuanobj 谢谢,我看了一下,但是好像是可以找到两个分支相同点的最后一次提交吗,,,假如我有一个分支 master ,然后有一个迭代分支,有三个人开发从迭代分支拉出去了三个,那么我在三个迭代分支任意一个用 merge-base ,master 或者是迭代主分支,那么应该都是最后一次提交,,那么我如何知道这个人是从迭代主分支拉的还是从 master 拉的呢
RedBeanIce
2022-04-15 13:35:40 +08:00
@mingyuewandao 您的回答是不对的,您这里展示的是本地分支以及远程分支的对应关系吧,我的描述中都是写的远程分支
wolfie
2022-04-15 14:36:38 +08:00
git log --no-walk --decorate
看起来像是该分支的 首次 commit ,merge 了其他分支后不清楚会不会生效。


https://stackoverflow.com/a/61258386
https://devops.stackexchange.com/questions/3321/what-git-command-could-be-used-to-check-when-a-remote-branch-was-created
SoloCompany
2022-04-15 19:03:30 +08:00
简单回答,不能

branch A: a -> b -> c
branch B: a -> b -> d
branch C: a -> b -> e

请问 C 是从 A 还是 B 分支出来的?

这是一个伪问题

正确的问题应该是, 找出 C 和一堆分支(比如 A / B) 的基点 (就是上面已经有人回答过的 merge-base)

曾经写过一个很简单的脚本完成这个任务

git merge-base HEAD `git for-each-ref refs/remotes/origin/master refs/tags | cut -c1-40`

可以找到当前分支和 master 以及所有 tags 的最近的交点, 至于这个交点应该判定给 master 还是某个 tags 那只能自己判断

当然可以基于这个脚本改进一下, for-each-tags 执行 git describe base-commit, 数字最小的就是可能的答案
kxuanobj
2022-04-21 19:39:32 +08:00
@RedBeanIce 因为 master 和迭代主分支可能共享同一个 commit 。这种时候从哪个分支拉都是一样的结果。

你可以认为分支是一个特殊的 TAG (实际上分支和 tag 在 git 底层是 reference ),他们只是标识一个 commit 。注意,这里是一个。

当你在 master 分支做一次提交后,git 会根据当前 master 这个 ref 找到 commit id ,将新 commit 的 parent 设置为这个 commit 。然后移动 master 这个 reference 到新 commit 。
从 git 角度来讲,分支只是标识一个 commit 而已,并不记录其它信息。真正有前后关联关系的是 commit 自己。
你甚至可以直接用 git reset --hard 去强行移动一个分支到任意一个 commit 。

所以如果你的仓库有这些 commit:
```
a->b->c
\ \->d
\-e
```
假设 master 分支指向 a ,迭代主分支指向 b ,开发分支分别指向 c 、d 、e 。此时,你想知道”c 是从 a 拉的,还是从 b 拉的“,这个问题是无解的。
因为开发分支 c 可以是从 a 拉的,但提交了 b 、c 两个 commit 。也可以是 b 这个 commit 已经存在,然后开发分支 c 只提交了 c 这个 commit 。
这两种情况在 git 记录里是一模一样的,无法区分的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX