【问题标题】:Git remote tracking branch diverged from local branch with identical commits with different SHAsGit 远程跟踪分支与本地分支不同,具有不同 SHA 的相同提交
【发布时间】:2013-03-29 23:59:34
【问题描述】:

这是我的 git repo 的当前状态(在 GitX 中可视化)。

“34e...”和“c3d...”提交(“已实现全局...”注释)是相同的。我用 git diff 确认了这一点,他们甚至有相同的提交时间!唯一的区别是它们的 SHA。

我不知道我是如何让我的回购进入这种状态的。虽然我不是 git pro,但我已经使用了一段时间,并且对所有基础知识都非常熟悉。这是突然发生的,我没有尝试任何我以前没有使用过的 git 功能或工作流程,所以我很困惑。

没有其他人向遥控器提交任何内容,因此我可以在那里更改历史记录,但不涉及该内容的解决方案会更好。

我可以对 master 和 origin/master 进行正常的合并或变基,但我对此感到不舒服,因为历史会显示 2 个相同的提交。

是否可以检查 origin/master,然后将所有从 'a4a...' 开始的提交 rebase 到 origin/master,然后将 master 切换到这个新的 HEAD? (基本上让 'c3d...' 提交自行挂起,这与它的欺骗无关)

1) 那么解决此问题的首选方法是什么?
2)任何想法这是怎么发生的?其他人以前见过吗?

编辑:
git diff c3db784817 34e1ab666a:什么也没输出。

git reflog master

Bender:mt-d-styles tyson$ git reflog master
9579294 master@{0}:提交:添加了仅调试控制台打印以测试图像视图
1155228 master@{1}:提交:添加了自定义单元格可以实现的新标记界面
a4ab788 master@{2}: commit: 添加了一个新的 StyledRootElement 自动应用
c3db784 master@{3}:commit:实现了一种全局技术来设置所有存在的样式
34e1ab6 master@{4}: commit: 实现了一种全局技术来设置所有存在的样式
8519fb1 master@{5}: commit: 扩展了 remove 方法,让调用者可以访问
30aeee6 master@{6}: commit: 添加了一个新的基于工厂方法的 Side Swipe View con

git reflog origin/master

Bender:mt-d-styles tyson$ git reflog origin/master
34e1ab6 refs/remotes/origin/master@{0}:通过推送更新
8519fb1 refs/remotes/origin/master@{1}:通过推送更新
495e0ef refs/remotes/origin/master@{2}:通过推送更新
c5fec81 refs/remotes/origin/master@{3}:通过推送更新
cba1e0f refs/remotes/origin/master@{4}:通过推送更新
9ee1ffb refs/remotes/origin/master@{5}:通过推送更新
68ee429 refs/remotes/origin/master@{6}:通过推送更新
0e2d199 refs/remotes/origin/master@{7}:通过推送更新
8a4de84 refs/remotes/origin/master@{8}:推送更新

编辑 2:
git log --format=raw --decorate --graph --all

*  commit c3db7848171f396c5a595a35dd6b609c119f9e84 
| tree 998e9749546d05178798c8a462d3eff02a111f4c 
| parent 8519fb17e77b8ae865e071772ae652316df8822a 
| author Tyson <tyson> 1364529327 +0800 
| committer Tyson <tyson> 1364539365 +0800 
|  
|     Implemented a global technique for styling all existing MT.D element backg 
|  


| * commit 34e1ab666a81dde7582ee9e31bfa961420d38f55 (origin/master) 
|/  tree 38f9e0c3d936c702fdcd18d215a2f0a88280893b 
|   parent 8519fb17e77b8ae865e071772ae652316df8822a 
|   author Tyson <tyson> 1364529327 +0800 
|   committer Tyson <tyson> 1364529327 +0800 
|    
|      Implemented a global technique for styling all existing MT.D element bac 
|

【问题讨论】:

  • git diff c3d784 34e1ab 显示什么?
  • 还有git reflog mastergit reflog origin/master请输出。
  • @kan 查看有问题的编辑。
  • 这看起来你修改了你的提交。但不能使用命令行客户端。
  • @Chronial 是的,我经常在 GitX 中使用 amend。仍然没有解释为什么git diff 显示两者之间没有区别。出于好奇,是什么让 reflog 输出看起来像是我修改过的?

标签: git


【解决方案1】:

原因: 你可能做了一些历史重写。如果提交完全相同,则 SHA 将自动相同。您在 UI 中看到的不是提交日期,而是作者日期。运行git log --format=raw --decorate ̵-graph --all 以获取更多详细信息。我想您会看到本地版本的提交日期是较晚的日期。这是由历史重写引起的,通常是修改或变基。

解决方案: 如果您知道如何返回,您可以尝试使用 rebase 拉动 - 如果提交确实相同,git 应该 意识到这一点并且只添加一个提交。如果你不知道如何返回,只需将master 重新定位到origin/master,在 c3db784817 处进行切割:

git rebase --onto origin/master c3db784817 master

@你在 cmets 中的问题:

我怎么知道你是从 reflog 修改的:

c3db784 master@{3}: commit: Implemented a global technique for styling all exist
34e1ab6 master@{4}: commit: Implemented a global technique for styling all exist

在您创建提交后,您的主分支位于 34e1ab6。然后你推送了这个提交。然后你的主分支移动到c3db784——一个带有相同消息的提交,你的 git 客户端说原因是commit。由于中间没有分支头移动,这闻起来很像修正。不过,命令行客户端会说 commit (amend)

您的日志告诉我您在 unix 时间 1364529327 (2013-03-28 20:55:27) 进行了第一次提交,然后在 unix 时间 1364539365 (2013-03-28 23: 42:45)。 (而且你可能住在美国;)

【讨论】:

  • 你的权利!请参阅上面的第二次编辑,git log 输出 - 不同的“提交者”时间。而且我确实经常使用修改功能。但这是否意味着我做了一个提交,推送它,然后修改,从而只修改本地提交?
  • 是的,您将始终只修改本地提交。任何你应该永远不要重写(=修改)已发布的历史。并且修正将 always 重写,即使你什么也没做,因为提交时间改变了——正如你所看到的。
  • 嗯...我发誓我过去曾尝试过这样做(在推送后修改)并且 git 阻止了我,或者至少警告了我。也许是 GitX 的修正没有发出警告。无论如何,rebase --onto 使用提交的 SHA 来创建补丁正是我想要的!工作了一个款待!谢谢!
  • 我仍然不明白为什么树 ID 998e97438f9e0c 不同,但 diff 没有显示任何内容。以及为什么 reflog 没有(amend)。只是 GitX 的错误吗?
  • 顺便说一句,git rebase origin/master 足以治愈这样的历史,--onto 的事情是不必要的。
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2016-05-14
  • 2011-02-24
  • 2013-06-12
  • 1970-01-01
  • 2013-05-11
  • 2010-09-27
  • 2013-04-30
相关资源
最近更新 更多