git 使用教程

本贴最后更新于 2166 天前,其中的信息可能已经时过境迁

背景

自从 git 出来了之后,大家都纷纷使用 git 了,毋庸置疑 git 已经成为主流,如果你还在使用 svn 来管理项目,那赶紧开始学习 git 吧。

svn 和 git 的区别

svn 工作模式
imagepng
缺点:如果 svn 挂了或者网络挂了,那么代码就没办法提交了。

git 工作模式
imagepng
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

imagepng
表示安装成功

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
安静的执行,不输出任何日志
imagepng

-v|--verbose
详细的运行,输出比较详细的日志
imagepng

-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
以简单的方式输出信息
imagepng

-b|--branch
如果没有-s,那么跟 get status 输出一样
如果有-s 那么会显示当前分支
imagepng

-v|--verbose
输出更加详细的日志
imagepng

git diff

查看改变

git diff
查看工作区与暂存区的差别。

git diff --cached
查看暂存区与本地仓库的差别。
imagepng

git diff HEAD
查看工作区和本地仓库的差别。

git diff test test2
比较两个仓库的不同。
imagepng

git commit

把暂存区的数据提交到本地仓库。

-a|--all
提交所有暂存区里的文件,没有加入暂存区的文件不会被提交。

--branch
日志中输出当前分支。

-m <msg>|--message=<msg>
添加提交的备注。

git reset

重置 HEAD 到另一个 commit。
imagepng

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
显示变更的文件

imagepng
加了--stat 的展示
imagepng

-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

以用户的维度输出日志。
imagepng

-e
显示邮件

git revert

恢复某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次恢复作为一次最新的提交。前提条件是你的工作区是最新的。
imagepng

git stash

把当前未提交的文件暂时存储起来,等你做完其他的事情之后在还原回来。
使用场景:
比如你正在开发一个功能,突然来了一个很紧急的测试 bug,需要马上修改掉,但是你代码写了一半,提交上去可能会出问题,如果你不知道 stash 这个命令,那么你可能会在本地新建一个分支,修改完 bug 之后把这个分支删掉。使用 stash 这个命令,那么你可以暂时把你的代码存储起来,等修改完 bug 之后在显示出来。这样就不需要在本地拉个分支了。大大的节约了时间。

分支管理

imagepng

master:主干,上线的时候代码都会合到这里,一般会控制上传代码的权限。
分支:给开发用,一般开发一个新功能或者一个迭代,都会拉一个分支。
标签:每次上完线都会打个 tag。

分支切换原理:

imagepng
只是把指向版本 3 的指针指向了版本 2

也可以关注我的公众号:程序之声
关注公众号,回复:下载
获取百度下载神器:
imagepng

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3454 回帖 • 189 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • 教程
    143 引用 • 611 回帖 • 8 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...