Git是为托管Linux系统而开发的免费分布式版本控制系统,本文介绍其基本使用方法,使用平台为Linux
1. 版本控制系统
集中式版本控制系统:所有代码保存在一台中央服务器,不同开发者通过客户端提交自己的修改
分布式版本控制系统:每个人的电脑上均有一个完整的代码库,一般由中央主机控制交换代码修改
2. Git的配置
在使用Git前需要进行全局配置,例如设置用户名及email,这些将作为提交代码时的签名,基本语法如下:
git config [--global] <配置名称> <配置值>
例如,设置用户名和email的命令:
$ git config --global user.name "username"
$ git config --global user.email "exam@gmail.com"
- 注意若在某次使用时不想使用全局设置,则可以去掉
--global
参数 - 全局配置文件位于
.gitconfig
,为隐藏文件,可通过ls -al
查看 - 针对某个项目的配置位于
.git/config
中
3. 创建Git仓库
一般有两种方法来得到一个代码仓库,即从GitHub克隆或新建一个代码仓库
① 从代码仓库克隆
克隆就是把GitHub上的代码仓库拷贝到本地,首先要获取目标仓库的地址,即URL,使用如下代码进行克隆:
$ git clone https://github.com/example
克隆完成后将在当前目录下出现该代码仓库对应的文件,进入该文件即可操作
② 新建空代码仓库
若要新建一个代码仓库,则需要现在本地新建一个文件夹,在使用Git将其初始化为代码仓库,代码如下:
$ mkdir project
$ cd project
$ git init
代码仓库建立完成后会出现一个.git
文件夹,存储相关项目配置文件
4. Git操作流程
对Git代码仓库进行修改一般需要如下操作流程:
- 创建或修改文件
- 使用git add
将修改添加到本地缓存区
- 使用git commit
提交到本地代码仓库
- 使用git push
提交到远端代码库
下面使用上述创建的代码仓库project为例进行操作:
进入project文件夹,创建新文件并增加内容,并用git status
查看代码仓库状态:
$ cd project
$ touch file1 file2 file3
$ echo "test" >> file1
$ echo "test" >> file2
$ echo "test" >> file3
将修改添加到本地缓冲区,再次查看状态,使用git diff --cached
查看哪些文件发生变化:
git add file1 file2 file3
git diff --cached
注意:查看变化后按q键可以退出,不带参数--cached
可以参看未添加到缓冲区的修改
提交代码到本地代码库
git commit -m "myMessage"
注意: -m
参数用于添加提交注释,-a可以提交未加入缓冲区的内容,但不能提交新建文件
4. 分支与合并
为了便于多人协作开发,Git支持多分支,即可以在主线(master)之外提交代码,不影响代码库的主线,确认开发完成后再将分支合并
下面给出创建分支,切换分支及合并分支的示例代码:
创建一个分支examplebranch
:
$ git branch examplebranch
查看当前分支,结果中带星号的为当前分支:
$ git branch
切换到刚创建的分支:
$ git checkout examplebranch
注意:可以尝试在两个分支上修改文件,可以看到两个分支互不影响
切换回master分支,合并所作的修改:
$ git checkout master
$ git merge -m "Merge branch" examplebranch
注意:若两个分支修改的是不同的文件则合并成功,若修改了同一个文件,则会产生冲突
冲突的手动解决办法:使用文本编辑器打开冲突文件,删掉Git自动增加的冲突符号<<<<<<
,用git add
和git commit
提交修改
删除不再使用的分支:
# 删除已合并分支
$ git branch -d examplebranch
# 强制删除分支
$ git branch -D branchname
撤销分支合并操作:
$ git reset --hard HEAD^
5. Git日志
通过查看Git的日志,可以方便地了解曾对代码库做过的修改,查看日志的基本命令为git log
实际Git的日志功能非常强大,具体可以通过git help log
来查看其详细功能
# 查看日志
$ git log
# 日志统计,即详细的修改记录
$ git log --stat
# 格式化日志
$ git log --pretty=oneline
$ git log --pretty=short
# 显示提交历史线
$ git log --graph
# 自定义日志格式
$ git log --format: %h : %s
# 控制日志顺序,默认为逆时间顺序`--topo-order`,可以用参数`--reverse`换为顺序显示
$ git log --reverse
$ git log --topo-order
6. 内容比较
使用Git的diff
可以方便地进行不同分支、不同版本之间的比较
通过命令git help diff
可以查看其详细用法
在使用git diff
时需要注意以下几点:
- 不带参数时,比较的是未加入缓冲区的修改,但不能看到新建文件
- 要查看缓冲区的修改,使用参数
--cached
- 查看结束后按下
q
退出比较环境 git diff branch1 branch2
可比较不同分支之间的区别,只带一个分支时比较当前分支与指定分支的区别- 可以增加路径限定,只比较某个文件或目录的不同
git diff branch1 --stat
可以统计该分支具体有哪些改动
7. 分布式开发
如果不同的用户进行协作开发,他们如何向对方的代码库提交修改呢?
首先,每个工作者都需要克隆一份代码仓库,克隆完成后将建立一个一个名为myrepo
的目录:
$ git clone [path] myrepo
当工作者将myrepo修改完毕后,需要将修改合并到主代码库,具体方法是在主代码库执行pull
命令:
$ git pull [path]/myrepo master
注意:这里实际上隐含执行了两条命令,一是git fetch
从远程分支抓取修改内容,而是通过git merge
合并分支
在副本代码库中也可以执行git pull
,这时由于配置文件记录了主代码库信息,故不需要指定路径,可以直接将主代码库的更新合并进来
上述命令也可以分开执行:
# 经常访问的远程代码库可以定义简写名
$ git remote add myrepo [path]
# 抓取内容
$ git fetch myrepo
# 抓取后可以用log查看远程代码库的修改
$ git log -p master ..myrepo/master
# 合并代码库
$ git merge myrepo/master
注意:若远程代码库不在本地主机上,可以通过ssh协议来访问,即git所需的地址可以是本地路径,也可以是ssh地址
在实际开发中,通常会有一个公共的代码仓库
每个开发者都可以从对方的代码库中通过一定协议抓取修改,但没有写的权限,如何上传代码到公共仓库?
可以使用git push
命令来推送代码,目标地址可以使用ssh/http/https,推送失败git会报错
注意:如果在推送代码时发现公共代码库已经发生修改,则应先pull
合并修改,再用push
一并推送
8. Git标签
Git中可以使用一个标签来指定某一次提交,具体命令为git tag
不带任何参数时,创建的标签为轻量级标签
# 查看提交记录,获取commit名称(一串字母和数字)
$ git log
# 使用stable-1作为commit1的代称
$ git tag stable-1 [commit1Name]
注意:commit名称很长,一般写8位以上即可
如果想要为标签添加注释,或者附加一个签名,则需要创建标签对象
使用附加参数-a
、-s
、-u
参数中任意一个,均可创建标签对象,使用-m
添加注释
例如,下面的命令创建了带注释的标签:
git tag -a stable-2 8c315325 -m "stable 2"
标签的签名有以下两种方法添加:
- 先在配置文件.gitconfig
或者.git/config
中进行配置,在创建tag时使用-s
参数引用
$ git config (--global) user.signingkey <gpg-key-id>
$ git tag -s stable-1 [commit1Name]
- 未进行配置时直接使用
-u
参数进行添加
$ git tag -u <gpg-key-id> stable-1 [commit1Name]