草庐IT

git - 提交显示在历史记录中,更改不在文件中并且不显示在单个文件提交历史记录中

coder 2023-06-25 原文

我刚刚遇到了一个关于 git 的奇怪问题。我昨天推送了一个提交,之后有几个人推送了。现在我可以在 github 上的历史记录中看到我的提交,但我所做的更改不在文件的 HEAD 修订版中,如果我查看单个文件的历史记录,我的提交不会显示。我的队友告诉我,他们所做的只是常规的推 pull 。与我更改的文件没有冲突。如果有人使用强制推送,我希望我的 promise 完全消失。如果有人搞砸了 merge 冲突解决方案,我希望 merge 提交撤消我的更改并反射(reflect)在文件的提交历史记录中。但不知何故,情况并非如此。简化:

  • 我更改 file.txt 并提交 ABCD
  • 我将 ABCD 上传到 github
  • 其他人推送其他提交,不影响 file.txt
  • 如果我查看 github 上的存储库提交,我会看到我的提交并且我可以提取更改差异
  • 如果我在 github 上查看 file.txt 的最新版本,我的更改不存在
  • 如果我查看 file.txt 的提交历史记录,但 ABCD 未显示,则该文件的最后一次提交是 ABCD 之前的提交。

这样的事情是怎么发生的?

编辑:根据评论中的讨论,这是我的提交图的一部分

* | 8c1d372 ...
* |   98dbad7 Merge branch 'master'
|\ \  
| * | 8d64a09 ...
| * | 12beb68 ...
| * |   1c94b6d Merge branch 'master'
| |\ \  
| | * | 80b6285 ...
| | * | 9781fad ...
| | * | f12fc90 ...
| | * | 61411fa ...
| | * | 291333b ...
| * | | aeee93f ...
| |/ /  
| * |   bcfbf65 Merge branch 'master'

我消失的提交是 9781fad。如果我 checkout 8c1d372,我的更改就会消失。然而,我的提交实际上没有影响我更改的文件。

最佳答案

实际答案(而不是超长评论)。

这里又是图表位,加上我自己的注释:

* | 8c1d372 ...        <-- lacks desired changes
* |   98dbad7 Merge branch 'master'     <-- ? (interesting #1)
|\ \  
| * | 8d64a09 ...
| * | 12beb68 ...
| * |   1c94b6d Merge branch 'master'   <-- ? (interesting #2)
| |\ \  
| | * | 80b6285 ...    <-- probably also has desired changes
| | * | 9781fad ...    <-- is commit that makes desired changes
| | * | f12fc90 ...
| | * | 61411fa ...
| | * | 291333b ...
| * | | aeee93f ...
| |/ /  
| * |   bcfbf65 Merge branch 'master'

由于没有人明确地恢复您的更改,并且它们是一个其他人不应该编辑的文件,所以几乎可以肯定,无论是谁丢失了您的更改,都是由于错误的 merge 造成的。

有两个merge比较有意思,我已经标出来了。 #1,提交 98dbad7,有两个父级:一个我们看不到(在图表底部),一个我们可以看到,8d64a09。从这一点开始的 git log 将显示这两个历史记录。 git show 98dbad7:path/to/file 将显示附加到 merge 提交的文件的版本(即,无论谁进行了 merge ,他说的都是该文件的正确版本)。如果那是错误的版本——如果该文件缺少所需的更改——那么要么 merge 本身变坏了,要么有错误的输入。据推测,最底层的父级不应进行更改,因此此时我们应该遵循另一个父级,即 8d64a09

您可以 git show 8d64a09:path/to/file 查看该版本是否包含或缺少您的更改。如果您的更改在那里,那么是 98dbad7 提交删除了它们。如果您的更改在那里,我们应该继续。

为了完整起见,我们可以查看 12beb68,但它可能不是罪魁祸首。这是一个普通提交,只有一个父级 1c94b6d

Commit 1c94b6d 是我们第二个有趣的 merge 。与任何 merge 一样,它有两个(或更多,但通常是两个) parent 。这次我们可以看到两者,它们是提交 80b6285aeee93f

提交 80b6285 可能有您的更改,因为它是一个普通提交,其父级 9781fad 是包含您的更改的提交。并且提交 aeee93f 不会有您的更改,因为它来自 merge 的一侧,嗯,没有您的更改。 :-) 您可以 git show 80b6285:path/to/file 只是为了检查提交该提交的人没有 secret (而不是公开地)恢复它们,并且然后 git show 1c94b6d:path/to/file 观察是否是这个 interesting-merge-#2 放弃了你的更改。

其中一个 merge 删除您的更改的可能性非常高。 为什么 仍然是一个有趣的问题,但必须由进行 merge 的人来回答。他们做了一些事情——也许是 checkout ,也许是给 merge 的标志——在 merge 期间放弃了你的更改。找出哪个 merge 删除了更改,并与执行此操作的人交谈以找出他们所做的导致更改删除的操作。

取回更改

恢复更改非常容易:只需使用 git cherry-pick,它会为您运行差异,然后将该差异应用于当前提交。所以你会回到 master 并简单地 git cherry-pick 9781fad。这将区分 9781fad^(9781fad 的父级,即 f12fc90)与 9781fad - 差异显示您的更改——并将它们应用于当前提交并进行新提交,重新使用原始消息。 (如果您的提交影响多个文件并且应该只将更改返回到一个文件,则需要做更多的工作,但假设它是一个文件,这很容易解决。您仍然需要不过,请确保在以后的 merge 中没有人撤消它。)

关于git - 提交显示在历史记录中,更改不在文件中并且不显示在单个文件提交历史记录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36629154/

有关git - 提交显示在历史记录中,更改不在文件中并且不显示在单个文件提交历史记录中的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  9. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  10. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

随机推荐