1.提到git,简单提下几个相似功能的版本管理系统CVS和SVN,首先说CVS和SVN是集中式的版本控制系统,什么是集中式的版本控制系统呢?就是版本库是集中存放在中央服务器的,大家协作的时候就是先从中央服务器获得最新的版本,然后修改后再把自己的活推送给中央服务器,必须联网才能工作,如果遇到中央服务器出问题,网络差,信号不好,上传文件慢,协作起来就有很多问题。
2.git:git是分布式的版本控制系统,每个人的电脑上都有一个完整的版本库,这样,工作的时候无需网络,多人协作时只需要提交我们的修改就好了,即使一个人的电脑坏了,也可以从其他人哪里重新拷贝版本库。git是现在世界上最先进的分布式版本控制系统。
3.git工作区,暂存区(stage、index),版本库的区别:我们的修改都在git的工作区。执行git add之后文件将会被添加到暂存区,执行git commit之后暂存区的修改才会被提交到版本库,git的工作区是一块,暂存区和版本库是两个是在一起的。工作区任何的修改都需要经历git add test.txt,git commit -m "description"这两步才能提交到git版本库。
4.git命令操作:
①:git简单命令
pwd 当前位置,Mac默认的是/Users/thy,git操作界面显示的git文件夹的路径,
cd + 文件夹名 进入相应的文件夹,
git version 查看git的版本,安装成功git之后就可以查看到git版本,
②:未提交到本地版本库,即执行git commit命令之前可以执行的git操作
mkdir learnGit 创建文件夹learnGit,在当前位置创建文件夹,
cd learnGit 进入到文件夹learnGit,
pwd 用于显示当前目录路径,Mac下显示/Users/thy/learnGit,
git init 初始化当前文件夹为git版本库,会多一个.git文件夹,如果没看到,使用ls -ah命令可以看到,
git ls-files 和ls -ah的区别: git ls-files命令是查看git版本库里面的所有文件和路径,工作区的看不到,ls -ah命令是查看git版本库文件夹的所有文件,包括git版本库文件夹中存在,但不在git版本控制下的文件
git checkout -- git.txt 放弃工作区的修改,如果执行了git add命令添加到暂存区之后则不管用了,如果你本地使用rm命令删除了文件,那么使用此命令可以将版本库的文件重现检出,因为版本库里面还有,如果你对一个文件做了更改,但是还没有git add到暂存区,那么执行git checkout -- git.txt可以从版本库重新检出这个文件,但是如果这个文件git add了,需要先git reset HEAD git.txt然后再git checkout -- git.txt,才能放弃工作区的更改,
git add git.txt 将git.txt文件从工作区添加到暂存区,也可以将一个文件加入git版本控制,
git status 可以查看工作区和暂存区中哪些文件被修改,如果执行了git commit之后这个命令就查看不了了,
git reset HEAD git.txt 把git add添加到暂存区的文件重新放回工作区,如果需要放弃修改,还需要git checkout命令,
git diff git.txt 通过这个命令加文件名,如果有文件被修改,可以查看git status看到的修改文件的具体更改内容如果不加文件名,即使多个文件被修改,默认的也只能看到最后一个修改的文件的内容,但是只能查看工作区的修改,如果执行git add增加到暂存区之后就看不到了,
git diff HEAD -- git.txt 此命令查看工作区和版本库里面最新版本的git.txt文件的区别,如果相同则没反应,
git commit -m "description" 将git add添加的所有文件从暂存区提交到git版本库,只会提交git add到暂存区的,
③:提交到本地版本库,即执行git commit命令之后可以执行的命令
git log git log命令显示从最近到最远的提交日志,git log查看的是git commit的记录,只有提交到版本库的,工作区的修改和git add到暂存区的修改使用git status查看,
git log --pretty=oneline 上面的git log会输出提交头,作者,时间,描述,这个信息简介,挺好的,
git reset --hard HEAD^ 回退到上个版本,每加一个^^^^,表示往前回退一个版本,也可以直接下面这样:
git reset --hard commitID 直接回退到指定的版本,这个commitID可以通过git log命令查看,webstrom按回车可以查看记录,
git reflog 当你关闭窗口之后看不到commitID之后,可以用这个命令查看命令的历史记录,继续回退操作,
④:删除文件
rm git.txt 删除一个文件,执行之后,必须要git add,然后git commit,这个文件才会在版本库里面被删掉,如果没有执行后面两步,可以直接git checkout -- git.txt来从版本库重新检出
git rm git.txt 如果使用这个删除命令,则默认直接删除文件并加入到了暂存区,如果想要不删除,要使用命令git reset HEAD git.txt来把暂存区的修改放回工作区,再使用git checkout -- git.txt来还原git.txt,如果执行了这个命令可以不用git add,直接git commit就可以删除版本库文件,
git remote 显示当前版本库的连接的远程仓库名字,
git remote -v 显示当前版本库连接的远程版本库地址的下拉和推送的仓库地址,
⑤:分支系统
git branch dev 创建分支dev,
git checkout dev 切换到分支dev,
git checkout -b dev 创建并切换到分支dev,相当于上面两条命令,
git branch 查看所有分支,
git merge dev 合并dev分支到当前分支,现在是master分支,就是把dev分支的修改合并到当前的master主分支,
git merge --no-ff -m 'description' dev 禁用默认合并方式Fast forward的合并方式,详见下面
git diff git.txt 如果合并出现冲突,那么可以使用git status查看冲突的文件,然后使用git diff来查看冲突的地方和内容,git里面也会显示,文件里面也会显示冲突的部分,修改冲突重新提交,合并,
git branch -d dev 删除分支,如果删除的是当前的分支则会失败,
git log --graph 查看分支合并的详细图解,内容显示的完善,
git log --graph --pretty=oneline --abbrev-commit 查看分支合并的缩略图解,这个更好一点,展示信息也可以,
关于git分支:git的HEAD默认的是指向master主分支的,当你创建了新的分支dev的时候两个分支是重叠的,HEAD指向dev分支,当你在dev分支上做修改的时候master分支依然不动,dev分支向后移动,合并分支之后master分支向后移动,当我们在dev分支上面工作的时候,所做的修改在master分支上是看不到的,只有合并了之后才能看到,
关于冲突的产生:只有当两个分支dev和master都改了一个地方提交了之后合并时才会产生冲突,如果dev改动提交了,master没有进行任何工作区的更改或者提交,那么合并时候是不会产生冲突的,因为master还指向之前的地方,没有新的更改,
关于带参数的合并:git的分支合并默认的是使用Fast formard,在这种模式下,删除分支之后会丢失分支信息,如果添加上参数:--no-ff表示禁用Fast formard模式,使用普通合并模式,创建一个新的commit,所以加上-m参数,把提交的描述写进去,可以查看到合并记录,而默认的合并模式不能看到合并历史,
关于分支的应用:master分支应该是非常稳定的,应该只用来发布版本1.0,2.0这些,我们应该都在dev分支上干活,dev上有每个人的分支dev1,dev2...等等,然后每个人在自己的分支上干活,做好了合并到dev分支上,因为创建、合并、删除分支都非常快,所以git鼓励你是用分支完成某个任务,合并后再删除掉分支,这和直接在master分支上工作效果是一样的但是过程更安全,
⑥:git版本库与远程版本库的连接:
1.先建远程库,再建本地库:
1.1 假如我们先建立了远程库,无论是SSH协议(协议地址样式:git@git.oschina.net:thythy/git.git),还是https协议(协议地址样式:https://git.oschina.net/thythy/git.git),我们都可以使用git clone + 远程仓库地址直接克隆项目,只要自己在项目里面,克隆完成之后直接进入文件夹就可以直接上传下拉,默认的就和你克隆的远程库关联了,(未发现https协议每次都需要输入账号密码的问题)
2.先建本地库,再建远程库
2.1使用SSH协议:首先使用ssh-keygen -t rsa -C "136031858@qq.com",然后连续三次回车,然后在用户目录里面找到隐藏文件夹.ssh,里面有id_rsa和id_rsa.pub两个文件,id_rsa是私钥,id_rsa.pub是公钥,然后登陆码云等代码仓库网站添加SSH Key,因为git支持SSH协议,然后码云上创建项目,然后在本地git仓库运行git remote add origin git@git.oschina.net:thythy/git.git,如果提示origin已存在,则输入git remote rm origin,然后重新远程连接,连接完成之后需要先git pull --rebase origin master因为本地没有readme.md文件,直接推送是会报错的,执行完之后本地多出了readme.md文件,然后git push -u origin master,首次推送需要添加上-u的参数,用来将本地的版本库和远程的版本库关联起来,以后就可以推送代码:git push origin master,下拉代码:git pull origin master,可以使用ssh -T git@git.oschina.net测试ssh是否配置成功,如果返回了Welcome to Git@OSC,coding!证明ssh配置成功,
2.2使用https协议:首先本地新建一个文件夹,然后使用git init命令将文件夹初始化为本地仓库,然后使用git remote add originhttp://git.oschina.net/thythy/git和远程版本库建立远程连接,然后可以使用git remote -v命令查看是否成功,如果成功则返回下拉和上传的版本库路径,和远程建立连接成功之后,这时候我们无论下拉上传都不行,因为git远程版本库多了一个readme.md文件而本地没有,所以建立连接成功之后我们需要执行git pull --rebase origin master命令把readme.md文件同步到本地,这时候本地就会多出一个readme.md文件,然后再执行git pull origin master命令就可以拉取远程库代码到本地代码库了,也可以使用git push originmaster推送修改的代码到远程仓库,
⑦:添加git忽略文件:新建.gitignore文件,然后把需要忽略的文件都添加进去,如果有的文件在忽略文件列表,那么你想添加到git版本库是添加不成功的,可以移出git版本库或者使用命令git add -f a.js命令来强制添加,或者可以使用命令,git check-ignore -v a.js命令来查看是否是忽略文件的原因
⑧:配置git命令别名:因为git命令比较长,输起来也不方便,我们可以给它配置别名来更好操作,例如:我们使用git status命令来查看工作区和暂存区的状态,我们使用git命令配置命令别名:git config --global alias.st status下次我们就可以直接使用git st来代替git status命令,查看状态。同样的git reset HEAD git.txt,我们可以使用git config --global alias.rb "reset HEAD",然后git rb git.txt,目前我也只配置了这两个git命令。
⑨:git输出颜色:git config --global color.ui true和git config --global color.ui false两个命令分别是开关git默认配置颜色。
另外:①:origin/master:origin是仓库的名称,master是仓库的分支名称,远程仓库名默认是origin,分支名可以是master1,master2等,git commit的提交就是提交到了master分支。②:cat git.txt cat+文件名,如果文件存在,把文件内容输出数来,如果文件不存在,当做字符串输出出来,关于git add和git commit:如果你的每次提交,不git add的话,就不会加入到git commit的队列,(cat + 文件名好像是是unix命令,linux是学的unix,所以linux也有这个命令,不是太清楚,说错勿怪。)
*注意:所有的版本控制系统,只能跟踪文本文件的改动,比如txt、网页、程序代码等,git也不例外,对于图片、视频这些二进制文件,虽然也能由版本控制系统管理,但是没法跟踪文件的变化,只能把二进制的文件每次改动串起来,只知道图片从100KB变成了80KB,但是到底改了啥不知道,不幸的是Microsoft的word格式是二进制格式,因此版本控制系统没法跟踪word文件的改动,所以要真正的使用版本控制系统,就要以纯文本方式编写文件。
结语:以上差不多是git常用命令的所有集锦和命令解释了,但git的功能远不止这些,更具体的git教程可以看廖雪峰老师的git教程,写的太完美了,这篇文章git简明指南也可以,还有OSX,windows,linux三个系统的git版本,也非常不错。