git 日志包含另一个分支的提交,如何在分支之间分隔提交

git log contain commit for another branch, how to separate commit beween branch

如何区分分支之间的变化? 例如:

  1. 我创建了名为 BRANCH-1 的新分支,进行了更改并提交了更改
  2. 我创建了名为 BRANCH-2 的新分支,进行了更改并提交了更改。
  3. 我创建了名为 BRANCH-3 的新分支,进行了更改并提交了更改。

我的问题是,BRANCH-2 包含来自 BRANCH-1 的提交和更改

和 BRANCH-3 包含来自 BRANCH-1 和 BRANCH-2 的提交和更改

如何在每个分支上分离更改和提交?

谢谢

这些提交实际上在 所有 个分支上。

考虑以下问题。我们从一个名为 main 的分支开始。名称 main 定位了一个特定的提交,具有一个特定的哈希 ID H。 (真正的散列 ID 是一些丑陋的随机外观,因此使用大写字母作为替代。)

提交 H 包含两件事:

  • 源快照——每个文件在最新提交中出现的完整副本;和
  • 一些 元数据 包含提交者的姓名和电子邮件地址等内容。

提交 H 中的元数据包含一些 较早 提交的哈希 ID。我们说 H 指向 较早的提交,名称 main 指向 提交 H :

            <-H   <--main

散列 ID inside H 本身就是其他提交的散列 ID,所以让我们绘制那个提交,我们称之为 G

        <-G <-H   <--main

当然,较早的提交 G 指向一些更早的提交 F:

... <-F <-G <-H   <--main

等等。最终我们 运行 从“较早的”提交中退出,因为我们命中了第一个。稍微懒惰画箭头,这给了我们一个更完整的画面:

A--B--C--D--E--F--G--H   <-- main (HEAD)

名字HEAD告诉我们我们做了一个git checkout main

现在让我们添加一个新的分支名称,例如develop。 Git 要求 分支名称 包含一些有效的现有提交的哈希 ID。我们应该使用这些提交中的哪一个?最明显的候选者是当前和最新的提交,H:

A--B--C--D--E--F--G--H   <-- develop, main (HEAD)

如果我们现在检查 develop,特殊名称 HEAD,它会记住 分支名称 当前分支, 移动:

A--B--C--D--E--F--G--H   <-- develop (HEAD), main

我们仍在使用 提交H。我们只是 通过 名称 develop.

使用它

提交在哪个分支上?很明显,所有提交都在两个分支

当我们进行 new 提交时,Git 将:

  • 将所有源文件打包为一个新的快照;
  • 添加一些元数据,使用来自 user.nameuser.email 的正确姓名和电子邮件地址(这些不可能是谎言:他们一定是正确的!),“现在”作为日期- 时间等等。

Git 将从我们或 -m 参数中获取日志消息,并将使用 当前提交 作为新提交的位置将向后指向:

                       I
                      /
A--B--C--D--E--F--G--H   <-- main

因为我们是 on branch develop,正如 git status 所说,Git 将存储 new commit I 的哈希ID 到附加了 HEAD 的名字,develop,像这样:

                       I   <-- develop (HEAD)
                      /
A--B--C--D--E--F--G--H   <-- main

哪些提交在分支 develop 上? 全部,和以前一样。 只有 提交 Idevelop 上不是这种情况。 全部 提交在 develop。只是通过 H 的提交是 main 上也是

如果我们现在 git checkout main,Git 将:

  • 删除所有提交的文件 I;
  • 提取所有提交的文件H;和
  • HEAD 附加到 main

结果是:

                       I   <-- develop
                      /
A--B--C--D--E--F--G--H   <-- main (HEAD)

存储库中的提交和分支没有任何变化,除了附加HEAD的地方;但我们的工作树(和Git的索引或暂存区)现在已更新以再次匹配提交H .

如果我们现在创建另一个新的分支名称 topic,并切换到它,我们得到:

                       I   <-- develop
                      /
A--B--C--D--E--F--G--H   <-- main, topic (HEAD)

如果我们现在进行另一个新提交,我们得到:

                       I   <-- develop
                      /
A--B--C--D--E--F--G--H   <-- main
                      \
                       J   <-- topic (HEAD)

这就是分支的全部内容,在 Git 中:它们是 查找提交的方法

重要的是提交。每个提交存储 每个 文件的完整快照,以特殊的、只读的、Git-only、压缩和删除重复的形式。因此,如果提交 HIJ 都共享他们的大部分文件,他们实际上 共享 文件,即使每个文件都有自己的文件自己的完整副本。 (启用此共享因为内容是只读的。)

要查看任何给定提交中 更改的内容 ,Git 只需跟随提交的内部向后箭头指向其父项。那位家长也有一张快照。两次提交中 相同 的任何文件都不会更改,并且由于 Git 正在执行重复数据删除,因此可以非常快地找到它。对于 更改的文件,Git 比较它们的内容以查看更改的内容,并向您显示差异(这是按需计算的,未存储在提交中)。

要使分支“独立”,只需从足够远的地方开始它们。在这里,分支 topic 和分支 develop 都从 main 上的提交 H 开始。这意味着我们所做的更改,然后用于制作快照 IJ,不会反映在另一个提交中,该提交从 H.[=76 的文件副本开始=]

(稍后,如果我们去合并分支developtopic,提交H——最好的shared 提交,在 both 分支上——将非常重要。)