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

Git远程跟踪分支与本地分支不同,具有相同的提交和不同的SHA,git,Git,这是我的git回购的当前状态(如GitX所示) “34e…”和“c3d…”提交(已实现全局…”注释的提交)是相同的。我用git diff确认了这一点,它们甚至有相同的提交时间!唯一的区别是他们的SHA 我不知道我的回购协议是如何进入这种状态的。虽然我不是git专业人士,但我已经使用它一段时间了,对所有的基础知识都非常熟悉。这是突然发生的,我没有尝试任何我以前没有使用过的git特性或工作流,所以我相当困惑 没有其他人向远程提交过任何东西,因此我可以在那里更改历史,但是一个不涉及这一点的解决方案会

这是我的git回购的当前状态(如GitX所示)

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

我不知道我的回购协议是如何进入这种状态的。虽然我不是git专业人士,但我已经使用它一段时间了,对所有的基础知识都非常熟悉。这是突然发生的,我没有尝试任何我以前没有使用过的git特性或工作流,所以我相当困惑

没有其他人向远程提交过任何东西,因此我可以在那里更改历史,但是一个不涉及这一点的解决方案会更好

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

是否可以签出origin/master,然后将从'a4a…'开始的所有提交重新定基到origin/master,然后将master切换到这个新头?(基本上是让‘c3d…’自行挂起,这与被骗者无关)

1) 那么,解决这个问题的首选方法是什么?
2) 你知道这是怎么发生的吗?以前有人见过吗

编辑:
git diff c3db784817 34e1ab666a未输出任何内容

git reflog master

折弯机:mt-d-styles泰森$git reflog主机
9579294 master@{0}:commit:将仅调试控制台打印添加到测试图像视图
1155228 master@{1}:commit:添加了自定义单元格可以导入的新标记接口
a4ab788 master@{2}:commit:添加了一个新的StyledRootElement,可自动应用程序
c3db784 master@{3}:commit:实现了一种全局技术,用于设置所有exist的样式
34e1ab6 master@{4}:commit:实现了一种全局技术,用于设置所有存在的样式
8519fb1 master@{5}:commit:扩展了remove方法,使调用方能够访问
30aeee6 master@{6}:commit:添加了一个新的基于工厂方法的侧扫视图con

git reflog origin/master

折弯机:mt-d-styles泰森$git reflog origin/master
34e1ab6参考/远程/源/主@{0}:按推更新
8519fb1参考/遥控/原点/主控@{1}:按推更新
495e0ef refs/remotes/origin/master@{2}:通过推送更新
c5fec81参考文件/遥控器/原点/主控器@{3}:通过推送更新
cba1e0f refs/remotes/origin/master@{4}:通过推送更新
9EE1FB refs/remotes/origin/master@{5}:按推更新
68ee429参考文件/遥控器/原点/主控器{6}:按推更新
0e2d199参考/遥控/原点/主控@{7}:按推更新
8a4de84 refs/remotes/origin/master@{8}:通过推送更新

编辑2:
git log--format=raw--decoration--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 
|
*提交c3db7848171f396c5a595a35dd6b609c119f9e84
|树998e9749546d05178798c8a462d3eff02a111f4c
|母公司8519fb17e77b8ae865e071772ae652316df8822a
|作者泰森1364529327+0800
|提交人泰森1364539365+0800
|  
|实现了一种全局技术,用于设置所有现有MT.D元素backg的样式
|  
|*提交34e1ab666a81dde7582ee9e31bfa961420d38f55(源/主)
|/树38f9e0c3d936c702fdcd18d215a2f0a88280893b
|母公司8519fb17e77b8ae865e071772ae652316df8822a
|作者泰森1364529327+0800
|提交人泰森1364529327+0800
|    
|为所有现有MT.D元素bac的样式设计实施了一项全局技术
|

原因: 你可能改写了历史。如果提交的内容完全相同,则SHA将自动相同。您在UI中看到的不是提交日期,而是作者日期。运行
git log--format=raw--decoration--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)对其进行了修改。(而且你可能住在美国;)

git diff c3d784 34e1ab显示了什么?还有,
git reflog master
git reflog origin/master
请输出。@kan查看相关编辑。这看起来确实像是你修改了提交。但是命令行客户机不支持。@是的,我经常在GitX中使用amend。仍然没有解释为什么
git diff
显示两者之间没有差异。出于好奇,是什么让reflog输出看起来像是我修改的呢?你说得对!请参阅上面我的第二次编辑,带有
git日志
输出-不同的“提交者”时间。我经常使用修正功能。但这是否意味着我做了一个提交,推送它,然后修改,从而只修改本地提交?是的,您将始终只修改本地提交。任何你都不应该重写(修改)出版的历史。修正案将
始终
重写,ev