勇哥注:
如果你的初始版本在没有添加忽略文件.gitignore的情况添加到了暂存区、本地版本仓库、远端版本仓库。
此时你的bin目录下的各类dll, pdb等文件会一并上传。
此后,你每改一次代码(哪怕只改了一个字),重新编译后你的更新文件可能达到数千,原因是dll和pdb之类的二进制文件都会相应起变化。
这样的状态下,如果你的两个分支相合并,就会产生数千个冲突。
此时你想到要添加.gitignore,忽略掉所有bin目录,但是你会发现并没有卵用。
原因是那些想被你忽略的文件已经在暂存区、本地版本仓库了。
怎么解?
解决方法:
(1)git rm -r --cached . //删除所有文件的跟踪,但不删除文件
(2)修改或者更新.gitignore文件
(3)git add .gitignore
(4)git commit -m "添加了忽略文件"
(5)git add . //此时你会发现添加到缓存的文件不再包含被忽略掉的文件
如果此步后,发现仍然有目录下的文件仍然是被忽略状态,则执行下面的强制添加忽略文件指令:
git add -f Loader\bin\plugins\MainForm
(6)git commit -m "修正了忽略文件问题的初始版本"
如果有已经添加到暂存区的单独的目录需要忽略:
git rm -r --cached SamsunMotion/SamsunMotionWin32/Loader/bin/ProjectDataBackup
此时这个目录被取消跟踪:
然后你改下忽略文件,添加这个目录
如果是已经添加到暂存区的单独的文件要忽略:
git rm --cached SamsunMotion/SamsunMotionWin32/Loader/bin/alllogs.txt
然后你改下忽略文件,添加这个文件的全路径串
下面是本话题的相关的扫盲知识:
========================================
git库所在的文件夹中的文件大致有四种状态:
Untracked:未跟踪,此文件在文件夹中,但没有加入到git库,不参与版本控制。 通过git add 状态变为Staged。 Unmodify:文件已入库,未修改。即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件。 Modified:文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改。 Staged:暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
git的四个工作区域如下图所示:
没有被git add过的修改记录全部在workspace(工作区),所有已经被git add的记录全部在Index(暂存区),已经commit过的都以各个版本的形式存在于Repository版本库。
已经被tracked的文件发生的更改也是需要每次进行add,这样才会将到此为止的修改放入stage区。也就是说add本质上是两个作用:add新文件、add更改。
新建文件--->Untracked
使用add命令将新建的文件加入到暂存区--->Staged
使用commit命令将暂存区的文件提交到本地仓库--->Unmodified
如果对Unmodified状态的文件进行修改---> modified
如果对Unmodified状态的文件进行remove操作--->Untracked
工作区和暂存区的一些删除与恢复指令
丢弃workspace、INdex区所有改动,回滚到之前的版本库中的状态 git reset 回滚到旧版本后,要切换到更新的版本时,目标版本的commit_id: git reflog 丢弃某个文件在working区发生的改变 git checkout -- filename 把某个已经add到stage区的文件清除 git reset HEAD filename 恢复误rm某个working区文件(注意该文件必须之前存在于版本仓库)且本次删除还未commit,怎么检出恢复 git checkout -- filename 恢复误rm某个working区文件(注意该文件必须之前存在于版本仓库),但本次rm已经commit git reset HEAD filename git checkout -- filename 这里reset将文件变成untracked的文件,再checkout恢复working区到版本库最后一个版本
查看文件更改状态的指令
(1)git status
上面信息的释义:
当前在devLxy分支 你的分支‘origin/devLxy’是最新版本 不在缓存区的文件: (执行git add 指令可以把下面文件的改变更新到缓存区) (执行git restore指令可以把工作区的文件的修改丢弃掉)
红色的文件状态为modified,指此文件已经在缓存区了,你可以使用git commit提交到本地版本库中去。
新建一个文件lxy1.txt,可以看到它的状态是Untracked files(非跟踪的文件)
进行git add后,此文件提交到暂存区,文件状态是 new file
提示可以进行git restore撤消文件到工作区
git restore撤消lxy1.txt到工作区后,它又变成一个非跟踪的文件(Untracked file)
(2)git restore指令
nothing to commit, working tree clean 无需要提交文件,工作区是干净的(文件没有任何改变)
git status -s 简短输出结果
删除跟踪状态
git rm
git删除一个文件,但是由于lxy1.txt文件已经在暂存区,所以无法删除。
提示必须使用参数-cached -f
-cached 是删除跟踪但不删除文件
-f 是删除跟踪,同时删除文件
一此测试用的cmd指令和git指令:
//创建一个空文件 touch filename //显示文件内容 type file //重定向,这里相当于复制文件了 type f1 > f2 //rm只能删除没被跟踪的文件 rm file //git的rm,可以取消跟踪,或者连同文件一起删除 git rm file //拷贝屏幕输入,相当新建文件,注意按ctrl+z结束输入 copy con file
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

