8

I work in a small company and our Git repo is a little messed up. I just did a git pull and my changes made earlier today are gone!

When I work on HEAD on the master branch, git log shows my last commit b94940c63ef965ce45b0d64ccfba4359134d2552 in its history.

Now if I do git log filename for the problematic file that lost my changes, that commit is not shown (only shows an earlier commit).

Performing git log --follow filename, my commit b94940c63ef965ce45b0d64ccfba4359134d2552 is shown as most recent.

And sure enough if I do:

git checkout b94940c63ef965ce45b0d64ccfba4359134d2552
git log filename

then the commit is shown and my changes are in the file!

In other words, the commit I made is shown in the branch history (blocking a branch merge), but individual modified files do not have that commit in their history! (unless I explicitly checkout that commit).

Questions:

  1. How on earth did this happen?

  2. How do I fix it? (We have problems with multiple files in our repo)

4

4 回答 4

5

好吧,找出问题所在。当一位同事拉动时,他遇到了一些冲突。他没有解决,而是 git reset 每个暂存文件。这类似于对单个旧文件执行 git checkout old_version。因此,master 上的 HEAD 最终引用了一些具有 old_version 的文件。

现在我正在手动恢复他吹出来的东西。

故事寓意:在单个文件上修改 git 操作(签出、重置等)是非常危险的。

于 2011-08-05T02:42:23.377 回答
1

这应该只是一个评论,但很难阅读。查看大师后:

git checkout master

什么是输出

git status

git whatchanged -m -p <path>

git log --graph --oneline b94940c63ef965ce45b0d64ccfba4359134d2552..master

?

于 2011-08-05T02:00:55.800 回答
0

首先,您应该掌握 Git 命令的作用以及存储库中存储的数据。

  • 获取历史可视化工具,例如Giggle或 Gitk,以查看您的提交历史并查看基于什么提交的提交。

  • git pull做两件事:它从远程存储库中检索新提交,并将远程存储库头与您当前的头(在您当前的分支中)合并。

因此,鉴于此,您将来可能需要更加小心。而不是使用git pull,您可以git fetch手动合并需要合并的内容。这样你就可以控制你正在做的编辑。

至于您目前的情况,我认为 Git 不会丢失数据。您说您的文件仍在历史记录中。因此,现在您可能需要进行一些创造性的重置(恢复到旧版本)或修补程序(可能手动),以使您的项目文件进入您想要的状态。

于 2011-08-05T00:53:45.753 回答
0

您实际上可以在要查看哪些文件可能丢失提交的文件夹中使用此 bash 脚本:

#!/bin/zsh
for f in $(find . -name '*.php')
do
	follow=$(git log --oneline -1 --pretty=format:"%h" -- $f)
	log=$(git log --follow --oneline -1 --pretty=format:"%h" -- $f)
	
	if [ $log != $follow ]; then
  		echo "follow $follow , log $log => $f"
  	fi

done

于 2016-03-31T11:27:22.977 回答