svn与git的区别:
1. svn是集中式管理,所有的内容都是在服务器端,如果服务器受到攻击,那么很难实现版本回退,
文件式管理的是针对与每个文件管理
2. git分布式管理,在每个本地环境里都会有一套自己的版本库,即便服务器没有了,还是能快捷回退,
项目式管理,是针对与整个项目管理
git是很多公司使用的版本控制工具,今天就来说一下git使用的大体流程:
git的工作流:
工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。
暂存区:已经 git add xxx 进去,且未 git commit xxx 的。
本地分支:已经git commit -m xxx 提交到本地分支的。
1 下载git
在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。
Git 各平台安装包下载地址为:http://git-scm.com/downloads
2 配置git
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
2.1 用户信息配置
配置个人的用户名称和电子邮件地址:
第一次提交的时候需要指定一下你当前提交的用户和邮箱
git config --global user.email "1234567891@qq.com" 改成你的邮箱
git config --global user.name "alexli" 改成你的github用户名
3 本地电脑和github服务器账号相关联
- 使用https 是需要输入用户名和密码的方式 每次都要输入 输错就把提交命令再执行一次 会重新让你输入
- 使用SSH 可以让本地电脑和github账号相关联 关联了之后就是永久
- 理解原理: 使用一个本地秘钥(电脑的身份证) 把你的本地秘钥和服务器github账号相互绑定 把身份证绑定到服务器账号上
你每次提交都会读取你当前的本地的秘钥
再和你本地仓库管理的github服务器仓库的账号里面的秘钥对应
如果是一样的就认为github是认可这台电脑的就允许提交 - 在本地电脑生成一个秘钥:
在gitbash黑窗里面执行 ssh-keygen -t rsa -C “1234567891@qq.com”
输入后一路回车 出现2048就表示成功
- 理解原理: 使用一个本地秘钥(电脑的身份证) 把你的本地秘钥和服务器github账号相互绑定 把身份证绑定到服务器账号上
- 秘钥生成后会在C盘 》 用户 》 你的用户(英文或者administor) 》 .ssh 》 id_rsa.pub
id_rsa.pub 本地公钥(公开的钥匙)
把这个id_rsa.pub 使用记事本打开 把乱码复制一下 - 打开github账号
点击设置
点击SSH设置
点击右上角new SSHKey
输入title(你的名字) key (复制公钥里面的乱码)
点击Add即可
出现一个黑色的钥匙就表示成功
4 git和github交互
- 去github上去创建一个服务器的仓库
- 打开github官网 登录
- 点击右上角头像左边的+号
- 点击New repository 新建一个本地仓库
- 输入Repository name仓库名 不能有中文空格等特殊符号 尽量用纯英文
- 输入一个仓库的描述
- 选择public
- 是否要初始化一个README阅读我 不要勾
- 点击创建
- 让本地仓库和远程仓库连接起来 (做一次即可)
git remote add origin git@github.com:zxs/jd23.git 让本地仓库和远程仓库连接
git@github.com:zxs/jd23.git 远程仓库地址 github给你提供的 - 把本地仓库的代码提交到远程的仓库里面
git push -u origin master 把本地代码提交到远程的master(主)分支里面
5 单人提交完整的流程:
1. git init 初始一个本地仓库
执行后会在当前项目的根目录创建一个.git文件夹 文件夹就是本地仓库
这个文件夹是隐藏文件夹需要显示隐藏文件夹
2. git add index.html 添加一个文件到本地暂存区
git add . 添加所有的文件到暂存区
3. git commit -m '提交日志' 把暂存区的文件提交到本地仓库 提交日志就是说明你改了了什么
4. 第一次提交的时候需要指定一下你当前提交的用户和邮箱
5. git config --global user.email "228197155@qq.com" 改成你的邮箱
6. git config --global user.name "zwxs" 改成你的github用户名
7. 指定完成后再次执行git commit -m '提交日志就可以提交了'
8. git log 查看代码提交的记录
查看当前历史提交的记录 版本号 作者 时间 提交说明
9. 如果新增了代码需要再次提交 重复 2步 和 第3步
10.如果在新建一个项目重新管理 执行 1 2 3 步骤 既可以
11. 去github服务器创建一个远程仓库 选择SSH方式提交(前文的第三和第四步)
12. 提交到服务器上的远程仓库地址:
git remote add origin git@github.com:zwxs/jd23.git 让本地仓库和远程仓库连接
git push -u origin master 把本地代码提交到远程的master(主)分支里面
6 多人协作的流程
1.先clone远程仓库里面的代码:
git clone -b master git@github.com:Alex-Li2018/testGit.git
git clone -b 分支名 路径
如果是clone主分支的代码直接: git clone
2.创建dev分支(它区别与主分支): git checkout -b dev
git branch dev 创建dev分支
git checkout dev 切换到dev分支
3.提交自己写的代码到dev分支之前,先pull代码,避免冲突
1. 指定本地dev分支与远程origin/dev分支的链接
git branch --set-upstream-to=origin/<branch> dev
git branch --set-upstream-to=origin/dev dev
2. 接着pull代码 git pull
4.提交代码:
git add . 添加所有的文件到暂存区
git commit -m "提交描述" 把暂存区的文件提交到本地仓库
git push origin <branch-name> 推送代码到远程服务器端
5.下次先切换到自己的分支 git checkout dev
6. git pull先去拉取最新的代码
7. 然后重复第四步就可以了
8. 你可能需要将自己分支上的代码合并到主分支上
1.在dev分支上 git add / git commit
2.git checkout master 切换到主干分支
3.git pull 将主干代码更新到最新,必须更新,否则会覆盖
4.git merge dev 合并dev到主干
5.git push origin master:master 本地主干分支推送到远端主干分支
总结一些上面的操作:
-
查看远程库信息,使用git remote -v;
-
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
-
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
-
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
-
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
7 其他的一些git指令
git fetch与git pull的区别:
git fetch 相当于是从远程获取最新到本地,不会自动merge
git pull:相当于是从远程获取最新版本并merge到本地
git log --graph --pretty=oneline --abbrev-commit 查看分支及主干流程图
git reset --hard HEAD^ 回退到上一个版本
在Git中,用HEAD表示当前版本,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
git help git帮助指令
这个指令的作用是很大的,建议新手多git help
8 git rebase(衍合过程)
9 git小乌龟
当然了这些繁琐的命令会让你不知所措,那么来试试git小乌龟吧
常用的vscode git插件: git Blame(非常好用)
10. 回滚
提交代码的时候会遇到版本回滚的问题,那么怎么版本回退呢?代码尚未提交怎么回滚呢?代码提交了则呢回滚呢?
10.1 在工作区的代码
git checkout -- a.txt # 丢弃某个文件,或者
git checkout -- . # 丢弃全部
注意:git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存commit,那就是回到你上次pull下来的样子了。
10.2 代码git add到缓存区,并未commit提交
git reset HEAD . # 回滚所有
git reset HEAD a.txt # 回滚某个文件
这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
10.3 git commit到本地分支、但没有git push到远程
git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id> # 回到其中你想要的某个版
或者
git reset --hard HEAD^ # 回到最新的一次提交
或者
git reset HEAD^ # 此时代码保留,回到 git add 之前
10.4 git push把修改提交到远程仓库
10.4.1 通过git reset是直接删除指定的commit
git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id>
git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除
10.4.2 通过git revert是用一次新的commit来回滚之前的commit
git log # 得到你需要回退一次提交的commit id
git revert <commit_id> # 撤销指定的版本,撤销也会作为一次提交进行保存
10.4.3 git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除
11 git cherry-pick
拣选会提取某次提交的补丁,之后尝试将其重新应用到当前分支上。 这种方式在你只想引入特性分支中的某个提交时很有用。
假设你的项目提交历史如下:
如果你希望将提交 e43a6 拉取到 master 分支,你可以运行:
# 当前处于 master 分支
$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index
fails."
3 files changed, 17 insertions(+), 3 deletions(-)
这样会拉取和 e43a6 相同的更改,但是因为应用的日期不同,你会得到一个新的提交 SHA-1 值
12 git忽略文件不生效的处理
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
13 git锁定本地文件不提交
对不想提交的版本库里面的文件直接这样做就可以!这样做了 就不会提交已经是版本库文件的文件了
git update-index --assume-unchanged .gitignore
git update-index --assume-unchanged php/application/modules/Default/views/index.html
git update-index --assume-unchanged -- path/to/file # 启用忽略
git update-index --no-assume-unchanged -- path/to/file # 停用忽略
14 git学习的资料
菜鸟教程: http://www.runoob.com/git/git-tutorial.html
廖雪峰官方博客: https://www.liaoxuefeng.com/