git 日志包含另一个分支的提交,如何在分支之间分隔提交
git log contain commit for another branch, how to separate commit beween branch
如何区分分支之间的变化?
例如:
- 我创建了名为 BRANCH-1 的新分支,进行了更改并提交了更改
- 我创建了名为 BRANCH-2 的新分支,进行了更改并提交了更改。
- 我创建了名为 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.name
和 user.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
上? 全部,和以前一样。 只有 提交 I
在 develop
上不是这种情况。 全部 提交在 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、压缩和删除重复的形式。因此,如果提交 H
、I
和 J
都共享他们的大部分文件,他们实际上 共享 文件,即使每个文件都有自己的文件自己的完整副本。 (启用此共享因为内容是只读的。)
要查看任何给定提交中 更改的内容 ,Git 只需跟随提交的内部向后箭头指向其父项。那位家长也有一张快照。两次提交中 相同 的任何文件都不会更改,并且由于 Git 正在执行重复数据删除,因此可以非常快地找到它。对于 被 更改的文件,Git 比较它们的内容以查看更改的内容,并向您显示差异(这是按需计算的,未存储在提交中)。
要使分支“独立”,只需从足够远的地方开始它们。在这里,分支 topic
和分支 develop
都从 main
上的提交 H
开始。这意味着我们所做的更改,然后用于制作快照 I
或 J
,不会反映在另一个提交中,该提交从 H
.[=76 的文件副本开始=]
(稍后,如果我们去合并分支develop
和topic
,提交H
——最好的shared 提交,在 both 分支上——将非常重要。)
如何区分分支之间的变化? 例如:
- 我创建了名为 BRANCH-1 的新分支,进行了更改并提交了更改
- 我创建了名为 BRANCH-2 的新分支,进行了更改并提交了更改。
- 我创建了名为 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.name
和user.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
上? 全部,和以前一样。 只有 提交 I
在 develop
上不是这种情况。 全部 提交在 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、压缩和删除重复的形式。因此,如果提交 H
、I
和 J
都共享他们的大部分文件,他们实际上 共享 文件,即使每个文件都有自己的文件自己的完整副本。 (启用此共享因为内容是只读的。)
要查看任何给定提交中 更改的内容 ,Git 只需跟随提交的内部向后箭头指向其父项。那位家长也有一张快照。两次提交中 相同 的任何文件都不会更改,并且由于 Git 正在执行重复数据删除,因此可以非常快地找到它。对于 被 更改的文件,Git 比较它们的内容以查看更改的内容,并向您显示差异(这是按需计算的,未存储在提交中)。
要使分支“独立”,只需从足够远的地方开始它们。在这里,分支 topic
和分支 develop
都从 main
上的提交 H
开始。这意味着我们所做的更改,然后用于制作快照 I
或 J
,不会反映在另一个提交中,该提交从 H
.[=76 的文件副本开始=]
(稍后,如果我们去合并分支develop
和topic
,提交H
——最好的shared 提交,在 both 分支上——将非常重要。)