git - 如何让 git-push 永久跳过详分割支的提交?

标签 git git-branch git-push

对于一个存储库,我使用一个简单的脚本定期提交对文件的更改,以保留相当详细且非逻辑的历史记录,我希望将其保留用于我自己的统计目的(即我知道 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 分层构建了版本控制模型:

  1. 内容寻址数据库,可以根据内容的哈希值查找任意数据 block 。这些 blob 是不可变的,因为更改任何内容都会产生新的哈希值,因此永远不会更新现有项目。
  2. 有向非循环图,其中 blob 描述存储库的状态、一些元数据(日期、提交者、消息等)以及零个或多个父级。父级通过其不可变的哈希来寻址,并且反过来又成为新提交的哈希内容的一部分。
  3. 指向特定提交的指针,为它们提供更用户友好的名称。我们将其中一些称为“分支”,但它们仅指向一个提交;从那里,git 可以沿着父引用向后查找该分支“上”的所有提交。

从中,我们可以看到一些不可能的事情:

  • 让您的本地副本记录一次提交的两个父项,但 github 只显示同一提交的一个父项 - 一组不同的父项会给出不同的哈希值,因此没有任何东西会将其识别为相同的提交。
  • 记录了父级提交,但不将提交推送到 autocommit 分支上 - git 不知道它在历史记录中找到的 merge 中的分支名称,它只是将所有父级提交视为一部分它所追溯的历史。
  • 推送所有可在一个分支上访问的提交,除了那些也可在另一分支上访问的提交。这仍然不是一个足够强大的定义,因为最终您将在创建 autocommit 分支之前达到历史记录中的提交,并且 git 再次不知道在哪里在发生的历史中。
  • 即使您可以定义不想推送的提交列表,工具也不会很乐意找到对显然不存在的父提交的引用,并且可能会假设您是存储库已腐败。

我只能想到两个选择:

  • 记录自动提交分支的正常 merge ,并接受历史记录中显示的自动提交。
  • 像现在一样压缩提交,但创建自己的工具来记录您压缩的自动提交,并允许您查找它们,确保没有遗漏等

关于git - 如何让 git-push 永久跳过详分割支的提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65059268/

相关文章:

git - 如何 merge 回远程分支

python - AWS Elastic Beanstalk 无法使用 requirements.txt Git Pip 安装 Python 包

Git 没有获取我更改的文件

git - 如何撤消分支推送到 master

git - 与 git add -p 相反

git - 如何缓存 github repos 以便第二个 git clone 将使用缓存而不是 github repo

git - 还原 git 上次提交并将其保存在不同的分支中

git - merge 和推送到远程时,有什么方法可以忽略本地提交历史记录吗?

git - 将本地分支推送到父级的远程跟踪分支

git - pull -提交-推还是提交- pull -推?