我在一个存储库中有两个分支:branch_1和branch_2。
场景 1
有人在branch_1中添加了一个文件,比如说first_file.txt。要获得branch_2中的此文件 - 我只需提出一个拉取请求,一旦 PR 合并,我将branch_2该文件。
场景 2
有人在branch_1中添加了一个文件,比如说first_file.txt。 现在要获取此文件,我在终端上执行以下操作:
(on branch branch_1) $ git pull
(on branch branch_1) $ git checkout branch_2
(on branch branch_2) $ git checkout branch_1 first_file.txt
and then performs git add,commit and push.
在上述两种情况下,我在我的分支 (branch_2( 中获取文件。 但问题是当我看到 git 日志(或 git 门户上的历史记录(时,它们完全不同。
对于场景 1:它显示文件来自某人。
对于场景 2:它显示文件已由我签入。
有没有解决方案可以使用命令行将文件从一个分支复制到另一个分支,从而确保历史记录安全?
谢谢
Git 存储库中唯一的历史记录是存储库中的一组提交。
每个提交都包含每个文件的完整快照,或者更确切地说,包含该提交中的每个文件的完整快照。 也就是说,假设我们从一个简单的存储库开始,其中一个提交包含一个文件:
A <-- master (HEAD)
(A
代表一些原始哈希ID(。 提交A
包含一个README.md
文件,不包含其他任何内容。
现在,您进行一个新提交,在其中添加一个新文件,例如main.py
:
A--B <-- master (HEAD)
新提交B
包含两个文件:README.md
- 与提交A
中的副本相同 - 和main.py
。
此存储库中的历史记录是 提交B
导致返回提交A
。 这是唯一的历史。
在您的情况下,您有一个更复杂的启动设置。 简化后,它可能看起来像这样:
I--J <-- branch_1
/
...--G--H
K <-- branch_2
提交H
是两个分支在历史方面连接的第一个提交:从J
向后的历史J
、I
、H
、G
等等。 从K
开始的历史有K
、H
、G
等等。
在提交到I
和你的提交到K
中,没有名为first_file.txt
的文件,但在提交J
中,其他人添加了这个新文件。 因此,提交J
具有I
拥有的所有文件,以及这个新文件。 从J
向后查看历史记录,I
和J
之间的区别在于添加了文件。
如果现在在包含该文件的K
之后进行新的提交L
,则提交K
和新提交L
之间的区别在于添加了此文件。 因此,从L
向后查看的历史记录显示了添加的文件。
这就是 Git 的工作方式。 没有文件历史记录,只有提交历史记录。 您可以要求 Git 生成提交历史记录的子集,以跟踪哪些提交在特定文件中具有活动 - 但由于提交历史记录将是该文件与K
相比新出现在L
中,这就是您将看到的。