什么是git
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
GIT的使用
msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
了解基本命令
git clone
从远端拉取仓库
git init
初始化一个仓库
git add
添加到缓存区
git commit -m 修改
添加到仓库
git diff
查看修改的具体内容
git reset --hard 版本号
跳转到指定版本号
git log
查看所有的修改的版本号
git status
查看文件状态
您不必现在就了解这些命令的使用,后文会初步解释每个命令的使用。
理解概念:工作区,暂存区,仓库
add
的操作是把所有的更改暂时放在暂存区,commit
操作就是真正的提交我们的代码
如果你试图修改,绕过了
add
部分的话,你提交的代码是无法真正进入仓库的,这是因为commit
的是暂存区内的内容,而你必须将你所做的修改add
到暂存区才能commit
成功。
创建GIT仓库
- 创建存放git的文档目录(新建一个文件夹)mkdir mycode
- 进入这个文件夹的目录 cd mycode
- 在这个文件夹下执行git init 命令,创建一个仓库
- 告诉git ,我们要跟踪哪些文件的修改,默认git只能跟踪文本类的文件修改,不包括图片、视频等。
Git add *
或者具体的某个文件git add 文件名
- 把我们的文件正式提交到仓库中去
git commit -m 备注的信息
,最好备注下;
查看状态
git status
查看我们跟踪文件的状态,时刻掌握我们的仓库状态
git diff
查看具体哪儿被修改了,新增的内容又是哪些
如果我们修改了我们的文件,那么我们就需要继续的add commit 提交最新的修改。
注意:git commit -a
合并了add
commit
两个操作,只不过它只适用于旧文件的修改,新文件依然要添加add
commit
;
如果出现被锁的情况,只需要删除.git 下面的index.lock 文件即可 rm .git/index.lock 具体原因不明
Git commit -a 后会出现 vim编辑器,这个编辑器的简单使用掌握下就OK了
要随时掌握工作区的状态,使用git status
命令。
如果git status
告诉你有文件被修改过,用git diff
可以查看修改内容。
查看我们的记录log
我们不停的修改,提交,修改,提交!
在git
中,用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
对的,我们所有的修改提交都有记录在这里,并且可以通过命令来还原原来的版本
git log
查看当前的操作记录
git reset --hard 版本编号ID
或者是HEAD ^
回到上一个版本中去
当你从新版本回到老版本的时候,我们的新版本自然就消失了,所以,如果你想回复到新版本的状态,你可以使用git reflog
查看下你每次的操作命令,并记录下版本ID编号,再次使用 git reset --hard 版本编号ID
回到新版本中去。
现在总结一下:
HEAD
指向的版本就是当前版本,因此,git
允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。
也就是说:
现在有3个版本
版本号:333
版本号:222
版本号:111
我现在用git reset —hard 222 退回到222版本,
git log 后 就看不到333版本了
必须要用git relog才能看到222之前的333版本号
然后在通过git reset —hard 333 恢复到333
撤销你的修改
我们有时候会希望撤销我们的更改,这时一般可以分为三种情况:
- 当你只是在源文件中修改了,而并没有
add
到暂存区的情况; - 当你不仅在源文件中修改了,并且还
add
了到了暂存区,索性的是你并没有commit
的时候; - 当你已经
commit
提交到仓库的时候。
下面,分别尝试着解决这三种情况
-
git checkout -- 修改的文件名
;
感觉更像把暂存区退回到了工作区
-
git reset HEAD readme.txt (文件名)
把暂存区的修改回退到工作区,也就是退回add
之前的状态,最后再次git checkout readme.txt
结束;
感觉更像是从仓库一路退回到了暂存区,然后又退回到了工作区
- 如果你已经
commit
了,就直接用版本回溯到之前的版本就OK了(git reset —hard 版本号
)。
感觉reset命令就是为了在不同的仓库版本中切换
删除文件
尽量用git rm 文件名删除
(暂存区中删除),然后git commit
提交到版本库。
如果误删的情况下,也就是说你只是在工作区误删了文件的话,可以用git checkout -- 文件名
恢复(从暂存区恢复)
小结
第一步 : 在需要git
管理的文件夹下打开git base here
;
第二步:在git
中进行项目管理的初始化 git init
;
第三步:在git
中创建自己的项目文件;
第四步:通过git add *
将所有的项目文件添加进去临时区域内;
第五步:通过git commit -m 操作说明
将临时区域内的项目推送到本地的仓库上去;
第六步:对项目进行修改之后,可以先看看修改了哪些东西,使用git diff
;
第七步:确认完修改之后,可以通过git commit -a -m 操作说明 来进行上传了;
第八步:如果需要切换版本,只需要通过git reflog
查看下自己的操作历史,然后通过git reset --hard 版本号
就可以自由的切换不同的状态了。
第九步: 如需删除文件,使用git rm 文件名
来进行删除,然后通过git commit -a -m
提交
第十步:如果发生在本地误删的情况,可以直接使用git checkout
把临时区域的内容拉到本地
以上的知识只是个人在用的时候本地代码的一个管理而已,并不涉及远程多人共同协作,如果你只是在本地管理代码的话,上面的命令足够你使用了,因为毕竟你知道了如何让自己的代码库添加、删除、和回溯。代码的每一次修改也都会做记录,你可以随时恢复最新的版本和退回老的版本,并且比较每次代码的不同之处,找到原因。
连接远程仓库
$ ssh-keygen -t rsa -C "youremail@example.com"
创建自己的ssh
密钥,用于跟远程的服务器进行通信,它毕竟得知道这个是你亲自推送的代码才行。
要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git
将我们本地的仓库与远程的github 上的仓库连接起来
下一步,我们开始推送我们本地仓库上的内容
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,git
不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub
页面中看到远程库的内容已经和本地一模一样:
git push -u origin master
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
上面是从本地上传到远程库上去
如果想要从远程库中克隆一份,那么就使用git clone git 地址
就可以了
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
git
支持多种协议,包括https
,但通过ssh
支持的原生git
协议速度最快。
说白了,克隆和推送都是为了创建本地和远程的一个连接,只要第一步连接好了,我们就可以进行下一步的操作了;
分支管理
我们可以使用git
的分支管理功能,把项目分为开发版本、测试版本、生产版本,方便我们在工作中对代码进行管理。
git
鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
结合版本回溯,master
是主分支,各个分支点都是历史版本,目前指向最新的版本上
创建一个新的分支,叫做dev
目前我们的操作是在dev
分支上的,自然,我们现在就指向了dev
,它跟master
没什么关系了。
将dev
分支合并到主分支上去,分支其实就是为了在不影响主代码的情况下进行代码修改,根据实际情况跟最后的版本进行合并。
这里,我们要考虑一种情况,就是如果我在分支dev
中修改了内容,同时,我又在主分支master
中修改了内容,那么它们合并的时候一定会出现问题!!!
这里,不去考虑复杂的合并分支情况,一般我们开发的话,都会在分支上进行开发,确定没问题之后,合并到主分支中去。
实际情况的考虑
远程分支和本地分支
两条分支最好是一一对应的, master
分支和dev
分支在本地和远程都有两条;
创建分支确实挺容易的,也不复杂,这里就不考虑创建分支的成本性了。你可以理解为创建分支就是又创建一个工作区-暂存区-仓库这样的仓库2,现在你就拥有了仓库1
,仓库2
了。
目前感觉分支的操作都是在本地操作的,也就是针对本地分支的合并啊,在本地合并之后,再往同名的远程分支中push
,那远程分支怎么完成合并呢?
一般我们
git clone
下网站源码的时候,默认情况下是主分支是有的,但其余的分支是没有的,这时候我们就需要在本地创建新的分支,这些分支对应着远程中的分支,然后将分支中的代码pull
到本地去,比如远程的dev
分支要这么操作:
git clone SSH地址 //克隆整个项目(默认得到的就是主分支,其他分支并没有)
git checkout -b dev //在本地创建分支
git pull origin dev //从远程的DEV分支拉到本地的dev分支
git add ...
git commit ...
git push origin dev //修改完毕后传递到远程的dev分支上去
假设远程公共仓库,有一个master
和一个dev
分支,进行多人协作开发时候(每个人的公钥必须加入到远程账号下,否则无法push
), 每个人都应该clone
一份到本地。 但是clone
的只是master
,如果远程的master
和dev
一样,没关系;如果不一致,则需要clone
出dev
分支 git checkout -b dev origin/dev
之后每个人在本地的dev
分支上独自开发(最好不要在master
上开发), 开发完成之后push
到远程dev git push origin dev
。 之后审核人再确定是否合并dev
到master
。
在进行任何的
push
操作之前,一定要先pull
一下远程的分支代码,毕竟这个分支代码是被很多人修改的,你只有最新的版本才能和自己的修改合并才行。
结语
到此,关于git
的日常基本操作就基本完成了,更多的git
语法请移步git官网。
感谢李致远老师(https://github.com/aylizhiyuan)提供学习资料