gpt4 book ai didi

git - git-强制更新。发生了什么?

转载 作者:太空狗 更新时间:2023-10-29 13:54:38 25 4
gpt4 key购买 nike

当我做git push --force时,我看到git的下一个输出:

$ git push --force
Counting objects: 21, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (21/21), done.
Writing objects: 100% (21/21), 2.36 KiB | 1.18 MiB/s, done.
Total 21 (delta 14), reused 0 (delta 0)
To repo:/v1/repos/DB-Hooks
+ 7b4eaa2...1295174 reimplement -> reimplement (forced update)

$ git log --graph --decorate --pretty=oneline --abbrev-commit 7b4eaa2...1295174
* 1295174 (HEAD -> reimplement) TEMPORARY
* 0f477bf Prettify code
* 09630ef Setup $DB::single
* 7b4eaa2 TEMPORARY

我怎样才能从这个日志中查到这里发生了什么?
我犯了什么罪?(在“我的”下,我指的是在本地存储库中所做的更改,包括修订的提交)
哪些提交被替换,哪些被替换?
哪些提交已从远程删除?(我在本地存储库中引入了哪些更改)

最佳答案

我犯了什么罪?
你需要定义“我的”。承诺是“你的”是什么意思?
编辑:您在“我的”下添加的我是指在本地存储库中所做的更改,包括修改的提交。首先,请始终记住提交是快照;要将快照转换为更改集,必须选择其他提交并运行git diff来比较这两个提交。比较的结果是将第一个快照转换为第二个快照的一组指令。这不一定是你,甚至任何人,做过的事情:这只是一系列的改变,产生了相同的结果。(这就是为什么有时git diff会说“删除前一个块的右大括号,加上此块的大部分”而不是“删除所有此块”。)
git实际上并不涉及提交的位置:如果连接两个git存储库,则任何hash ida1b2c3d的提交都与另一个repo中hash ida1b2c3d的提交相同。git pushgit fetch要做的是连接两个git存储库,并在它们之间传输提交。推送操作意味着将我的回购协议连接到其他人的回购协议,并尝试向其他人提交我在回购协议中的一些承诺,我认为他们还没有提交这些承诺。fetch操作意味着将我的repo连接到其他人的repo,并尝试获取他们拥有的提交,我认为我还没有。
如果您从alice的存储库中获取,然后推送到bob的存储库,这允许您将原来只在alice的存储库中的提交传输到bob的存储库。所以,你给了bob commita1b2c3d并不意味着commita1b2c3d是你自己写的,它只是意味着bob没有a1b2c3d-他还没有直接从alice或者其他人那里得到它。
最后,如果运行git commit --amend,这不会改变任何现有的提交。相反,它只会生成一个新的(不同的,可能更好的)提交,其父级与--amended提交的父级相同:

...--o--o--0bad   <-- branch

变成:
          0bad   [abandoned]
/
...--o--o--1337 <-- branch

如果旧提交的哈希以 0bad开头,而新提交的哈希以 1337开头。
哪些提交被替换…
没有。提交由哈希ID标识。这些散列ID继续标识相同的提交。
但是,我们从 git push输出中知道,另一个git中的名称 reimplement用于表示hash id为 7b4eaa2的提交,现在表示hash id为 1295174的提交。问题3中的这些因素:
哪些提交已从远程删除?
我们还从您自己的 git log输出中了解到两件事:
字符串 7b4eaa2...1295174选择显示的四个提交。因为 A...B意味着“提交可以从 AB访问,但不能从 AB都访问”,这意味着这四个提交可以从这两个提交中的一个访问,但不能从这两个提交中的任何一个访问。
git log --graph的输出为 further restrained to occur in topological order
在显示其所有子级之前不显示任何父级,并避免在混合的多行历史记录上显示提交。
自从上一次出现以来,这意味着所有的孩子都在这之前出现过。因为它是第一个出来的,所以它没有孩子。中间提交必须是 7b4eaa2的子级(即 1295174是其父级或祖级),或者是 7b4eaa2的父级。
把这些放在一起
我们知道 7b4eaa2是远程中 1295174的新提示(因为推送已被接受,它是您自己存储库中 1295174的提示):
... <-1295174   <-- reimplement

我们知道,遥控器的旧 reimplement,在 reimplement之前,结束于:
... <-7b4eaa2

我们必须考虑的是,我们是否应该像这样在您自己的存储库中绘制:
?--09630ef--0f477bf--1295174   <-- reimplement
\
7b4eaa2 [abandoned]

或者像这样:
?--1295174   <-- reimplement
\
09630ef--0f477bf--7b4eaa2 [abandoned]

甚至像这样:
?--09630ef--1295174   <-- reimplement
\
0f477bf--7b4eaa2 [abandoned]

你的 reimplement将显示我们所看到的第一个。不过,第二种情况是:
* 1295174 (HEAD -> reimplement) TEMPORARY
* 7b4eaa2 TEMPORARY
* 09630ef Setup $DB::single
* 0f477bf Prettify code

第三种是另一种形式。(如果 git push是以 git log 1295174...7b4eaa21295174为父级的合并提交,我们将看到另一个图形输出:我们肯定这里显示的所有提交都是线性相关或不相关的。)因此,回到第3季度:
哪些提交已从远程删除?
我们可以肯定地说, 0f477bf不再是可访问的,在那个git中,它的名字是 09630ef。名称 7b4eaa2取名为 reimplementreimplement的父级为 12951741295174的父级为 0f477bf
如果远程git中的分支、标记或类似名称完全无法访问 0f477bf,并且远程git没有reflogs,并且垃圾收集过程已完成,那么commit 09630ef将被收集并删除。

关于git - git-强制更新。发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48142410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com