对于一个存储库,我使用一个简单的脚本定期提交对文件的更改,以保留相当详细且非逻辑的历史记录,我希望将其保留用于我自己的统计目的(即我知道 git rebase
,但无论如何我都想保留这段非逻辑历史)。目前我只是致力于一个单独的分支 autocommit
并使用
git checkout master
git merge --squash autocommit
git commit
git checkout autocommit
git merge --ff-only master
对于“适当”的 promise ,保留 master
分支整洁,同时保持与 autocommit
的关系-分支。所以我有这样的历史
| * 95e4189 Merge branch 'main' into autocommit
| |\
| |/
|/|
* | 040386a <= created via git merge --squash autocommit
| * 72bc5a5 autocommit
| * 9aaf5a6 autocommit
| * ea758c0 autocommit
| * 7ff1de8 autocommit
但我真正想要的是git merge autocommit --edit
进入master
正确链接到历史记录。但是,我不想git push
autocommit
中的任何内容分支(或带有所述消息的任何提交,如果这更容易管理)。但是我想这基本上会破坏推送的存储库,因为部分提交历史记录将无法访问。所以我的问题是:
- 我怎样才能做到这一点? IE。一种
git push --skip autocommit
- 我应该怎么做?挤压提交版本似乎不是最佳的
对于可视化,我目前有:
A1 -> A2 -> A3--=> A3' -> A4 -> ... [autocommit]
/ ↓' /
M1-----------> M2 -----> ... [master]
哪里↓'
表示git merge --squash
这意味着A3
不是 M2
的父级但只有M1
是,并且 A3'
只是 merge 回来 M2
以更好地跟踪连接。我认为我想要的只是
M1--------------=> M2 ---> .... [master]
\ /
A1 -> A2 -> A3 -> A4 (or maybe A3' first merging M2 back) [autocommit]
但没有任何提交 A1
等来自autocommit
分支不断被推。
最佳答案
要了解可能发生的情况,了解一点 git 的工作原理很有用。从根本上来说,git 分层构建了版本控制模型:
- 内容寻址数据库,可以根据内容的哈希值查找任意数据 block 。这些 blob 是不可变的,因为更改任何内容都会产生新的哈希值,因此永远不会更新现有项目。
- 有向非循环图,其中 blob 描述存储库的状态、一些元数据(日期、提交者、消息等)以及零个或多个父级。父级通过其不可变的哈希来寻址,并且反过来又成为新提交的哈希内容的一部分。
- 指向特定提交的指针,为它们提供更用户友好的名称。我们将其中一些称为“分支”,但它们仅指向一个提交;从那里,git 可以沿着父引用向后查找该分支“上”的所有提交。
从中,我们可以看到一些不可能的事情:
- 让您的本地副本记录一次提交的两个父项,但 github 只显示同一提交的一个父项 - 一组不同的父项会给出不同的哈希值,因此没有任何东西会将其识别为相同的提交。
- 记录了父级提交,但不将提交推送到
autocommit
分支上 - git 不知道它在历史记录中找到的 merge 中的分支名称,它只是将所有父级提交视为一部分它所追溯的历史。 - 推送所有可在一个分支上访问的提交,除了那些也可在另一分支上访问的提交。这仍然不是一个足够强大的定义,因为最终您将在创建
autocommit
分支之前达到历史记录中的提交,并且 git 再次不知道在哪里在发生的历史中。 - 即使您可以定义不想推送的提交列表,工具也不会很乐意找到对显然不存在的父提交的引用,并且可能会假设您是存储库已腐败。
我只能想到两个选择:
- 记录自动提交分支的正常 merge ,并接受历史记录中显示的自动提交。
- 像现在一样压缩提交,但创建自己的工具来记录您压缩的自动提交,并允许您查找它们,确保没有遗漏等
关于git - 如何让 git-push 永久跳过详分割支的提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65059268/