Git远程跟踪分支与本地分支不同,具有相同的提交和不同的SHA

时间:2013-03-29 23:59:34

标签: git

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

Diverged git history

'34e ...'和'c3d ...'提交('已实施全球......'评论的)是IDENTICAL。我用git diff证实了这一点,他们甚至有相同的提交时间!唯一的区别是他们的SHA。

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

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

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

是否可以签出origin / master,然后将从'a4a ...'开始的所有提交重新命名为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}:commit:添加仅调试控制台打印到测试图像视图
  1155228 master @ {1}:commit:添加了自定义单元格可以实现的新标记接口   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 
|

1 个答案:

答案 0 :(得分:6)

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

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

git rebase --onto origin/master c3db784817 master

@评论中的问题:

我如何从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) (你可能住在美国;)