将git孤立文件用作文件夹并保留历史记录

将git孤立文件用作文件夹并保留历史记录,git,orphan,Git,Orphan,我在不同的存储库中有几个项目,我想在同一个repo下与不同的孤立分支合并。 为此,我创建了一个新的存储库并在其中启动它 如何获取现有回购协议,将其作为孤立分支导入并保留历史记录 是否可以使用作为不同文件夹打开的两个孤立分支?假设我有两个孤立分支,我想同时处理这两个分支,可能吗?我有2个以上,我想与单一的git用户界面打开工作,所以它将更有效地开发。今天我检查了每个存储库。在我将其合并到同一回购协议下之后,我仍然需要并行处理所有分支机构 您正在寻找“git worktree” (可选)创建一个裸存

我在不同的存储库中有几个项目,我想在同一个repo下与不同的孤立分支合并。 为此,我创建了一个新的存储库并在其中启动它

  • 如何获取现有回购协议,将其作为孤立分支导入并保留历史记录

  • 是否可以使用作为不同文件夹打开的两个孤立分支?假设我有两个孤立分支,我想同时处理这两个分支,可能吗?我有2个以上,我想与单一的git用户界面打开工作,所以它将更有效地开发。今天我检查了每个存储库。在我将其合并到同一回购协议下之后,我仍然需要并行处理所有分支机构

  • 您正在寻找“git worktree”

  • (可选)创建一个裸存储库;e、 g

    mkdir .repo/
    git clone --bare .../project .repo/project.git
    
  • 在此存储库中创建工作树

    git -C .repo/project.git worktree add `pwd`/project-A branch-A
    git -C .repo/project.git worktree add `pwd`/project-B branch-B
    
  • 您可以跳过第1步,从现有的非裸存储库创建工作树,但如何简化操作分支项目是长期存在的。

    TL;博士 我有2个以上的[分支],我想使用单git UI打开

    这是否可能,如果可能,如何实现,取决于用户界面。一般来说,询问Git不会给你一个答案。命令行的答案是使用
    git-worktree
    (git2.15或更高版本是非常理想的)

    长的
  • 如何获取现有回购协议,将其作为孤立分支导入并保留历史记录
  • 你真的不知道。这个操作和问题可能毫无意义,因为我怀疑你指的是Git所指的孤立分支。读到最后,看看它是否有意义

    什么是Git存储库? Git存储库本质上由两个数据库组成。一个数据库只保存Git对象,其中最有趣的一个称为commit,每个commit代表所有文件的完整快照。1另一个数据库保存名称分支名称,如
    master
    和标记名称,如
    v2.1
    ,这些名称就是您,至少最初是Git,将发现有趣的提交

    每次提交,再次表示所有文件的快照;提交不包含更改是由其哈希ID唯一标识的。哈希ID是一个大而丑陋的字母和数字字符串,看起来是随机的,但实际上是提交的全部内容的加密校验和:快照,加上告诉您谁创建了快照(名称和电子邮件地址)、何时(时间戳)、为什么的元数据(日志消息),等等。由于每次提交都存储其直接前一次提交或父提交的实际哈希ID,Git很容易从最后一次提交开始并向后工作:

    ... <-F <-G <-H   <-- master
    
    这里,提交
    F
    和更早的版本在两个分支上,而提交
    G-H
    仅在
    master
    上,而
    I-J
    仅在
    develope
    上。如果我们随后将
    J
    合并到
    master
    中,我们会得到一个稍微特殊的提交:

              G--H
             /    \
    ...--E--F      K  <-- master
             \    /
              I--J   <-- develop
    
    对于由名称
    master
    标识的提交中的每个文件,您现在拥有的不是该文件的两个而是三个副本:

    • HEAD:file
      是保存在提交中的文件。无法更改:它是Git-ified、冻结和只读的。使用
      Git-show-HEAD:file
      查看它

    • :file
      是存储在索引中的文件。它可以更改!它是Git-ified的,但您可以随时用新副本替换它。使用
      Git-show:file
      查看它

    • 文件
      是存储在工作树中的文件。它是一个普通文件,您可以使用它执行任何操作。使用普通(非Git)命令查看或更改它,或者执行任何操作

    如果您更改了一些文件,如
    文件
    ,并且希望Git在下一次提交中存储新版本,则现在必须更新建议的下一次提交:

    git add file
    
    这会将工作树文件复制到索引中,用工作树中文件的新Git化副本覆盖
    :file

    因此,索引始终包含建议的下一次提交。您可以使用
    git add
    更新此建议

    请注意,如果您
    git checkout
    其他分支,您将使用与您刚刚签出的提交相匹配的其他提交建议替换下一个提交建议。(此规则有一些例外;请参阅。)这反过来意味着索引和工作树实际上是一对:索引索引工作树。当您更改工作树时,通过更改周围的一些文件,您需要通过添加这些文件来更新索引

    当您运行
    git commit
    时,git所做的是:

    • 保存您的姓名和电子邮件地址
    • 保存当前时间(新提交的时间戳)
    • 收集来自您的日志消息,进入新提交
    • 使用当前提交的哈希ID作为父哈希ID
    • 将所有这些以及索引中的Git-ified文件保存到一个新提交中,该提交会自动获取一个新的哈希唯一哈希ID(通过对所有这些数据计算加密校验和)
    • 将新提交的哈希ID写入当前分支
    也就是说,如果您有:

    ...--F--G--H   <-- master
    
    让我们创建一个名为
    feature/short
    的新分支:

    git checkout -b feature/short
    
    ...--F--G--H--I   <-- master
                   \
                    J   <-- feature/short (HEAD)
    
    我们现在看到的是这样的:

    ...--F--G--H--I   <-- master, feature/short (HEAD)
    
    ...--F--G--H--I   <-- master
                   \
                    J   <-- feature/short
    
    feature/tall (HEAD)
    
    K
    
    J
    开始的历史可以追溯到
    I
    ,然后是
    H
    ,依此类推。新提交位于新分支的顶端,
    feature/short
    。我们的索引现在匹配提交
    J
    和工作树,并且
    HEAD
    仍然连接到分支
    feature/short

    您现在已经了解了关于分支的所有内容,除了孤儿分支,我们稍后将介绍它们

    添加工作树
    git checkout -b feature/short
    
    ...--F--G--H--I   <-- master, feature/short (HEAD)
    
    ...--F--G--H--I   <-- master
                   \
                    J   <-- feature/short (HEAD)
    
    git checkout --orphan feature/tall
    
    ...--F--G--H--I   <-- master
                   \
                    J   <-- feature/short
    
    feature/tall (HEAD)
    
    K
    
    ...--F--G--H--I   <-- master
                   \
                    J   <-- feature/short
    
    K   <-- feature/tall (HEAD)