背景
自从git出来了之后,大家都纷纷使用git了,毋庸置疑git已经成为主流,如果你还在使用svn来管理项目,那赶紧开始学习git吧。
svn和git的区别
svn工作模式
缺点:如果svn挂了或者网络挂了,那么代码就没办法提交了。
git工作模式
git是离线的,你可以在自己机器上创建仓库,后面再选择提交到远程仓库上去。
git中几个名词解释:
工作区(working tree):就是你工作所在的目录,每当你在代码中进行了修改,working tree的状态就改变了。
暂存区(index):是索引文件,它是连接working tree和commit的桥梁,每当我们使用git add命令之后,index file的内容就改变了,此时index file就和working tree同步了。
本地仓库(commit):是最后的阶段,只有commit了,我们的代码才真正进入了git仓库。我们使用git commit就是将index file里的内容提交到本地仓库(commit)中。
git安装
1、window
下载地址:
https://git-scm.com/download/win
然后下一步下一步就可以了。
2、linux
1)安装依赖包
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
2)下载git并解压
wget https://github.com/git/git/archive/v2.3.0.zip
unzip v2.3.0.zip
cd git-2.3.0
3)编译
make prefix=/usr/local/git-2.3.0 all
make prefix=/usr/local/git-2.3.0 install
4)环境变量
添加环境变量
vim /etc/profile
export PATH=/root/svr/git/bin:${PATH}
立即生效
source /etc/profile
安装是否成功
git --version
表示安装成功
gitlab安装
1、下载地址
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/
2、安装依赖
sudo yum install -y curl openssh-server openssh-clients cronie
sudo lokkit -s http -s ssh
安装邮件服务
sudo yum install postfix sudo service postfix start sudo chkconfigpostfix on
3、安装gitlab
sudo rpm -ivh gitlab-ce-9.5.4-ce.0.el6.x86_64.rpm
4、配置
vim /etc/gitlab/gitlab.rb
external_url='http://xxxxxx'
unicorn['port'] = 9081
5、启动
sudo gitlab-ctl reconfigure
其他命令
sudo gitlab-ctl start # 启动所有 gitlab 组件;
sudo gitlab-ctl stop # 停止所有 gitlab 组件;
sudo gitlab-ctl restart # 重启所有 gitlab 组件;
sudo gitlab-ctl status # 查看服务状态;
sudo gitlab-ctl reconfigure # 启动服务;
sudo vim /etc/gitlab/gitlab.rb # 修改默认的配置文件;
常用命令
git init
该命令创建一个空的仓库,在文件夹下面会出现.git文件夹。
1)-q|--quiet
只打印错误或者警告信息。
2)--bare
创建一个裸仓库,创建的仓库不包含工作目录。一般使用这个命令,文件名会设置为.git结尾。普通仓库不能被 push,因为可能会有暂存文件,从而导致冲突,所以 git 做了限制。bare 仓库可以被 push,因为它禁止在仓库里工作(没有暂存文件),不存在上面的问题。现在的代码托管服务 github 这些,新建仓库都是 bare,所以见到的克隆地址都是 xxx.git。
3)--template=
规定目录使用哪个模板。模块的配置如下(优先级从高往下):
1、在参数后面配置 --template 选项
2、设置环境变量 $GIT_TEMPLATE_DIR
3、配置 init.templateDir 变量
4、默认模板目录:/usr/share/git-core/templates
4)--separate-git-dir=
不是创建一个文件目录,而是创建一个文本文件,这个文本文件包含实际的仓库地址,将git仓库与文件系统做一个符号链接,指向特定的路径。如果他被重新初始化,这个仓库将移动到真实的地址。
5)--shared[=(false|true|umask|group|all|world|everybody|0xxx)]
指定仓库的权限,默认是group
umask |flase
用户权限根据权限掩码。
group |true
当前组有什么权限,仓库也有相应的权限。
all | world | everybody
与group相似,确保所有用户可以读。
0xxx
是一个八进制码,0xxx会覆盖用户的umask(权限掩码),0640表示仓库组可读,但是组不能写或者其他人不能访问。0660表示仓库对当前用户或者组可读可写,其他人不能访问。
补充:在命令行中涉及到的目录,如果不存在,那么在执行的时候会去创建。
git clone
将仓库克隆到新的目录下,为克隆仓库创建一个远程跟踪分支。
-l|--local
如果你克隆本地机器的仓库,在克隆的时候,会绕过Git aware传输机制,直接复制本地仓库的HEAD、objects和引用目录。为了节省空间.git/objects/下面的文件都是硬连接。
如果仓库地址是本地地址,如/path/test,那么--local将不起效果。如果仓库地址是网址,这个选项将被忽略。
如果使用--no-local,那么/path/test会使用git传输机制获取仓库。
--no-hardlinks
在本地文件系统中强制去克隆一个仓库,生成一个不是硬连接的仓库,他的作用是对你的仓库做一个备份。
-s|--shared
当要克隆的仓库在本地机器上时,不使用硬链接,而是自动设置.git/objects/info/alternates,以便与源仓库共享对象。生成的仓库开始时没有自己的任何对象。
-q|--quiet
安静的执行,不输出任何日志
-v|--verbose
详细的运行,输出比较详细的日志
-n|--no-checkout
克隆完成之后,不执行HEAD的检出
git add
更新索引,能让他在暂存区中找到,为下次提交做准备。
可以通过git status命令来查看文件的状态。
<pathspec>
需要添加的文件,如*.c,可以添加所有以.c结尾的文件。也可以是一个目录名,如dir,会把dir/file1和dir/file2都提交。
如果你想添加修改或者新建的文件,但是不包括删除的文件,那么使用--no-all选项。
-v|--verbose
详细输出日志
-n|--dry-run
不实际添加文件,只是看看哪些文件存在或者可能被忽略
-f|--force
允许添加其他被忽略的文件
-i|--interactive
以交互的方式进行添加。
-A|--all|--no-ignore-removal
如果配置了<pathspec>,那么这个目录下的所有文件都会被加入到暂存区。
如果没有配置<pathspec>,那么所有文件都会被加入到暂存区。
--refresh
不添加文件,只刷新他们在暂存区的状态
--ignore-errors
如果某个文件添加到暂存区的时候,报错了,可以使用这个命令忽略报错,但是会把没有报错的文件添加到暂存区里面。
git status
查看工作区的状态
-s|--short
以简单的方式输出信息
-b|--branch
如果没有-s,那么跟get status输出一样
如果有-s 那么会显示当前分支
-v|--verbose
输出更加详细的日志
git diff
查看改变
git diff
查看工作区与暂存区的差别。
git diff --cached
查看暂存区与本地仓库的差别。
git diff HEAD
查看工作区和本地仓库的差别。
git diff test test2
比较两个仓库的不同。
git commit
把暂存区的数据提交到本地仓库。
-a|--all
提交所有暂存区里的文件,没有加入暂存区的文件不会被提交。
--branch
日志中输出当前分支。
-m <msg>|--message=<msg>
添加提交的备注。
git reset
重置HEAD到另一个commit。
git reset HEAD
表示重置到HEAD这个版本。
git reset HEAD~3
表示重置到更早的第三个版本。
--soft
不重置暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响) 。
--mixed
重置暂存区和本地提交的内容为未暂存的状态,但不重置工作区。
--hard
重置暂存区和工作区。将已提交的内容的版本恢复到本地。
--merge
重置暂存区,如果回退版本和最新版本不一样,那么会修改工作区的文件,但是会保留工作区的修改。如果暂存区里有未提交的文件,那么重置将被终止。
-keep
重置暂存区的文件,如果回退版本与最新版本不同,那么修改工作区的文件。
如果该文件在工作区中已经编辑过,那么重置将被终止。
git rm
在暂存区中移除该文件或者文件夹。
<file>
移除的文件,如*.c,移除所有以c结尾的文件。也可以设置目录。
-f|--force
强制删除暂存区文件
-r
当给定一个主目录名时,允许递归删除。
--cached
从暂存区中删除文件或者路径。工作区的文件不论有没有被修改都会被保留。
git branch
默认列出所有本地分支
-r
列出所有远程分支
-a
列出所有分支
-v |-vv
查看最近提交
git branch [branchname]
创建本地分支
--track [branch] [remote-branch]
基于远程仓库创建本地分支
-d [branchname]
删除本地分支
git checkout
git checkout [branchName] / git checkout -b|-B dev origin/dev
切换本地分支或者基于远程创建本地分支。
-b
根据指定的版本创建一个新的分支名。
-B
根据指定的版本创建一个新的分支名。如果已经存在那么进行重置。
git log
查看提交日志
--stat
显示变更的文件
加了--stat的展示
-S<string>
根据关键字进行搜索
git tag
git tag [tagname]
创建标签
-d
如果标签存在就删除。
git fetch
更新git remote 中所有的远程仓库,所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中。
git pull
将来自远程仓库的更改合并到当前分支中。git pull会先使用git fetch获得当前指向的远程分支的后续版本的数据,然后在使用git merge将本地分支进行合并。
git push
推送指定分支到远程仓库。
-u|--set-upstream
为每个推送成功的分支加跟踪引用。第一次push需要加上。
--all
推送所有分支
-d|--delete
删除远程仓库分支
--tags
所有refs/tags下面的tag都推送。
-f|--force
强制推送。
git remote
查看所有远程仓库。
git remote add origin [URL]
添加远程仓库
git remote rename <old> <new>
对远程仓库重命名。
git remote remove <name>
移除远程仓库。
git shortlog
以用户的维度输出日志。
-e
显示邮件
git revert
恢复某次操作,此次操作之前和之后的commit和history都会保留,并且把这次恢复作为一次最新的提交。前提条件是你的工作区是最新的。
git stash
把当前未提交的文件暂时存储起来,等你做完其他的事情之后在还原回来。
使用场景:
比如你正在开发一个功能,突然来了一个很紧急的测试bug,需要马上修改掉,但是你代码写了一半,提交上去可能会出问题,如果你不知道stash这个命令,那么你可能会在本地新建一个分支,修改完bug之后把这个分支删掉。使用stash这个命令,那么你可以暂时把你的代码存储起来,等修改完bug之后在显示出来。这样就不需要在本地拉个分支了。大大的节约了时间。
分支管理
master:主干,上线的时候代码都会合到这里,一般会控制上传代码的权限。
分支:给开发用,一般开发一个新功能或者一个迭代,都会拉一个分支。
标签:每次上完线都会打个tag。
分支切换原理:
只是把指向版本3的指针指向了版本2
注意:本文归作者所有,未经作者允许,不得转载