代码之家  ›  专栏  ›  技术社区  ›  igniteflow

Git:如何克隆第一个提交?

git
  •  13
  • igniteflow  · 技术社区  · 14 年前

    有人能告诉我如何克隆第一个提交吗?我不想删除最近的提交,只需复制初始状态,这样我就可以获取一些文件。

    5 回复  |  直到 6 年前
        1
  •  9
  •   Cascabel    14 年前

    为了回答我认为你想问的问题:

    您可以通过以下方式使整个存储库进入第一次提交的状态:

    git checkout <commit SHA1>
    

    当你把事情弄得一团糟之后,你就可以做了。 git checkout master 回到你原来的地方。

    而且,您可以从第一次提交时开始将单个文件置于其状态,方法是:

    git checkout <commit SHA1> <file or directory> ...
    

    再说一遍,做完之后,你可以 git checkout master <file or directory> 回到你原来的地方。

    不需要“克隆”提交(我假设您是指克隆存储库,并检查第一次提交?)。当然,如果出于某种原因,您无法忍受修改存储库中的任何文件(例如,不想使构建过期),您当然可以克隆它,然后在克隆的repo中执行完全相同的操作。

        2
  •  14
  •   mpe    6 年前

    更新的2018年答案:使用你自己的符号参考,即标签。并开始使用 describe 以及带注释的标签。

    git tag -a -m "Initial version" root $( git rev-list --all | tail -n 1 )
    git describe
    

    从没有收到标签但偶尔从2011年起承诺使用上述标签的回购的输出说明:

    root-1090-g88a80e93
    

    另一方面,如果你想放弃所有其他的历史,我从来没有 如果需要,复制初始集就足够容易了。如果您想引用原始的“根”提交和戳,我可以看到用例。也许看看bfg是如何工作的, --depth 或Git 2.19的新版本 clone --filter . 〔3〕


    I think I want to do the same thing. 签出初始提交,然后从那里进行分支。我不确定是否接受了答案。但我想它可以(部分)解决最初的问题。不过,在阅读了这个线程之后,我将使用一些bash脚本

    git log --pretty=oneline  master | tail -1
    

    我希望有一些提交或树型的参考。也许可以列出标记为根的节点,但我想Git本身不会跟踪这个。因此,此方法只在只有一个根提交的存储库上工作。

    2017年和2018年的更新是,使用git rev list,可以更好地选择git日志,但也存在同样的问题。它们只使用提交列表的尾随项。

    对于只有一个根的存储库,您可以使用以下方法签出“根提交”,它适用于大多数存储库。但这是一个黑客行为,最好检查一下您的系统为什么需要在哪里标记根提交。只需标记或记录即可。

    您可以使用以下命令用一个根签出repo中的第一个提交:

    git checkout $( git rev-list --all | tail -n 1 )
    

    或(Git<1.8.1):

    git checkout $( git log --pretty=oneline | tail -n 1 | sed 's/ .*$//' )
    

    git-revlist 而且 Using git, how do I go back to first commit then go through the history? .

    〔3〕:

        3
  •  12
  •   Jesse Buchanan    10 年前

    如果您所说的“第一次提交”,是指没有任何父级本身的分支的父级提交,那么您希望使用git rev列表来完成这项工作。只使用

    git rev-list --max-parents=0 HEAD

    这将获得当前头部的“初始提交”。如果您列出了master或任何其他子修订规范,请使用master。把那个包起来 $(...) 为了在表达式中使用它,例如:

    git checkout $(git rev-list --max-parents=0 HEAD)

        4
  •  0
  •   ramwin    6 年前

    使用命令:

    git fetch --depth=1 ../testrepo/.git $SHA1
    

    这将只克隆特定的提交。你可以结账 answer 了解更多详细信息。

        5
  •  -1
  •   brycemcd    14 年前

    我认为您需要做的只是从您想要的原始提交创建一个新的分支,检查这个分支,然后再合并到您正在处理的分支的头部。

    如果ABCXYZ…是您想要的提交的sha1,并且您正在master分支中工作,这通常是您想要做的:

    git branch oldskool abcxyz... # creates a new branch called oldskool from the commit
    git checkout oldskool
    #make changes
    git rebase master #bring the oldskool branch up to the HEAD of the master branch (shouldn't overwrite the changes in the files you edited)
    git checkout master
    git merge oldskool