git使用
git介绍与安装
介绍
git:版本控制器,控制的对象是开发的项目代码。
作用:在多人开发时
- 帮助开发者合并开发的代码
- 如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突
- 做版本管理,找回很久以前写的代码
git名词解释
git:是版本管理软件,可以装在不同操作系统平台,主要用来做版本管理。
github:全球最大的开源软件仓库,国内公司一般不放在github。
gitee:码云,中国版的github,少量公司用码云。
gitlab:公司内部使用的代码托管平台。
安装
下载对应版本://git-scm.com/download ,一路下一步
git与svn的区别
同样可以做版本管理和合并代码的软件还有SVN。
svn :集中式管理,cs架构,客户端需要配合服务端才能正常使用功能
git:分布式管理,单台机器就能进行版本管理
git工作流程
git工作时会划分出三个区:
- 工作区:文件存放的位置,可以新增,修改,删除文件
- 暂存区:用于临时存放你的改动
- 版本库:安全存放数据的位置,这里面有你提交的所有版本的数据
工作流程:在工作区修改代码后,先提交到暂存区,暂存区再提交到版本库,代码才被版本管理,被管理的版本可以随时回退。
各个区域可以相互操作,但工作区不能直接提交到版本库。
git不管理空文件夹,文件夹下有文件,才会被管理
git常用命令
初始化仓库
# 当前文件夹当做仓库
git init
# 在当前文件夹下创建一个仓库
git init 仓库名
在仓库目录终端下 – 设置全局用户,保存在 C:\Users\用户文件夹\.gitconfig文件中,所有仓库下都可以使用
git config --global user.name '用户名'
git config --global user.email '用户邮箱'
在仓库目录终端下 – 设置局部用户,保存在当前仓库\.git\config文件中(有局部用户优先使用局部用户)
git config user.name '用户名'
git config user.email '用户邮箱'
查看仓库状态,当仓库中有文件增加、删除、修改,都可以在仓库状态中查看。
# 查看仓库状态
git status
# 仓库状态的简约显示
git status -s
工作区提交到暂存区,仓库状态红变绿
# 提交所有变更的文件
git add .
# 提交指定变更文件
git add 文件名
暂存区所有内容提交到版本库,需要设置用户,仓库状态绿变无
git commit -m '注释内容'
查看版本管理信息,每次更改文件后提交到版本库就是一个版本
# 显示谁在什么时间提交的,版本号是多少
git log
# 简略显示版本信息
git reflog
# 查看时间点之前|之后的日志:
git log --after 2018-6-1
git log --before 2018-6-1
git reflog --after 2018-6-1
git reflog --before 2018-6-1
# 查看指定开发者日志
git log --author author_name
git reflog --author author_name
工作区文件回退到某个版本
# 回滚到上一个版本:
git reset --hard HEAD^
git reset --hard HEAD~
# 回滚到上三个版本:
git reset --hard HEAD^^^
git reset --hard HEAD~3
# 回滚到指定版本号的版本:
git reset --hard 版本号
暂存区拉回到工作区,仓库状态绿变红
git reset HEAD
把当前工作区的更改(不包含新增,包含修改和删除),回退回去
git checkout .
git过滤文件
在仓库目录下,新建一个 .gitignore 文件,文件中写目录或者文件或者模糊匹配,它可以完成对这些文件的忽略。
.gitignore内容:
- 文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
- /文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤
eg:
a.txt:项目中所有a.txt文件和文件夹都会被过滤
/a.txt:项目中只有根目录下a.txt文件和文件夹会被过滤
/b/a.txt:项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
*x*:名字中有一个x的都会被过滤(*代表0~n个任意字符)
空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)
git多分支开发
git分支的概念,可以认为分支就是当前工作目录中代码的一份副本。 使用分支,可以让我们从开发主线上分离出来,以免影响开发主线,分支开发完毕后可以合并到主线,即不影响主线,又修改了代码。
不同分支的操作,是相互独立的。
创建分支
git branch 分支名
切换分支
git checkout 分支名
查看分支
git branch
删除分支
git branch -d 分支名
合并分支,假设当前在master分支执行了git merge dev,即把dev分支合并到了master分支。
git merge 分支名
git远程仓库
上面都是在本地做代码管理,如果需要协同开发,把多人的代码合并到一起,需要有一个远程仓库,都把代码提交到远程仓库,远程仓库帮我们做合并。
github、gitee、gitlab 都是远程仓库。
1)你作为项目仓库初始化人员:
线上要创建空仓库 => 本地初始化好仓库 => 建立remote链接(remote add) => 提交本地仓库到远程(push)
2)你作为项目后期开发人员:
远程项目仓库已经创建成功 => 复制远程仓库到本地(clone) => 进入仓库就可以进行接下来的开发
remote源操作
# 查看仓库已配置的远程源
git remote
git remote -v
# 删除远程源
git remote remove 源名
# 添加远程源
git remote add 源名 源地址
# 提交代码到远程源
git push 源名 分支名
# 从远程源拉取代码
git pull 源名 分支名
# 克隆远程源
git clone 远程源地址
远程仓库初始化
1.创建空仓库
2.本地初始化好仓库
git init
3.建立remote链接(remote add)
git remote add origin //gitee.com/xxxx
4.提交本地仓库到远程(push),提交时需要输入gitee的用户名密码。
git push origin master
拉取远程仓库
没有建立remote链接
仓库克隆,在当前文件夹内生成。
git clone //gitee.com/xxxx
建立了remote链接
git pull 源名 分支名
ssh协议连接远程源
gitee官方创建公钥私钥:生成/添加SSH公钥 – Gitee.com
生成公钥:邮箱可以任意填写
ssh-keygen -t rsa -C "*@*.com"
查看公钥:
C:\Users\Administrator\.ssh\id_rsa.pub
码云线上添加公钥:设置 => SSH公钥 => 添加公钥
添加完成后,使用ssh连接远程仓库,以后就不需要使用用户名密码,就可以直接操作gitee了,走的是ssh链接,而不是https链接。
git remote origin [email protected]:xxxxx
远程仓库回滚
用dev分支举例
1)本地切换到远程要回滚的分支对应的本地分支
git checkout dev
2)回滚本地分支
git reset --hard 版本号
3)本地版本强行提交给服务器
git push origin dev -f
冲突问题
冲突出现的情况:
- 多人在同一分支开发出现冲突
- 分支合并出现冲突
分支合并出现冲突
master分支对a.txt第一行添加了’asdasd’,dev分支对a.txt第一行添加了’bbb’,在把合并dev分支到master分支时就会提示冲突,并且a.txt内容会显示为:
<<<<<<< HEAD
asdasd
=======
bbb
>>>>>>> dev
多人在同一分支开发出现冲突同理。
解决
先把冲突的地方多余的删除:
asdasd
bbb
分析冲突的地方该留哪一个,把不需要的删除即可。
asdasd
git 变基和git fetch
git 变基
在 Git 中整合来自不同分支的修改主要有两种方法:merge
以及 rebase
。
git merge合并时,提交记录一并合并过去了,查看记录时就会令人头大;
而通过变基合并分支(git rebase),可以让提交记录更简洁。
git merge合并
git rebase
git fetch
git fetch与git pull类似,首先在作用上他们的功能是大致相同的,都是起到了更新代码的作用。
- git pull:从远程获取最新版本并merge到本地,会自动合并或修改当前的工作。
- git fetch:会将数据拉取到本地仓库,不会自动合并或修改当前的工作
git pull = git fetch + git merge
JetBrains(pycharm)操作git
JetBrains系列软件其实可以作为git的图形化客户端,这里拿pycharm举例。
pycharm配置git
克隆代码
工作区提交到暂存区(git add)
暂存区提交到版本库(git commit)
查看所有分支,切换分支(右下角)
git pull 和git push
跟历史版本比较
查看所有历史更改