背景
自从 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
也可以关注我的公众号:程序之声
关注公众号,回复:下载
获取百度下载神器:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于