Git介绍
———本文是学习廖雪峰老师的Git教程之后所写的笔记,方便记忆,提高。
Git是目前世界上最先进的分布式版本控制系统。
版本控制就是可以在一个项目,管理、控制自己写的不同版本的代码。可用于团队协作、在不修改原代码的情况下通过分支开发新功能以及临时修改程序bug等。同时,还可以记录下代码修改操作,便于查看和管理代码。简单理解,就是一个管理代码的系统。
此外,还要弄清分布式与集中式的区别:
| 区别 | 集中式 | 分布式 |
|---|---|---|
| 互联网 | 必须 | 非必须,可以本地操作 |
| 中央服务器 | 有 | 无,仅用于交换代码 |
| 便捷性 | 低,依赖服务器 | 高 |
| 安全性 | 低 | 高 |
| 主要软件 | SVN,CVN | Github,BitKeeper |
Git安装
- Linux上安装方式:
sudo apt-get install git - Mac上安装方式:通过
homebrew安装或通过Xcode安装 - Windows上安装Git:直接到官网下载安装包安装
安装完后,还要对git进行设置
$git config --global user.name "Your name"
$git config --global user.email "example@email.com"
配置个人信息,--global全局参数表示机器上所有git仓库都使用这个配置
创建版本库
版本库(reposity)就是一个代码目录,目录里的所有文件都可通过Git进行管理。
创建代码:
$ mkdir newCode
$ cd newCode
$ git init
运行结果:
Initialized empty Git repository in /Users/taokexia/newCode/.git/
git init:把目录变成git管理目录。在目录下会生成.git文件(Linux下,通过ls -ah可查看该文件),没事不要手动修改目录,避免破坏版本库
如果使用的是Window系统,为避免因字符集的问题出错,要确保目录名不含中文
把文件添加到版本库
不要使用Windows自带的记事本编辑任何文本文件,会造成错误。
使用git add (文件名)往当前代码库添加文件。可一次添加多个文件。
使用gti commit -m (注释内容)把文件提交到仓库,-m表示添加本次提交的说明,最好有意义,明白本次提交代码的主要作用,便于以后查看
Git版本控制
查看版本库
使用git status查看当前代码库的状态,了解到当前代码是否上传。(常用)
常见有三种状态:
- 还没有提交修改
# On branch master
# Changes not staged for commit
- 以及提交修改
# On branch master
# Changes to be committed:
- 提交成功
# On branch master
nothing to commit (working directory clean)
使用git diff (fileName) 查看文件修改的地方。
使用git log查看提交的历史记录,使用参数--pretty=oneline简洁显示
window下查看结果:
图片中comit行显示的16进制数是commit id(版本号)可用于控制版本。
跳转版本库
git reset --hard HEAD:查看当前版本号,HEAD指针指向当前版本号
结果显示为:
HEAD is now at 143cc02 three hello
使用git reset往之前的版本号跳:
如要跳转到上一版本的代码库,使用代码git reset --hard HEAD^,使用HEAD^^表示跳转到上两个版本,HEAD~100表示跳转到上100个版本
注意:跳转后,git log显示也会发送改变,只显示当前版本号之前的历史信息。
使用git reset跳往后面的版本号:
git reset --hard 143cc02,143cc02为版本号前几位数字。
查看版本号方式:
git reflog记录你的每一次命令,并提供了跳转的号码
暂存区和工作区
工作区:代码库所在的文件夹就是工作区。工作区有隐藏目录.git,为版本库。
版本库里包括暂存区(stage),分支和指针HEAD
git工作时,当接收到add命令时,把文件添加到暂存区,再通过commit把暂存区文件添加到分支。即需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
注意:
每修改一次文件,git add把文件加入到暂存区,再修改文件,暂存区内的内容没有发生变化,这时候如果使用git commit则最后一次修改的内容没有保存到分支中。避免的方法是:没修改一次文件,就使用add添加一次文件。
修改操作
撤销修改:
使用git chekcout -- (文件名)来撤销对文件的修改,如果文件修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态。如果已经添加到暂存区,则撤销修改就回到添加到暂存区后的状态
如果想把暂存区的修改撤销掉,使用代码git reset HEAD (文件名),文件重新回到工作区。
删除操作:
使用git rm (文件名)删除代码库里的文件。
如果想恢复删除的文件,则使用git checkout -- (文件名),用版本库里的版本替换工作区的版本。
远程仓库
Git可以通过服务器管理代码,每个人都可以从这个服务器仓库克隆一份代码到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也可以从服务器仓库中拉取别人的提交,完成协作开发。
实现远程管理可以通过Github网站,Github是提供Git仓库托管服务的免费网站,通过SSH加密进行代码传输。
Github设置SSH:
创建SSH key:$ ssh-keygen -t rsa -C "youremail@example.com"
创建完成后,可以在目录里看到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
设置SSH:登陆GitHub,打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你看到已经添加的Key
SSH作用:GitHub通过SSH识别出你推送的提交确实是你推送的
远程仓库操作
添加远程库:
Github仓库与本地仓库同步操作:
首先,登陆GitHub,创建一个新的仓库
在Repository name填入仓库名,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库,仓库目前没有任何代码。\
在本地代码目录下,使用$ git remote add origin git@github.com:(用户名)/(仓库名).git,这样,本地就关联了远程库。远程库的名字就是origin,这是Git默认的叫法,也可以改成别的。
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会推送代码,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时只需要使用git push origin master命令。
从远程库克隆:
使用git clone git@github.com:(用户名)/(仓库名).git克隆一个本地库。
Git支持多种协议,包括
https,但通过ssh支持的原生git协议速度最快。
分支管理
创建合并分支
创建分支:
当我们创建新的分支,会创建一个分支指针,例如Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。Git创建分支主要进行操作:创建一个dev指针,改变HEAD指针指向。工作区文件没有任何变化。
此后,对工作区的修改和提交主要针对的是dev分支,而master分支没有变化
创建代码:
$ git checkout -b dev
checkout命令加上参数-b表示创建并切换,等价于:
$ git branch dev
$ git checkout dev
查看代码:
git branch
会列出所有分支,在当前分支前面会标一个*
$ git branch
* dev
master
切换分支代码:
$ git checkout master
切换到master分支
合并分支:
Git合并直接把master指向dev的当前提交,就完成了合并,通过修改指针实现合并,工作区没有任何变化。合并完成之后,最后的步骤是删除dev指针。
合并代码:
$ git merge dev
合并指定分支到当前分支。如果合并没有发生冲突,常见的模式是:Fast-forward,表示这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
如果合并的两分支都有了各自的提交,则可能会发生冲突,这时合并模式就不是Fast-forward,这时必须手动解决冲突。
通过git status获取冲突的文件,
在冲突的文件内容里面,git会对冲突的部分进行标记,使用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,修改完冲突后保存文件。使用add,commit命令传递文件,合并完成。
使用
$ git log --graph --pretty=oneline --abbrev-commit可以查看分支合并图
删除分支代码:
git checkout -d dev
因为创建、合并和删除分支非常快,所以使用分支完成某个任务,合并后再删掉分支,这样更安全。
分支管理策略
在Fast-forward模式下,删除分支后,会丢失分支信息。强制禁用Fast-forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
禁用Fast-forward代码:
git merge --no-ff -m "description" (合并分支名)
--no-ff表示禁用Fast-forward模式,-m表示添加描述,不使用Fast-forward模式,merge后分支dev指针位置没有变化,HEAD指针指向master
分支管理原则:
- 保持
master分支稳定,仅用于发布新版本 - 主要在
dev分支上编写代码,要发布新版本时才合并到master上 - 每个人都可以有自己的
dev分支,时不时地往dev上合并分支
bug分支:
遇到程序出bug时,常见的做法是建立新的临时分支,进行修复,修复后再合并分支,删除临时分支。
此外,如果当前项目只进行了一半,可以使用git stash功能,把当前工作现场储藏起来,等以后恢复现场后继续工作。
git stash list
查看储存的工作环境,恢复工作环境代码
git stash apply #恢复,不过恢复后需要删除stash内容
git stash drop #删除
git stash pop #恢复的同时,删除stash
git stash apply stash@{0} #如果有多个stash,可以指定恢复的stash
Feature分支: 通过创建Feature分支,可以在不影响主程序的情况下,给程序添加新的功能,完成后,再合并,删除分支。
如果要丢弃一个没有被合并过的分支,可以通过
git branch -D <分支名>强行删除。
多人协作:
查看远程库信息:git remote
查看远程库更详细信息:git remote -v
推送分支:git push origin master,推送master分支到远程库中
推送原则:
master主分支,要时刻与远程同步dev是开发分支,也需要与远程同步bug分支只用于在本地修复bug,就没必要推到远程feature分支是否推到远程,取决于是否需要合作开发
抓取分支:
clone远程库使,默认只克隆master分支,可在本地往远程库推送dev分支,如果发生推送冲突,可使用git pull把最新的提交从origin/dev抓下来,在本地合并,解决冲突,再推送。
如果git pull也失败了,提示no tracking information,则原因是没有指定本地dev分支与远程origin/dev分支的链接,设置代码:
$ git branch --set-upstream dev origin/dev
多人工作模式:
- 用
git push origin (分支名)推送自己的修改 - 推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并 - 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用
git push origin (分支名)推送就能成功
标签管理
由于版本的commit id难于记忆,一般使用标签标记版本号,便于记忆,操作
创建标签:
切换到需要打标签的分支上,使用git tag (name)就可以打一个新标签。
使用git tag (name) (commit id)给对应的commit id的版本打上标签
git tag查看标签,创建带有说明的标签:
-a指定标签名,-m指定说明文字,-s指用私钥签名一个标签,签名采用PGP签名git show (标签姓名)查看标签信息
操作标签:
删除标签:git tag -d (标签名)
推送一个本地标签:git push origin (标签名)
可以推送全部未推送过的本地标签:git push origin --tags
删除一个远程标签:git push origin :refs/tags/<标签名>
自定义Git
git config --global color.ui true让Git显示颜色,会让命令输出看起来更醒目
忽略特殊文件:
Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
使用git add -f (文件名)强制添加文件
使用git check-ignore检测忽略文件
忽略文件的原则:
- 忽略系统生成文件
- 忽略编译生成的中间文件、可执行文件等
- 忽略你自己的带有敏感信息的配置文件
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
配置别名:
$ git config --global alias.st status
git st等价于git status
配置文件存放位置`每个仓库的Git配置文件都放在.git/config文件中``,别名就在[alias]后面
搭建Git服务器:
答建Git服务器首先需要准备一台运行Linux的机器
- 安装git
sudo apt-get install git\ - 创建一个git用户,用来运行git服务:
sudo adduser git - 创建证书登录:所有公钥导入到
/home/git/.ssh/authorized_keys文件里,一行一个 - 初始化Git仓库,
sudo git init --bare (版本库名).git - 禁用shell登录,编辑
/etc/passwd文件,改为git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell - 克隆远程仓库,通过
git clone命令克隆远程仓库