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

Eug*_*kov 3 git git-push

当我这样做时,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)

如何从此日志中查看此处发生的情况?

  1. 哪些提交是我的?(在"我的"下,我的意思是在我的本地存储库中完成的更改,包括修改的提交)
  2. 哪些提交被替换,哪些提交被替换?
  3. 哪些提交从远程转移?(我在本地存储库中引入了哪些更改)

tor*_*rek 5

  1. 哪些提交是我的?

你需要定义"我的".承诺成为"你的"是什么意思?

编辑:您在"我的"下添加了我的意思是在我的本地存储库中完成的更改,包括修改的提交.首先,要记住提交是快照; 要将快照转换为更改集,您必须选择其他一些提交并运行git diff以比较两个提交.比较的结果是一组用于将第一个快照转换为第二个快照的指令.这不一定是你,甚至任何人都做过的事情:它只是一组产生相同结果的变化.(这就是为什么有时会git diff说"删除前一个块的大括号,加上大部分块",而不是"删除所有这个块".)

Git是不是真正的其中一个承诺作出:如果您连接两个Git仓库,任何与哈希ID承诺a1b2c3d,例如,在任何回购是相同的承诺与哈希ID提交a1b2c3d的其他回购.做什么git pushgit 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.

  1. 哪些提交被替换...

没有.提交由哈希ID标识.这些哈希ID继续标识相同的提交.

但是,我们从git push输出中知道reimplement其他Git 中的名称用于表示其哈希ID为7b4eaa2的提交,现在表示其哈希ID为的提交1295174.这会影响到你的问题3:

  1. 哪些提交从远程转移?

我们还从您自己的git log输出中了解了两件事:

  • 该字符串7b4eaa2...1295174选择显示的四个提交.由于A...B手段"无论从提交到达AB但不可两者AB",这意味着这四个提交可达来自这两个提交的一个,而不是从他们两个.

  • 输出从git log --graph进一步抑制在拓扑顺序发生:

在显示所有子项之前不显示父项,并避免在多行历史记录中显示混合的提交.

自从7b4eaa2最后出版以来,这意味着在此之前已经展示了它的所有孩子.自从1295174第一次出来以来,没有孩子.中间提交必须是孩子7b4eaa2(即,7b4eaa2他们的父母或祖父母),或父母1295174.

将这些全部放在一起

我们知道这1295174reimplement远程的新提示(因为推送被接受,它是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是两者0f477bf09630ef作为父项的合并提交,我们会看到不同的图输出:我们确切地知道这里显示的所有提交都是线性相关或不相关的.)因此,回到Q3:

  1. 哪些提交从远程转移?

我们可以肯定地说7b4eaa2,在那个Git,名字不再可以到达reimplement.名称reimplement代替名称1295174,1295174is 0f477bf的父名称和is 的父0f477bf名称09630ef.

如果7b4eaa2完全由分支或标签,或在远程的Git相似的名字不可达,以及远程Git有没有reflogs,以及垃圾收集通已经完成,提交7b4eaa2将被收集并删除.