我的同事';s更改删除我在git中的提交

我的同事';s更改删除我在git中的提交,git,Git,偶尔,我会遇到一个非常奇怪和沮丧的git问题。我提交并推送一些包括新文件和修改文件的更改,而我的同事将一些其他无关的内容提交到不同的文件 现在,当他提取我的更改时,我新添加的文件在他一侧显示为未跟踪,我的更改被还原。没有意识到这一点,他提交并推送到存储库,git完全忘记了我所做的更改 例如,如果我更改了文件A,那么如果我更改了git log-pa,我根本看不到他对我的更改的还原,也看不到我更改它的提交。但是如果我查看git历史并发现提交,我的更改就在提交中。我的提交仍然存在于git历史记录中,但

偶尔,我会遇到一个非常奇怪和沮丧的git问题。我提交并推送一些包括新文件和修改文件的更改,而我的同事将一些其他无关的内容提交到不同的文件

现在,当他提取我的更改时,我新添加的文件在他一侧显示为未跟踪,我的更改被还原。没有意识到这一点,他提交并推送到存储库,git完全忘记了我所做的更改

例如,如果我更改了文件
A
,那么如果我更改了
git log-pa
,我根本看不到他对我的更改的还原,也看不到我更改它的提交。但是如果我查看git历史并发现提交,我的更改就在提交中。我的提交仍然存在于git历史记录中,但没有任何git提交可以还原我的内容,但它在最新的主控中被还原,因为我提交中的更改不知何故已从主控分支中删除


有人遇到过类似的情况吗?我的第一个想法是,他在提交自己的更改之前就已经提交了,但他声称他在提交之前提交了。另一种可能性是,他有一个IDE(PyCharm),里面有一个git客户端(但他使用命令行git),它会以某种方式破坏机器中的git。另外需要注意的是,他运行Windows,而我运行OSX,所以可能是git版本冲突

还有一件事可能很重要:执行
git log-p myfile
不会显示我更改它的提交,
git log--follow-p myfile
显示我的更改,但不会显示其他恢复它的更改

当我发布
git log
时,我可以看到我进行更改的提交以及与
fileA
相关的更改。只有当我发出
git log-p fileA
时,我才能看到对
fileA
的更改。因此,提交就在那里,合并到master,但是它的效果已经消失了


有什么想法吗?

看起来推动更改的人(或他正在使用的IDE)正在进行强制推送(即,
git push-f
),git会覆盖历史记录

为了证实这一理论,您可以这样做:

创建一个新的repo克隆(因为在当前repo中,仍然可以通过某些本地分支或标记访问提交):

mkdir-p~/temp git dir
cd~/temp git dir
git克隆
git fsck--不可访问--无反射2>/dev/null | grep'不可访问提交'| awk'{print$3;}'| xargs-r-n1 git show--单行--名称状态
如果您的提交是列出的提交之一,那么它证实了这一理论

解决方案

允许强制推进回购协议总是一个坏主意,尤其是当工作流涉及多个开发人员时。您可以与SCM管理员联系,看看他们是否可以禁止强制推送或仅在真正需要时才允许强制推送


工作流应该包括,每个开发人员都试图从远程获取更改,并将本地提交与远程的新提交合并或重新设置其基础,然后将更新的refspec推回远程。

git log-p--显示的完整历史记录是什么?我刚刚进行了编辑。git log-PA不显示我的更改,而git log-p(完整历史记录)和git log-p(跟踪)都显示我的更改,但没有更改还原内容。“他运行Windows,而我运行OS X”。。。您是否都在文件系统中使用相同的大小写约定和/或根据需要使用
core.ignorecase
?如果您需要
--遵循
,查看对文件的更改,则表明您或您的同事已移动了文件,并在合并时移动了文件,(未使用子树策略或未正确执行手动修复)更改没有应用到新位置的文件。合并冲突是什么样子的?我运行了这个,但似乎不是这样。问题是,当我发布git日志时,我可以看到我在哪里进行更改的提交以及与fileA相关的更改。只有当我发布git log-p fileA时,我才能看到对fileA的更改。因此,t他在那里,合并到大师那里,但是它的效果已经消失了。
mkdir -p ~/temp-git-dir
cd ~/temp-git-dir
git clone <REPO-URL>
git fsck --unreachable --no-reflogs 2>/dev/null | grep 'unreachable commit' | awk '{print $3;}' | xargs -r -n 1 git show --oneline --name-status