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

时间:2018-01-07 23:09:40

标签: 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

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

  1. 哪些提交是我的? (在"我的"我的意思是在我的本地存储库中完成的更改,包括修改的提交)
  2. 哪些提交被替换以及在这些提交中被替换了什么?
  3. 哪些提交已经从遥控器中消失了? (我在本地存储库中引入了哪些更改)

3 个答案:

答案 0 :(得分:5)

  
      
  1. 哪些提交是我的?
  2.   

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

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

Git并不真正关于提交的提交:如果您连接两个Git存储库,例如,在中任何具有哈希ID a1b2c3d的提交 repo与另一个repo中的哈希ID a1b2c3d的提交相同的提交git pushgit fetch做的是连接两个Git存储库,并在它们之间传递提交。推送操作意味着将我的回购连接到其他人,并试图给别人 - 我在我的回购中做一些提交,我认为他们还没有。 A获取操作意味着将我的repo连接到其他人的repo并尝试获得他们拥有的提交,我认为我还没有。

如果从Alice的存储库中获取,然后推送到Bob的存储库,这允许您将最初仅在Alice的存储库中的提交传输到Bob的存储库。所以你给Bob提交a1b2c3d的事实并不意味着提交a1b2c3d是你自己写的,这只是意味着Bob没有a1b2c3d - 他有还没有直接从爱丽丝或其他任何人那里获得它。

最后,如果您运行git commit --amend,则不会更改任何现有提交。相反,它只是创建一个新的(不同的,可能更好的)提交,其--amend ed commit的父级相同:

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

变为:

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

如果旧提交的哈希值以0bad开头,而新提交的哈希值以1337开头。

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

无。提交由哈希ID标识。这些哈希ID继续识别相同的提交。

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

  
      
  1. 哪些提交已从遥控器中消失?
  2.   

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

  • 字符串7b4eaa2...1295174选择显示的四个提交。由于A...B表示&#34;提交可以从AB访问,但不能从AB&#34;提交,这意味着这四个提交可以从这两个提交中的一个提交,但不能从它们两个提交。

  • git log --graph的输出为further restrained to occur in topological order

  
    

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

  

由于7b4eaa2最后出现,这意味着在此之前已经展示了它的所有孩子。由于1295174首先出现,它没有孩子。中间提交必须是7b4eaa2的孩子(即7b4eaa2是他们的父母或祖父母)或1295174的父母。

将这些全部放在一起

我们知道1295174是远程中reimplement的新提示(因为推送已被接受,并且它是您自己的存储库中reimplement的提示):

... <-1295174   <-- reimplement

我们知道reimplement之前的远程git push以#{1}}结尾:

... <-7b4eaa2

我们必须考虑的是,我们是否应该在您自己的存储库中绘制现在的内容:

?--09630ef--0f477bf--1295174   <-- reimplement
 \
  7b4eaa2   [abandoned]

或者像这样:

?--1295174   <-- reimplement
 \
  09630ef--0f477bf--7b4eaa2   [abandoned]

甚至是这样:

?--09630ef--1295174   <-- reimplement
 \
  0f477bf--7b4eaa2   [abandoned]

您的git log 1295174...7b4eaa2会将第一个显示为我们所看到的。然而,它会显示第二个:

* 1295174 (HEAD -> reimplement) TEMPORARY
* 7b4eaa2 TEMPORARY
* 09630ef Setup $DB::single
* 0f477bf Prettify code

和另一种形式的第三种。 (如果1295174是以0f477bf09630ef为父项的合并提交,我们会看到不同的图表输出:我们肯定知道此处显示的所有提交都是线性相关或无关。)因此,回到Q3:

  
      
  1. 哪些提交已从遥控器中消失?
  2.   

我们可以肯定地说,{G}中的7b4eaa2不再可以通过名称reimplement访问。名称reimplement的名称为12951741295174的父级为0f477bf0f477bf的父级为09630ef

如果7b4eaa2 完全无法通过远程Git中的分支或标记或类似名称访问,则远程Git没有reflog,垃圾收集通道已完成,将收集并删除提交7b4eaa2

答案 1 :(得分:0)

试试这个:

  

显示上次提交差异

git diff HEAD~1 
  

显示上次提交已修改文件

git diff HEAD~1 --name-only

答案 2 :(得分:0)

我发现这两个选项有助于查看--left-right --cherry-pick --cherry-mark --boundary上的内容:

  

- 左 - 右
  标记可以从中获取提交的对称差异的哪一侧。来自的提交              左侧以&lt;为前缀。和那些来自右边的&gt;

--boudary我需要它来显示父根

  

- 樱桃挑选
     当提交集受限于对称差异时,省略任何引用与“另一方”上的另一个提交相同的更改的提交。

$ git log --graph --decorate --pretty=oneline --abbrev-commit --left-right --cherry-pick --boundary 8cb6531...1295174
> 1295174 (HEAD -> reimplement) TEMPORARY
> 0f477bf Prettify code
> 09630ef Setup $DB::single
> 1e1b4a3 Wrap whole DB::DB into &dbcall by moving DB::db into DB::interact
| < 8cb6531 TEMPORARY
| < e348241 Wrap whole DB::DB into &dbcall by moving DB::db into DB::interact
|/  
o 6086d62 Code comment

或者--cherry-mark我们可以看到未触及的提交:

$ git log --graph --decorate --pretty=oneline --abbrev-commit --left-right --cherry-mark --boundary 8cb6531...1295174
> 1295174 (HEAD -> reimplement) TEMPORARY
> 0f477bf Prettify code
> 09630ef Setup $DB::single
= 3e4cc19 Debugger debugging is finished. Remove mark
= 3df5e8c Fix doc
> 1e1b4a3 Wrap whole DB::DB into &dbcall by moving DB::db into DB::interact
| < 8cb6531 TEMPORARY
| = 5b1ce15 Debugger debugging is finished. Remove mark
| = 8588e00 Fix doc
| < e348241 Wrap whole DB::DB into &dbcall by moving DB::db into DB::interact
|/  
o 6086d62 Code comment

我们可以理解:

  1. 提交3e4cc193df5e8c未被触及且与5b1ce15相同,8588e00相应
  2. 在您的本地存储库中添加了以>符号标记的提交
  3. 标记为<的提交已从远程存储库中删除
  4. 因为提交Wrap whole DB::DB into &dbcall by moving DB::db into DB::interact在本地和远程repos上具有相同的名称,我们可以假设e348241提交已更改和修改。并且可以看到那里发生了哪些变化:

    $ git diff e348241 1e1b4a3
    diff --git a/lib/DB/Commands.pm b/lib/DB/Commands.pm
    index cb5b237..4f664fa 100644
    --- a/lib/DB/Commands.pm
    +++ b/lib/DB/Commands.pm
    @@ -250,7 +250,7 @@ sub cmd_stepout {
    
         if( $sharp ) {
             my $frames;
    -        1 while caller( 11 + $frames++ );
    +        1 while caller( 12 + $frames++ );
             $frames_left =  $frames -$frames_left +1;
    
             return -2   if $frames_left <= 0; # Do nothing for unexisting frame
    

    但我不知道会显示如下输出的选项:

    $ git log --graph --decorate --pretty=oneline --abbrev-commit --left-right --cherry-mark --boundary --XX-OPTION 8cb6531...1295174
    > 1295174 (HEAD -> reimplement) TEMPORARY
    --- a/lib/file.pm
    +++ b/lib/file.pm
    @@ -250,7 +250,7 @@ sub zzzz {
    
     if( $code ) {
         my $frames;
    -        code was
    +        code now
         $var;
    
         return
    > 0f477bf Prettify code
    > 09630ef Setup $DB::single
    = 3e4cc19 Debugger debugging is finished. Remove mark
    = 3df5e8c Fix doc
    > 1e1b4a3 Wrap whole DB::DB into &dbcall by moving DB::db into DB::interact
    --- a/lib/DB/Commands.pm
    +++ b/lib/DB/Commands.pm
    @@ -250,7 +250,7 @@ sub cmd_stepout {
    
         if( $sharp ) {
             my $frames;
    -        1 while caller( 11 + $frames++ );
    +        1 while caller( 12 + $frames++ );
             $frames_left =  $frames -$frames_left +1;
    
             return -2   if $frames_left <= 0; # Do nothing for unexisting frame
    
    o 6086d62 Code comment