赞
踩
目录
这是官方给出的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、下载地址: 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 文件,项目初始化完成。
推荐gitee,国内代码托管仓库
1、网址:http://gitee.com/
2、直接注册
3、注册后配置ssh密钥(仓库权限)
为什么配置密钥?
就是为了解决,git提交代码的时候,不用每次都输入用户名和密码。配置后,可以直接提交。
生成密钥的指令:
ssh-keygen -t rsa -C "这里输入你的邮箱@xxxxx.com"
获取密钥:
密钥路径:
密钥文件:
在远程仓库配置公钥:
配置完成后,在git窗口输入:
ssh -T git@gitee.com
如果返回下面内容,就证明配置成功。
Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access.
将代码推送到暂存区
- //注意: add 后面有一个空格
-
- git add .
将暂存区代码推送到本地仓库
- //commit 后面有一个空格
-
- git commit -m '本次提交的注释说明'
拉取远程仓库的代码
- //在拉取远程代码的时候,必须执行上面两步,将你刚写的代码存到本地仓库,如果不执行前面两步,那你刚写的的代码就会被拉下来的代码覆盖
- //只有你存到本地仓库了,才不会被覆盖,存到本地仓库再拉取,就会把你的修改和远程库的最新版本合并
-
- git pull
将拉取的最新版本和你的本地仓库的最新修改合并,然后推送到远程库
git push
查看提交详细信息
git log
如图:
查看提交过的历史版本号:
git log --online
如图:
版本穿梭,根据版本号,回到历史版本
- //回到指定历史版本
-
- git checkout 版本号
-
- //或者 , master 就是回到最近的一次提交的历史版本
-
- git checkout master
回到指定版本
回到最近版本
使用git分支可以同时展开多条任务线,例如add分支写添加功能代码,delete分支写删除功能,edit写修改功能,同时写多个功能,且互不影响。例如在工作中,你正在写一个add功能,而领导要你紧急添加一个删除功能,这时你就可以先创建一个删除功能的分支,且不会影响你原来在写的功能代码。
git默认master分支,也叫主分支
创建分支命令
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
先创建分支,将分支上的代码提交到本地库
回到主分支,并拉取远程库代码 (这里因为没有远程库,就没有pull)
然后,将分支合并到当前主分支
冲突就是你pull下代码后,将分支合并到主分支时,发现你同事和你修改了同一个地方,就会出现冲突。
我们模拟一下,Dev分支中,你写了13行
你的同事在master分支上,在该文件的第13行也进行了编辑修改
合并Dev分支和master分支时,就会出现冲突
报错翻译
决定留下谁的代码,或者都留下,或都不保留
做出选择后,需要重新add、commit,将合并的代码推到本地仓库,然后在push,将代码推送到远程。
如果你还要在dev写,那就得把master最新得代码(包括同事的)合并到dev,然后接着在dev开发。
GIt 的分支之间 是相互不影响的,即使是提交到本地仓库,也是互不影响的,每个分支上的本地仓库都是独立互不影响的,或者说每个本地仓库都是一个单独的分支。
工作中,我们都是多分支工作,一个运行分支,一个开发分支,一个自己的研发分支,
自己在个人研发分支完成功能开发后,合并到开发分支,检测有没有Bug冲突,没有问题再合并到运行分支(主分支)
点击加号,点击新建仓库
填写项目信息
创建成功提示
添加远程仓库,并将本地master和远程master关联
本地无仓库
本地有仓库
赋值仓库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@example.com"
-
- # 获取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 "youremail@example.com"
- #然后可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个文件就是SSH Key的密钥对,一个是私钥,一个是公钥。
- # 第二步,登录网站,添加上自己的公钥密钥
添加远程仓库(本地已有仓库)
- # 首先在Github建立空的远程仓库,接着将本地仓库与之关联
- # origin的名称可以更改,是本地仓库终端操作时,保存的远程仓库的本地命名
- $ git remote add origin git@github.com: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 git@github.com:michaelliao/gitskills.git
-
- # 克隆指定分支
- $ git clone -b 分支名 git@github.com: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>
- #复制一个特定的提交至当前分支
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。