1.1、git介绍
这是官方给出的git介绍:
- 代码托管与合并
- 版本控制
- 分布式(每一个终端都有一套完整代码)
闭坑:git是分布式版本控制工具,可以进行版本穿梭,但是有一个前提,就是你的修改再版本历史记录中是存在的,即 “该版本被提交到本地仓库或远程仓库” ,只有满足该条件,才会被记录位版本。
每次pull拉取远程仓库的代码时,要先把本地修改提交(commit)到本地仓库
(不commit直接pull,远程库代码会覆盖本地代码的修改,提交到本地库再pull,会把本地修改和远程库代码合并)
每次push推送代码前,也要先把修改提交到本地库,然后pull拉取远程仓库的代码(合并远程库和本地修改),然后再push
(不pull直接push,会覆盖远程库代码,别人的修改提交就会被覆盖)
解析:
git是代码的一套托管工具,它分为两个仓库,首先将你写的代码提交到本地仓库,这个时候只有你可以看,和你一起开发的同事看不到。将本地仓库的代码推到远程仓库(githab、gitee、gitlab等之一),然后你的同事就可以通过一个git的命令拉下你推到远程仓库的代码了。同样,只有你同事将他写的代码推送到远程仓库后,你执行git命令才能把他写的代码拉下来,合并到你的代码里。
这就是代码托管仓库的一部分优势,或许你感觉不到什么,老王举个例子,你们三个前端做一个项目,写一部分就得汇总合并一次代码吧?没有这个托管工具你怎么合并?咋用个小u盘咋copy一下,那得copy多少次,合并起来多困难,这就是代码托管工具的优势,通过几行简单的命令就实现了代码的托管和合并。
git还有一个优势,就是可以回到你提交代码的任意一个历史版本。例如,你写了这三个功能,上传,删除,添加。每写完一个功能就提交一次仓库,本地或者远程仓库都可以/后来又写了半天,发现写不对了,你想回到上传时候的代码,这个时候通过git命令也是可以回去的。
老王叨叨这么好多字,现在大家对git是不是有了一个初步的了解?
为了加深大家的记忆,便于理解,通过画图解析一下:
1.2、git本地安装及配置
1、下载地址: https://git-scm.com/
2、安装,下一步,安装完成
3、安装完成后,打开终端,执行git --version检查是否成功安装
安装成功后,在桌面或文件夹内右击会出现Git Bash Here 选项,点击会打开git命令窗口
4、基本配置
在git设置用户名和邮箱(git命令窗口里不可以使用快捷键复制粘贴,必须使用鼠标右击复制粘贴)
配置用户名:
git config --global user.name "用户名英文"
配置用户邮箱:
git config --global user.email "你的邮箱"
基本配置完成。
5、初始化项目
项目的git命令窗口执行 git init 命令,初始化项目,在项目文件夹中出现 .git 文件,项目初始化完成。
1.3、git远程仓库
推荐gitee,国内代码托管仓库
1、网址:http://gitee.com/
2、直接注册
3、注册后配置ssh密钥(仓库权限)
为什么配置密钥?
就是为了解决,git提交代码的时候,不用每次都输入用户名和密码。配置后,可以直接提交。
生成密钥的指令:
ssh-keygen -t rsa -C "这里输入你的邮箱@xxxxx.com"
获取密钥:
密钥路径:
密钥文件:
在远程仓库配置公钥:
配置完成后,在git窗口输入:
ssh -T [email protected]
如果返回下面内容,就证明配置成功。
Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access.
二、git的命令及使用
2.1、基础命令
将代码推送到暂存区
//注意: add 后面有一个空格
git add .
将暂存区代码推送到本地仓库
//commit 后面有一个空格
git commit -m '本次提交的注释说明'
拉取远程仓库的代码
//在拉取远程代码的时候,必须执行上面两步,将你刚写的代码存到本地仓库,如果不执行前面两步,那你刚写的的代码就会被拉下来的代码覆盖
//只有你存到本地仓库了,才不会被覆盖,存到本地仓库再拉取,就会把你的修改和远程库的最新版本合并
git pull
将拉取的最新版本和你的本地仓库的最新修改合并,然后推送到远程库
git push
查看提交详细信息
git log
如图:
查看提交过的历史版本号:
git log --online
如图:
版本穿梭,根据版本号,回到历史版本
//回到指定历史版本
git checkout 版本号
//或者 , master 就是回到最近的一次提交的历史版本
git checkout master
回到指定版本
回到最近版本
三、git的分支
使用git分支可以同时展开多条任务线,例如add分支写添加功能代码,delete分支写删除功能,edit写修改功能,同时写多个功能,且互不影响。例如在工作中,你正在写一个add功能,而领导要你紧急添加一个删除功能,这时你就可以先创建一个删除功能的分支,且不会影响你原来在写的功能代码。
git默认master分支,也叫主分支
3.1、常用命令
创建分支命令
git branch 分支名
查看所有分支命令
git branch
//前面带星号的是当前分支
切换分支
git checkout 分支名
** 合并分支**
//把指定分支 合并到 当前分支
git marge 分支名
// 先把在dev分支写的代码提交到本地仓库
git add .
git commit -m '我是dev分支写的代码'
// 切换回要合并的master主分支
git checkout master
// 拉取远程的代码到master主分支(将同事的代码和你之前提交到远程的代码拉回来)
git pull
// 将dev分支写的代码合并到master上
git merge dev
// 合并完之后,将合并的代码和pull拉下来的代码,一起推到远程仓库
git push
3.2、执行效果图
- 创建分支
- 将分支上的代码提交到本地库
- 切换回主分支,拉取远程库代码
- 将分支代码合并到主分支
先创建分支,将分支上的代码提交到本地库
回到主分支,并拉取远程库代码 (这里因为没有远程库,就没有pull)
然后,将分支合并到当前主分支
3.3、合并时有冲突该怎么办?
- 修改代码,解决冲突
- 重新提交到本地库
- push到远程仓库
冲突就是你pull下代码后,将分支合并到主分支时,发现你同事和你修改了同一个地方,就会出现冲突。
我们模拟一下,Dev分支中,你写了13行
你的同事在master分支上,在该文件的第13行也进行了编辑修改
合并Dev分支和master分支时,就会出现冲突
报错翻译
3.4、解决冲突
决定留下谁的代码,或者都留下,或都不保留
做出选择后,需要重新add、commit,将合并的代码推到本地仓库,然后在push,将代码推送到远程。
如果你还要在dev写,那就得把master最新得代码(包括同事的)合并到dev,然后接着在dev开发。
3.5、git分支图解
GIt 的分支之间 是相互不影响的,即使是提交到本地仓库,也是互不影响的,每个分支上的本地仓库都是独立互不影响的,或者说每个本地仓库都是一个单独的分支。
工作中,我们都是多分支工作,一个运行分支,一个开发分支,一个自己的研发分支,
自己在个人研发分支完成功能开发后,合并到开发分支,检测有没有Bug冲突,没有问题再合并到运行分支(主分支)
四、连接远程仓库
4.1、在gitee新建远程仓库
点击加号,点击新建仓库
填写项目信息
创建成功提示
添加远程仓库,并将本地master和远程master关联
4.2、关联远程仓库
本地无仓库
- 创建初始化本地仓库
- 将所有文件推送到本地库
- 关联远程库
- 将本地库分支和远程库分支关联
本地有仓库
- 关联远程库
- 将本地库分支和远程库分支关联
4.3、克隆代码
赋值仓库ssh
新建文件夹,打开该文件夹下终端输入一下命令
git clone ssh地址
五、忽略文件
有时候,我们不想把某些文件纳入版本控制之中,比如依赖包,临时文件等
这个时候可以利用 .gitgnore 文件,设置忽略规则
- .gitgnore 文件的注释文本以 # 开头
- 可以使用Linux通配符,例如 : *.txt ,代表 忽略所有以.txt结尾的文件
- !感叹号代表例外规则,将不被忽略
- 目录后面加 / 分隔符,代表忽略该目录下的子目录(只忽略该目录下的子目录,而不忽略该目录下的文件)
- 目录前面加 / 分隔符,代表只忽略该路径下的指定文件
#井号开头,该行为注释内容
*.txt #忽略所有 .txt 结尾的文件,这样的话此类文件不会被git上传
!zxf.txt #zxf.txt文件例外,它不会被忽略
/temp #只忽略该路径下的txt文件
view/ #view路径下的所有文件会被忽略
view/*.txt #忽略view路径下的所有txt文件,但不包括它子目录下的txt文件
常用规则配置:
bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 忽略根目录下的bin文件
/*.c: 忽略 cat.c,不忽略 build/cat.c
debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
**/foo: 忽略/foo, a/foo, a/b/foo等
a/**/b: 忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件
*.log: 忽略所有 .log 文件
config.php: 忽略当前路径的 config.php 文件
六、常用指令汇总
window 安装 Git
# 第一步、Git官网下载Git傻瓜式安装,可以打开git bash即为成功。
# 第二步、设置参数
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
# 获取config信息
$ git config --list
# 去掉git add 命令后 出现的一堆CR LF提示信息,其中CR是回车的意思 LF是换行
$ git config --global core.safecrlf false
# 存储凭证 (可用于输入一次用户密码后,不再输入 有时我们已经用SSH key 绑定关联好了 但是每次git提交的时候 还是需要你输入用户名密码 在这个时候 敲入这个命令 将凭证存储起来 用户名密码就不需要再次输入了)
$ git config --global credential.helper wincred
# 将commit命令设置别名ci git commit命令将由git ci来代替
$ git config --global alias.ci commit
创建仓库
# 进入目录,将它变成Git可以管理的仓库
$ git init
文件提交至仓库
# 文件添加至暂存区
$ git add <file>
# 暂存区内容提交至时间线
$ git commit -m <message>
# 直接使用该指令,相当于执行了以上两条指令
$ git commit -am "备注信息"
查看当前仓库状态
# 时刻掌握仓库当前的状态
$ git status
# 具体指定文件修改(工作区 对比 暂存区)
$ git diff <file>
# 工作区 对比 暂存区 之间的差异
$ git diff
# 查看暂存区和仓库差异
$ git diff --cached
# 查看工作区文件状态
$ ls
# 查看暂存区的状态
$ git ls-files
版本回退
# 查看日志
$ git log
# 日志简洁输出
$ git log --pretty=oneline
# 日志时间线视图形式输出
$ git log --graph
# Git中,用HEAD表示当前版本,上一个版本是HEAD^,上上一个版本是HEAD^^
# 往上100个版本是HEAD~100
$ git reset --hard HEAD^
# 若又想找回怎么办
# 先查找commit id
$ git reflog
# 使用id切换版本
$ git reset --hard commit_id
撤销修改
# 丢弃工作区的修改
$ git checkout -- file
# 已经进入暂存区的修改撤销,重新放入工作区
$ git reset HEAD <file>
# 已经提交至版本库,版本回退
$ git reset --hard commit_id
删除文件
# 一般情况下,在文件管理器或使用rm删除文件。这个时候需要将操作提交至暂存区
$ git rm <file>
# 接着commit
# 还有一种情况是误删,但是版本库中还是保存了旧版本可以恢复
$ git checkout -- file
# git checkout实际上是使用时间线上一个版本中的内容将现工作区替换(用上个版本中的该文件替换该版本中的该文件)
创建远程仓库
# 第一步创建SSH Key。
$ ssh-keygen -t rsa -C "[email protected]"
#然后可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个文件就是SSH Key的密钥对,一个是私钥,一个是公钥。
# 第二步,登录网站,添加上自己的公钥密钥
添加远程仓库(本地已有仓库)
# 首先在Github建立空的远程仓库,接着将本地仓库与之关联
# origin的名称可以更改,是本地仓库终端操作时,保存的远程仓库的本地命名
$ git remote add origin [email protected]:michaelliao/example.git
# 本地仓库所有内容推送
# 实际上是将当前分支master推送,第一次需加-u参数,将本地的master与远程的新的master相关联
# 以后不需要再添加-u参数,直接git push 推送即可
$ git push -u origin master
# 本地修改提交
$ git push origin master
# 查看远程库信息
$ git remote -v
# 根据远程库名字删除远程库
$ git remote rm name
# 更新仓库(比如检测不到新建分支时)
$ git remote update origin
从远程库克隆(本地无仓库)
# 现有远程库,我们本地从零开发
# 没有本地库,直接从远程库克隆本地库
$ git clone [email protected]:michaelliao/gitskills.git
# 克隆指定分支
$ git clone -b 分支名 [email protected]:michaelliao/gitskills.git
创建与合并分支
# 创建并切换到一个叫dev的新分支
# 加上-b,表示创建并切换。相当于以下两部
$ git checkout -b dev
# 创建dev分支
$ git branch dev
# 切换到dev分支
$ git checkout dev
# 查看分支情况
$ git branch
# 若dev上做了很多工作,现在dev合并到master
$ git checkout master
$ git merge dev
# 合并后dev的工作就全部保存至master,可以放心删除
$ git branch -d dev
# swich,新的分支操作命令。
# 创建并切换
$ git switch -c dev
# 切换至master
$ git switch master
# 普通模式下合并分支,不加参数,Git会自动使用Fast forward模式合并,删除分支后,不会保留此处合并分支的信息。普通模式则会生成一个commit
$ git merge --no-ff -m "merge with no-ff" <branch>
# 删除分支
$ git branch -d 分支名
# 查看远程所有分支
$ git branch -r
# 合并某个或某些提交到指定分支
# 拉取最新代码
$ git pull
# 查看提交信息,复制要合并的commit id
$ git log
# 切换要合并到的分支
$ git checkout branch
# 将A提交合并到当前分支
$ git cherry-pick A
# 将A和B提交合并到当前分支
$ git cherry-pick A B
# 将A至B的所有提交合并到当前分支,不包含A
$ git cherry-pick A..B
# 将A至B的所有提交合并到当前分支,包含A
$ git cherry-pick A^..B
Bug分支
# 遇到bug,先保存当前工作现场 (因为当前工作未完成,不能提交,但是不提交又不能切换分支)
$ git stash
# 现在工作区将是最开始那样,干净的。
# 可以去改bug了。
# 确定在哪个分支上面修复Bug,假设在master上面修复
$ git checkout master
$ git checkout -b issue-101
......
# 修复完成,合并分支
$ git merge --no-ff -m "merged bug fix 101" issue-101
$ git branch -d issue-101
# bug修改结束了
# 回到之前的分支
$ git switch dev
# 查询之前储存的现场
$ git stash list
# 第一种恢复,stash需删除命令
$ git stash apply
$ git stash drop
# 第二种,恢复并删除
$ git stash pop
# 可以多次stash,然后恢复指定的
$ git stash apply stash@{0}
# 现在的bug是在master上面修复的,别的分支
$ git cherry-pick <commit>
#复制一个特定的提交至当前分支
版权归原作者 轻风~~ 所有, 如有侵权,请联系我们删除。