GIT
GIT
什么是GIT
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git的读音为/gɪt/。
Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 最近就迁移到 Git 上来了,很多 Freedesktop 的项目也迁移到了 Git 上。
Git的特点:
分布式和集中式的最大区别在于开发者可以本地提交。每个开发者机器上都有一个服务器的数据库
Git的功能特性:
从一般开发者的角度来看git有以下功能:
1:从服务器上克隆数据库(包括代码和版本信息)到单机上。
2:在自己的机器上创建分支,修改代码。
3:在单机上自己创建的分支上提交代码。
4:在单机上合并分支。
5:新建一个分支,把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6:生成补丁(patch),把补丁发送给主开发者。
7:看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8:一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
功能
从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
1:查看邮件或者通过其它方式查看一般开发者的提交状态。
2:打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3:向公共服务器提交结果,然后通知所有开发人员。
优点:
适合分布式开发,强调个体。
公共服务器压力和数据量都不会太大。
速度快、灵活。
任意两个开发者之间可以很容易的解决冲突。
离线工作。
缺点:
资料少(起码中文资料很少)。
学习周期相对而言比较长。
不符合常规思维。
代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
Git 与 SVN 区别
Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。
Git 与 SVN 区别点:
-
1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
-
**2、Git 把内容按元数据方式存储,而 SVN 是按文件:**所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
-
**3、Git 分支和 SVN 的分支不同:**分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
-
**4、Git 没有一个全局的版本号,而 SVN 有:**目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
-
**5、Git 的内容完整性要优于 SVN:**Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
GIT 的安装
在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。
Git 各平台安装包下载地址为:http://git-scm.com/
- 选择 Downloads去下载
- 选择你所想要安装的平台
在Windows 平台上安装
官网慢,可以用国内的镜像:https://npm.taobao.org/mirrors/git-for-windows/。
完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。
在开始菜单里找到"Git"->“Git Bash”,会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。
GIT 命令
配置
检查配置
# 打印所有config
git config --list
# 打印指定config
git config user.name
对用户名和邮箱的操作
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的 提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改
–global
通过 --global 选项可以设置全局配置信息
查看用户名
$ git config user.name
查看Email
$ git config user.email
如果没有东西显示,则表示为创建用户名和邮箱,如果显示你的用户名和邮箱则表示创建了
-
未创建:
-
已创建:
创建用户名
$ git config --global user.name '你所创建的名字'
创建email
$ git config --global user.email '你所创建的邮箱'
对路径的操作
查看路径
$ pwd
如果是根目录,则显示 /
,如果是其他目录则会显示路径
其他目录,例如maitai目录的路径
修改路径
git 使用的 Linux 命令,所以我们用 cd 命令
进入根目录
$ cd /
进入你项目所在的盘
$ cd c/b/d/f/...盘
找到项目所在位置
$ cd 文件名
返回上一层
如果我们想换一个项目文件,但此项目和你的原有项目在一个文件在使用,我们可以通过
$ cd ..
返回上一层,注意注意cd和…之间有空格
返回上两层
$ cd ../..
查看项目文件
$ ll
加入我目录中有一个新建文件.txt则会显示:
创建仓库 - repository
进入希望纳入 git 版本控制的项目目录,使用 git init 初始化
git init
该命令将创建一个名为.git
的子目录(这是一个隐藏文件),这个子目录含有你初始化的 Git 仓库中 所有的必须文件,这个目录也是上面我们说的三个区域之一,这个目录也是 Git 保存数据记录的地方, 非常重要,如非必要,不要轻易改动
工作流与基本操作
当一个项目被 Git 初始化以后,只是表示我们希望通过 Git 来管理当前的这个项目文件的不同时期版本 记录,但是这个时候项目中已存在的文件,或者以后新增的文件都是没有进入版本控制管理的,它们是 未追踪(Untracked) 的状态
查看工作区的文件状态
git status
git status
查看工作区中的文件状态
乱码
git status 显示乱码
git config --global core.quotepath false
终端乱码
菜单 -> 设置 -> 文本 -> 本地 / 编码
或修改配置文件
[gui]
encoding = utf-8
# 代码库统一使用utf-8
[i18n]
commitencoding = utf-8
# log编码
[svn]
pathnameencoding = utf-8
# 支持中文路径
[core]
quotepath = false
# status引用路径不再是八进制(反过来说就是允许显示中文了)
添加工作区文件到暂存区
git add
提交到暂存区
# 添加一个文件
git add 1.txt
# 添加多个文件
git add 2.txt 3.txt
# 添加整个目录
git add ./a
# 添加多个目录
git add ./b ./c
# 添加所有文件和目录
git add .
git add 也可以将一个文件夹添加到暂存区,前提是这个文件夹不能是空的
创建版本
git commit
将暂存区里的改动给提交到本地 git 仓库,也就是为这次工作(一般会把某个具有特定意义的工作作为 一个版本,它可以是多个文件的变化)
- 添加到暂存区之后,需要提交修改,才可以让git对这些文件管理起来
- 每次提交同时会生成一个 40 位的哈希值,作为该次提交版本的唯一 id
提交备注
每次提交都需要填写备注信息
# 会调用默认(或自定义)的文本编辑器
git commit
修改默认编辑器
git config core.editor notepad
# 添加 vscode 编辑器 - mac
# 通过 vim 打开环境变量配置文件
vim ~/.bash_profile
# 添加环境变量
export PATH=/Applications/Visual\ Studio\
Code.app/Contents/Resources/app/bin:$PATH
# 保存退出
source ~/.bash_profile
# 测试:在终端中直接通过命令 code 调用 vscode
git config --global core.editor "code --wait"
单行备注
git commit -m 备注信息
例:
git commit -m '初始化项目'
分支
git 仓库创建后,会创建 一个默认的分支叫做 master(主分支)
我们的开发就像是游戏的任务,默认是在主线(master)上进行开发的。许多时候,还有各种支线任 务,git 支持我们创建分支来进行项目开发
建议:主分支上不要进行开发操作
当完成一个比较大的功能时(开发、或者修改、或者测试),建议创建一个新的分支,在此分支上进行上面的操作、完成开发任务,完毕之后,再将分支上的内容合并到 master 分支,如此的话,我们在分支上进行的修改就会体现在master分支上 所以 master 分支只保存项目的最稳定的版本
查看分支
git branch
创建分支
git branch 分支名称
切换分支
git checkout 分支名称
# 也可以使用 checkout -b 来新建分支
git checkout -b 分支名称
合并分支
# B 合并到 A,需要切换到 A 分支
git merge 被合并分支
# 查看已经合并的分支
git branch --merged
# 查看未合并的分支
git branch --no-merged
删除分支
# 如果分支为未合并状态,则不允许删除
git branch -d 分支名称
# 强制删除
git branch -D 分支名称
合并记录
# 合并 HOME 前两个祖先记录
git rebase -i HOME~2
~ 与 ^
~ : 纵向
^ : 横向
rebase 操作
# p, pick = use commit => 使用
# r, reword = use commit, but edit the commit message => 使用,但重新编辑说明
# e, edit = use commit, but stop for amending => 使用
# s, squash = use commit, but meld into previous commit => 使用,但合并上一次
# f, fixup = like "squash", but discard this commit's log message => 就像 squash 那样,但会抛弃这个 Commit 的 Commit message
# x, exec = run command (the rest of the line) using shell => 执行脚本
# d, drop = remove commit => 移除
# 弹出编辑器,根据需要的进行修改,然后保存
# 如果为 r,s 则会再次弹出编辑器,修改新的 commit message,修改之后保存
git rebase -i HOME~3
如果出现一些问题,可以通过
git rebase --edit-todo
和git rebase --continue
进行重新 编辑保存
合并冲突
有的时候,不同的分支可能会对同一个文件内容和位置上进行操作,这样在合并的过程中就会产生冲突
- 查看冲突文件
- 修复冲突内容
- 提交
题外话:
如果某天我们想要修改首页,也建议先创建一个分支,修改完后再合并到 master 分支上
查看提交日志
git log
# 完整格式
git log
# 简要格式(单行)
git log --oneline
修复提交
git commit --amend
修复(替换上一次)提交,在不增加一个新的提交版本的情况下将新修改的代码追加到前一次的提交中
git commit --amend -m 提交
删除
git rm
# 从 git 仓库与工作区中删除指定文件
git rm 文件
# 只删除 git 仓库中的文件
git rm --cached 文件
# rm 以后,需要 commit 这次操作,否则 rm 将保留在暂存区
git commit -m 修正
撤销重置
git reset
从暂存区中撤销到工作区
# 从暂存区中撤销一个指定文件
git reset HEAD 文件名称
# 从暂存区中国年撤销所有文件
git reset HEAD .
该命令既可以用于回退版本
# 回退到指定的 commitID 版本
git reset --hard commitID
比较
比较 工作区和暂存区
git diff 文件
比较 暂存区和仓库
git diff --cached [commitId] 文件
比较 工作区和仓库
git diff commitId filename
比较 比较 仓库不同版本
git diff commitId1 commitId2
标签
有的时候,我们希望给某一个特定的历史提交打上一些标签
新建 tag
git tag -a v1.0.0 HOME/commitId
查看 tag
git tag
协同开发
以上所有的操作都是建立在本地的,如果我们希望进行团队协同开发,那么这个时候,我们就需要把 git 仓库信息与团队中的所有人进行共享
- 分布式 - 中心化与去中心化
将项目放到远程仓库上
首先注册一个码云的账号
https://gitee.com/
注册成功后,登录
创建远程仓库
登录成功后创建远程仓库
然后按照操作创建远程仓库
创建完成
创建完成后,会展示此页面
当我们创建好这个仓库时,建议在电脑上克隆一份
通过服务器创建项目
仓库克隆到本地
或者在创建远程仓库时勾选初始化readme文件
使用git bash找到你说要创建项目的地方
cd 路径
进入文件夹,输入命令
git clone git@gitee.com:zhezijun/maigou.git
克隆项目的路径
当克隆的时候我们会被拒绝,因为我们没有权限
这个时候我们就需要密钥
密钥
创建密钥
ssh-keygen
创建的密钥会被创建在c盘用户目录下面
查看密钥
cat ~/.ssh/id_rsa.pub
拷贝密钥内容,将其添加到远程仓库中
码云-》maigou仓库-》管理-》部署公钥管理=》添加公钥
添加完成后,重新运行如下命令
git clone git@gitee.com:zhezijun/maigou.git
代码提交到远程仓库
使用 vs code 打开这个项目,进行项目开发
开发完毕后,使用 git push
命令,将本地代码推送到远程仓库
同步本地仓库到远程
git push -u origin master
# -u 简化后续操作
git push origin master
这是因为普通公钥只能以只读的方式访问仓库
如果希望像远程仓库中写入内容,需要添加个人公钥
添加完后,就可以推送了
远程分支
# 提交到远程(分支)
git push origin [本地分支名称]:[远程分支名称]
# 远程先创建好分支然后拉取到本地
git checkout -b [本地分支名称] origin/[远程分支名称]
# 拉取远程分支到本地
git pull origin [远程分支名称]:[本地分支名称]
# 查看远程仓库
git remote show origin
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
# 删除本地分支
git branch -d [本地分支名称]
# 删除远程分支
git push origin --delete [远程分支名称]
# or
git push origin :[远程分支名称]
# 设置默认提交分支
git branch --set-upstream-to=origin/[远程分支名称] [本地分支名称]