V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AndyAO
V2EX  ›  问与答

难题:如何在 master 分支中创建多个起始 commit?

  •  1
     
  •   AndyAO · 2021-08-23 10:59:21 +08:00 · 1490 次点击
    这是一个创建于 1189 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 master 分支中,创建多个起始 commit(它们都没有 parent)。

    仓库地址为 git://github.com/ossxp-com/gitdemo-commit-tree.git ,示意图如下 ↓

    gitdemo-commit-tree.git

    这该如何实现?

    这也许是个很简单的要求,但我真的想了很长时间,也没搞清楚到底怎么做,所以来寻求帮助。


    1. 直接 commit,会将当前 commit 作为 parent
    2. 查阅 commit 和 checkout 相关文档,没有发现自己想要的选项,也许是我忽略了什么
    第 1 条附言  ·  2021-08-23 11:30:58 +08:00

    问题已经解决,感谢 @Kobayashi

    可以通过下列命令重现:

    Remove-Item '*' -Force
    '.git'| Remove-Item -Force -Recurse
    git init
    'text' > "A.txt"
    git add -A;git commit -a -m 'A'
    git checkout --orphan 'new_branch'
    'text' > "B.txt"
    git add -A;git commit -a -m 'B'
    git checkout master
    git merge --no-ff --allow-unrelated-histories 'new_branch'
    git log --all --decorate --oneline --graph
    
    PS>git log --decorate --oneline --graph
    *   3805411 (HEAD -> master) Merge branch 'new_branch'
    |\
    | * b2af1fd (new_branch) B
    * 70e2a07 A
    
    第 2 条附言  ·  2021-08-23 11:50:58 +08:00

    感谢 @clrss 提供了另一种方法!

    使用 git subtree add 的确可以实现多个根 commit。

    PS>git log --all --decorate --oneline --graph
    *   50f7c25 (HEAD -> master) Add 'new_pre/' from commit '47b72dbdebd593bde75a80df7ff28544b2982ff1'
    |\
    | * 47b72db (new_branch) B
    * fd9bb52 A
    

    这个命令好像用的不是太多,之前从来没见过。

    它好像是将两个 commit 合并之后,然后将结果放到子文件夹中。

    ⚠ 如果看工作树的具体细节,会发现合并之后的结果与给出的仓库有很大出入。

    Git\TDS\temp
    ├──new_pre
    │  ├──A.txt
    │  └──B.txt
    └──A.txt
    
    
    10 条回复    2021-08-23 11:18:56 +08:00
    baiyi
        1
    baiyi  
       2021-08-23 11:06:52 +08:00
    一个分支只能有一个起始 commit,你的需求是不是可以换个思路解决。比如多个分支?
    JKeita
        2
    JKeita  
       2021-08-23 11:08:57 +08:00
    一个分支怎么可能多个根节点。
    AlphaTr
        3
    AlphaTr  
       2021-08-23 11:08:57 +08:00
    git checkout --orphan 加个参数?
    AndyAO
        4
    AndyAO  
    OP
       2021-08-23 11:09:48 +08:00
    @baiyi #1

    **已经有这样的仓库存在,图片和具体地址,问该如何实现。**

    上述仓库已经多个起始 commit 吗,从图上可以很明显的看出来,而且已经测试过那 5 个节点,根本都没有 parent 。
    AndyAO
        5
    AndyAO  
    OP
       2021-08-23 11:10:27 +08:00
    @JKeita #2

    已经给出了仓库和示意图,如果感觉有问题,可以 clone 后检查。
    Kobayashi
        6
    Kobayashi  
       2021-08-23 11:10:56 +08:00   ❤️ 1
    你没理解分支,这明显是多个分支合并的结果。

    1. 创建多个无共同父节点分支,又称孤儿分支。 git checkout --orphan branch-name
    2. 合并分支 git merge --no-ff --allow-unrelated-histories branch-name
    baiyi
        7
    baiyi  
       2021-08-23 11:12:59 +08:00
    @AndyAO #4 你是指那几个 tag 吗?
    AndyAO
        8
    AndyAO  
    OP
       2021-08-23 11:13:01 +08:00
    @AlphaTr #3

    这是在相同的分支内发生的事情,不涉及到其他的分支啊,所以孤儿分支没什么呢。
    Kobayashi
        9
    Kobayashi  
       2021-08-23 11:16:09 +08:00
    > 这是在相同的分支内发生的事情,不涉及到其他的分支啊,所以孤儿分支没什么呢。
    @AndyAO 没明白你在说什么。正常分支是要求有共同父节点的。这几个有多个起点,其他几个分支不可能是从主分支创建出来的,必然是多个孤儿分支合并结果。
    clrss
        10
    clrss  
       2021-08-23 11:18:56 +08:00   ❤️ 1
    git subtree add
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   933 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 19:50 · PVG 03:50 · LAX 11:50 · JFK 14:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.