Git 是分布式版本控制系统,SVN是中心式的版本控制系统,GIt直接在本机做版本控制和管理,而svn需要服务端的支持。
详情教程可以参考:
https://www.runoob.com/git/git-tutorial.htm
一、git基本操作命令
初始化文件夹为一个版本仓库:
git init
我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout):
git clone <repo>
如果我们需要克隆到指定的目录,可以使用以下命令格式:
git clone <repo> <directory>
git add 命令可将该文件添加到缓存,如我们添加以下两个文件:
git add
git status 以查看在你上次提交之后是否有修改,查看文件修改的情况:
git status
执行 git diff 来查看执行 git status 的结果的详细信息:
git diff
使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中:
git commit
git reset HEAD 命令用于取消已缓存的内容:
git reset HEAD <file>
只是简单地从工作目录中手工删除文件:
git rm <file>
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f:
git rm -f <file>
如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可:
git rm --cached <file>
git mv 命令用于移动或重命名一个文件、目录、软连接:
git mv
二、Git 分支管理
创建分支,相当于创建了一个平行空间,把主线的文件复制了一份,然后在分支的空间进行增删查改操作,这不不会影响主线空间的文件,开发好之后再将分支合并到主线上,完成了代码的合并。使用分支可以不影响主线的开发进度,可以专注新模块的开发。
非常重要:Git切换分支后,工作区的文件会自动切换成对应分支的文件,就算是上万个文件,切换速度也只需要1秒,这是Git最为核心的优势。
切换到不同的分支,工作区文件自动发生了改变。
分支相关操作命令
创建分支命令:
git branch (branchname)
切换分支命令:
git checkout (branchname)
合并分支命令:
git merge (branchname)
列出分支基本命令:
git branch
删除分支命令:
git branch -d (branchname)
合并冲突:
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改,Git会将冲突的内容添加到文件中,可以通过 git status 查看有那些文件存在冲突,比如我们打开冲突的文件,会发现冲突的内容,已经将冲突的内容合并了:
<?php
<<<<<<< HEAD
echo 1;
=======
echo 'runoob';
>>>>>>> change_site
?>
这时需要我们去手动修改,修改好后,我们可以用 git add 要告诉 Git 文件冲突已经解决,最后commit即可。
三、其他常用命令
#配置个人信息
git config --global user.name "username"
git config --global user.email "xxxxxx@qq.com"
#第一次添加远程仓库
git remote add origin https://github.com/xxxx/xxxx.git
#第一次推送代码到远程仓库
git push -u origin master
后续可以字节使用:git push 即可
从远程仓库下载新分支与数据:
git fetch
合并分支:
git merge
从远程仓库下载代码
git pull
git pull = git fetch 和 git merge
好习惯:
提交代码和写代码之前,应该先更新代码,减少冲突
四、git 文件三种状态
Untracked files 未被追踪、监测,没有纳入版本管理
Changes not staged for commit 这个状态表示文件已经被修改,但是没有放入暂存区域,还没有生成快照
Changes to be committed 已经在暂存区生成了快照,等待被提交
五、.gitignore 设置代码提交规则
有的文件不需要纳入版本管理,因此需要设置忽略规则,可再.gitignoreg
.gitignore文件对其所在的目录及所在目录的全部子目录均有效。通过将.gitignore文件添加到仓库,其他开发者更新该文件到本地仓库,以共享同一套忽略规则.
# 以'#'开始的行,被视为注释.
# 忽略掉所有文件名是 foo.txt的文件.
foo.txt
# 忽略所有生成的 html文件,
*.html
# foo.html是手工维护的,所以例外.
!foo.html
# 忽略所有.o和 .a文件.
*.[oa]
配置语法:
以斜杠“/”开头表示目录;
以星号“*”通配多个字符;
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
常用的规则:
1)/mtk/ 过滤整个文件夹
2)*.zip 过滤所有.zip文件
3)/mtk/do.c 过滤某个具体文件
被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。
需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中:
1)!*.zip
2)!/mtk/one.txt
唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。
为什么要有两种规则呢?想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么我们就需要使用:
1)/mtk/
2)!/mtk/one.txt
假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
最后需要强调的一点是,如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理。
简单来说,出现这种问题的原因就是Git已经开始管理这些文件了,所以你无法再通过过滤规则过滤它们。因此一定要养成在项目开始就创建.gitignore文件的习惯,否则一旦push,处理起来会非常麻烦。
如果在开发过程中,发现有些文件需要加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore文件时无效的。那么解决方法就是把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m "update .gitignore"