2013-04-16 45 views
2

偶尔,我遇到了一个非常奇怪和挫折的问题与git。我承诺并推动一些包括新文件和修改文件的更改,而我的同事将其他不相关的东西提交给不同的文件。我的同事的更改删除我在git中的提交

现在,当他提取我的更改时,我新添加的文件显示为未跟踪到他的一侧,并且我的更改已恢复。不知道这一点,他提交并推送到存储库,我的更改完全被git遗忘。

例如,如果我更改了文件A,那么如果我的确做了git log -p A,我根本看不到他对我所做的更改的恢复,我也看不到我改变它的提交。但是如果我查看git历史记录并发现提交,那么我的更改就在那个提交中。我的提交仍然存在于git历史记录中,但没有任何git commit可以恢复我的东西,但不知何故它会在最新的主服务器中恢复,因为我的提交中的更改已经以某种方式从主分支中删除。

有没有人遇到过类似的东西?我的第一个想法是他在做出自己的改变之前就拉扯了一下,但他声称自己在拉动之前犯下了什么。另一种可能性是他有一个IDE(PyCharm),里面有一个git客户端(但他使用了命令行git),这会破坏他机器上的git。另外需要注意的是,他在运行OS X时运行Windows,所以也许它可能是git版本冲突。这可能是重要的

的另一件事:做git log -p myfile显示承诺中,我改变了它,git log --follow -p myfile显示了我的变化,但表明恢复它没有其他变化。

当我发出git log时,我可以看到提交更改和fileA相关的更改。只有当我发出git log -p fileA我看不到fileA的变化。所以,承诺在那里,合并到主,但其效果已经消失。

任何想法?

+0

'git log -p --full-history A'显示了什么? –

+0

我刚刚做了一个编辑。git log -p A不显示我的更改,而git log -p --full-history和git log -p --follow都显示我的更改,但没有更改已恢复的更改。 – ustun

+0

“他在我运行OS X时运行Windows”......您是否在文件系统中使用了相同的大小写约定和/或是否在适当情况下使用了'core.ignorecase'? –

回答

3

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

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

创建回购的全新副本(因为在当前的回购,则提交仍然可能通过一些当地的分支或标记到达):

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 

如果你的提交是列出的提交之一,那么它证实了这个理论。

解决方案

允许在回购力推总是特别是当工作流程涉及多个开发人员一个坏主意。您可以与您的SCM管理员进行沟通,了解他们是否可以禁止强制推送,或仅在真正需要时才允许强制推送。

工作流应该包括每个开发人员试图从远程获取更改,并合并或重新绑定来自远程的新提交的本地提交,然后将更新的refspec推回到远程。

+0

我跑了这个,但似乎并非如此。问题是,当我发出git log时,我可以看到我做出更改的提交以及与fileA相关的更改。只有当我发出git log -p fileA时,我看不到对fileA的更改。所以,承诺在那里,合并到主,但其效果已经消失。 – ustun