当我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
如何从此日志中查看此处发生的情况?
答案 0 :(得分:5)
- 哪些提交是我的?
醇>
你需要定义"我的"。承诺成为"你的"是什么意思?
修改:您在" mine"下添加我的意思是在我的本地存储库中完成的更改,包括修改的提交。首先,要记住提交是快照;要将快照转换为更改集,您必须选择其他一些提交并运行git diff
来比较两个提交。比较的结果是一组用于将第一个快照转换为第二个快照的指令。这不一定是你,甚至任何人都做过的事情:它只是一组产生相同结果的变化。 (这就是为什么有时候git diff
说"删除前一个块的大括号,加上大部分块"而不是"删除所有这个块"。)
Git并不真正关于提交的提交:如果您连接两个Git存储库,例如,在中任何具有哈希ID a1b2c3d
的提交 repo与另一个repo中的哈希ID a1b2c3d
的提交相同的提交。 git push
和git 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
开头。
- 哪些提交被替换......
醇>
无。提交由哈希ID标识。这些哈希ID继续识别相同的提交。
但是,我们从git push
输出中知道另一个Git中的名称reimplement
用于表示其哈希ID为7b4eaa2
的提交,现在表示其哈希的提交ID为1295174
。这会影响到你的问题3:
- 哪些提交已从遥控器中消失?
醇>
我们还从您自己的git log
输出中了解了两件事:
字符串7b4eaa2...1295174
选择显示的四个提交。由于A...B
表示&#34;提交可以从A
或B
访问,但不能从A
和B
&#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
是以0f477bf
和09630ef
为父项的合并提交,我们会看到不同的图表输出:我们肯定知道此处显示的所有提交都是线性相关或无关。)因此,回到Q3:
- 哪些提交已从遥控器中消失?
醇>
我们可以肯定地说,{G}中的7b4eaa2
不再可以通过名称reimplement
访问。名称reimplement
的名称为1295174
,1295174
的父级为0f477bf
,0f477bf
的父级为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
我们可以理解:
3e4cc19
和3df5e8c
未被触及且与5b1ce15
相同,8588e00
相应>
符号标记的提交<
的提交已从远程存储库中删除因为提交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