git回滚commit及忽略已提交文件

网站的代码存在了两个仓库中,一个是Github的线上仓库,用来积累contributions.另一个在实验室的服务器上,用来备份及自动化部署网站.

前段时间的协同开发使得两个仓库的代码经常出现冲突甚至无法Push,只好重新整理代码,同步服务器.

Git端的代码比较金贵,为了保持contributions不能随意的删除,就从实验室的服务器开始动刀.

服务器同步问题:大文件的提交

1)小心翼翼的备份了本地服务器中的仓库和apache的RootDocument代码,新建文件夹重新初始化为裸仓库.

2)开发机保存代码,add一些之前未加入跟踪的文件,一起提交commit.

3)直接push到新建的裸仓库中,并且从备份中将hooks中的post-receive钩子文件拷贝到相应的目录.

4)到RootDocument文件夹git clone下刚推入的裸仓库.

5)开发机器Push到Git服务器仓库.

完成前四步一度让我认为过程很顺利,然而Push到Git仓库时提示我单文件不能大于50M,才想起Git仓库对单文件大小的限制.

赶紧去.gitignore文件中将大文件的目录设为忽略,提交再推送。

仍然失败,查看git log大文件仍然没有被忽略掉。

Git忽略已被提交的文件

在.gitignore文件中添加路径并没能忽略掉文件,原因是:

我们误解了.gitignore 文件的用途,该文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件).

之所以你的规则不生效,是因为那些文件曾经被 Git 记录过,因此 .gitignore 对它们完全无效.

所以我们要做的事情是: 1.从 Git 的数据库中删除对于该文件的追踪; 2.把对应的规则写入 .gitignore,让忽略真正生效; 3.提交+推送;

按步骤来首先删除对于该文件的追踪,那就用git rm

git rm --cached data/

这样删除了data文件夹的追踪,之后.gitignore中加入

data/

最后commit提交并且push到本地服务器.

Git回滚commit

远程看了一下果然没有了data文件夹,于是向Git仓库Push,果不其然的又失败了。

跟我想象的不太一样,原来Push是将每次commit都Push一遍,而不是对比服务器端与最后一次commit的文件差异.

这样大文件会被上传后再删除,上传都传不上去,哪能删除的掉,就这样卡在了两难的境地.

没有其他的方法了,开始就做错了,再多的努力看样子也只能错的更深.

1)首先我们来查看以下git提交的SHA码,记录下来add大文件之前的那次SHA码

git log --stat

这条命令可以看到我们每次commit所修改的文件,就更容易找到相应的commit,复制需要的SHA码.

2)回滚到之前的commit上去,就是取消该commit之后的所有commit,–hard选项可以让代码也还原到以前的位置,但是我们不需要代码还原

git reset 39f6b910e2652ecb9e9ff1506f197fff5892d52b

3)立即将本地已修改未保存的内容commit并且push到Git端,总算是成功了.

4)按照之前的方法删除对大文件目录的追踪,并且忽略掉该目录,以保证以后不会再误提交.

5)本地服务器的文件也想到其他办法,直接push肯定会冲突,也只能重新备份重新clone了,至于大文件只能手动拷入RootDocument以保证该网站的正常运行.