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

Tys*_*son 4 git

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

分散的git历史

'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:

德尔:MT-d-样式泰森$ GIT中引用日志主
9579294主@ {0}:提交:增加调试只有控制台打印测试图像视图
1155228主@ {1}:提交:添加了新标记接口,定制单元可以imp的
a4ab788主@ {2}:提交:增加了一个新StyledRootElement自动应用
c3db784主@ {3}:承诺:实施的全球技术用于造型所有存在
34e1ab6主@ {4}:承诺:实施的全球技术用于造型所有存在
8519fb1主@ {5}:commit:扩展remove方法,让调用者可以访问
30aeee6 master @ {6}:commit:添加了一个新的工厂方法Side Swipe View con

git reflog origin/master:

德尔:MT-d-样式泰森$ GIT中引用日志原点/主
34e1ab6参/遥控器/来源/主@ {0}:更新通过推
8519fb1参/遥控器/来源/主@ {1}:更新通过推
495e0ef参/遥控器/原点/主@ {2}:更新通过推
c5fec81参/遥控器/来源/主@ {3}:通过推更新
cba1e0f参/遥控器/来源/主@ {4}:通过推更新
9ee1ffb参/遥控器/原点/主@ {5}:更新通过推
68ee429参/遥控器/来源/主@ {6}:通过推更新
更新通过推:0e2d199参/遥控器/来源/主@ {7}
8a4de84参/遥控器/来源/主@ {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 
|
Run Code Online (Sandbox Code Playgroud)

Chr*_*ial 6

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

解决方案:如果您知道如何返回,您可以尝试使用rebase - 如果提交确实相同,git 应该实现这一点并且只添加一个提交.如果你不知道怎么回去,只是重订masterorigin/master,在c3db784817切割:

git rebase --onto origin/master c3db784817 master
Run Code Online (Sandbox Code Playgroud)

@评论中的问题:

我如何通过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
Run Code Online (Sandbox Code Playgroud)

34e1ab6创建提交后,您的主分支处于.然后你推了这个提交.然后你的主分支移动到c3db784- 一个提交相同的消息,你的git客户端说明了这个的原因commit.由于两者之间没有分支头部运动,这很像修改.命令行客户端会说commit (amend).

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