当我这样做时,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
Run Code Online (Sandbox Code Playgroud)
如何从此日志中查看此处发生的情况?
- 哪些提交是我的?
你需要定义"我的".承诺成为"你的"是什么意思?
编辑:您在"我的"下添加了我的意思是在我的本地存储库中完成的更改,包括修改的提交.首先,要记住提交是快照; 要将快照转换为更改集,您必须选择其他一些提交并运行git diff以比较两个提交.比较的结果是一组用于将第一个快照转换为第二个快照的指令.这不一定是你,甚至任何人都做过的事情:它只是一组产生相同结果的变化.(这就是为什么有时会git diff说"删除前一个块的大括号,加上大部分块",而不是"删除所有这个块".)
Git是不是真正的其中一个承诺作出:如果您连接两个Git仓库,任何与哈希ID承诺a1b2c3d,例如,在任何回购是相同的承诺与哈希ID提交a1b2c3d的其他回购.做什么git push和git fetch做什么是连接两个Git存储库,并在它们之间传递提交.推送操作意味着将我的仓库连接到其他人的手中,并尝试给某人 - 其他人在我的仓库中提交的一些提交,我认为他们还没有. 获取操作意味着将我的repo连接到其他人的repo并尝试获取他们拥有的提交,我认为我还没有.
如果你从Alice的存储库中获取,然后推送到Bob的存储库,这允许你将最初只在Alice的存储库中的提交传输到Bob的存储库.所以你给Bob提交的a1b2c3d事实并不意味着提交a1b2c3d是你自己编写的,它只是意味着Bob没有a1b2c3d- 他还没有直接从Alice或其他任何人那里获得它.
最后,如果您运行git commit --amend,则不会更改任何现有提交.相反,它只是创建一个新的(不同的,可能更好的)提交,其父级与--amended提交的父级相同:
...--o--o--0bad <-- branch
Run Code Online (Sandbox Code Playgroud)
变为:
0bad [abandoned]
/
...--o--o--1337 <-- branch
Run Code Online (Sandbox Code Playgroud)
如果旧提交的哈希开头,0bad新的哈希开头1337.
- 哪些提交被替换...
没有.提交由哈希ID标识.这些哈希ID继续标识相同的提交.
但是,我们从git push输出中知道reimplement其他Git 中的名称用于表示其哈希ID为7b4eaa2的提交,现在表示其哈希ID为的提交1295174.这会影响到你的问题3:
- 哪些提交从远程转移?
我们还从您自己的git log输出中了解了两件事:
该字符串7b4eaa2...1295174选择显示的四个提交.由于A...B手段"无论从提交到达A或B但不可两者A和B",这意味着这四个提交可达来自这两个提交的一个,而不是从他们两个.
输出从git log --graph是进一步抑制在拓扑顺序发生:
在显示所有子项之前不显示父项,并避免在多行历史记录中显示混合的提交.
自从7b4eaa2最后出版以来,这意味着在此之前已经展示了它的所有孩子.自从1295174第一次出来以来,没有孩子.中间提交必须是孩子7b4eaa2(即,7b4eaa2他们的父母或祖父母),或父母1295174.
我们知道这1295174是reimplement远程的新提示(因为推送被接受,它是reimplement您自己的存储库中的提示):
... <-1295174 <-- reimplement
Run Code Online (Sandbox Code Playgroud)
我们知道遥控器的老旧reimplement,在之前git push,以:
... <-7b4eaa2
Run Code Online (Sandbox Code Playgroud)
我们必须考虑的是,我们是否应该在您自己的存储库中绘制现在的内容,如下所示:
?--09630ef--0f477bf--1295174 <-- reimplement
\
7b4eaa2 [abandoned]
Run Code Online (Sandbox Code Playgroud)
或者像这样:
?--1295174 <-- reimplement
\
09630ef--0f477bf--7b4eaa2 [abandoned]
Run Code Online (Sandbox Code Playgroud)
或者甚至喜欢这样:
?--09630ef--1295174 <-- reimplement
\
0f477bf--7b4eaa2 [abandoned]
Run Code Online (Sandbox Code Playgroud)
你git log 1295174...7b4eaa2会像我们所看到的那样展示第一个.然而,它会显示第二个:
* 1295174 (HEAD -> reimplement) TEMPORARY
* 7b4eaa2 TEMPORARY
* 09630ef Setup $DB::single
* 0f477bf Prettify code
Run Code Online (Sandbox Code Playgroud)
而第三种是另一种形式.(如果1295174是两者0f477bf和09630ef作为父项的合并提交,我们会看到不同的图输出:我们确切地知道这里显示的所有提交都是线性相关或不相关的.)因此,回到Q3:
- 哪些提交从远程转移?
我们可以肯定地说7b4eaa2,在那个Git,名字不再可以到达reimplement.名称reimplement代替名称1295174,1295174is 0f477bf的父名称和is 的父0f477bf名称09630ef.
如果7b4eaa2是完全由分支或标签,或在远程的Git相似的名字不可达,以及远程Git有没有reflogs,以及垃圾收集通已经完成,提交7b4eaa2将被收集并删除.