版本控制
学习目标
- 理解版本控制的必要性
- 了解常用的版本控制方式
- 熟悉
Git
的使用方法
什么是版本控制
可以把一个版本控制系统理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之为“版本”)时,版本控制系统可以显示出当前版本与上一个版本之间的所有改动的细节
使用版本控制的好处:
- 作为数据备份
- 版本管理
- 提高代码质量
- 提高协同开发的效率
- 明确分工责任
不只是代码才可以使用版本控制,凡是需要持续修改的文档资料都可以进行版本管理
常用的版本控制软件
现在市面上的控制系统有几十上百种,但是最为流行的版本控制系统为下面三者:
- Git
- Subversion: 简称 SVN
- Mercurial
尽管有着不同的版本控制系统,但其主要类别分为两种:
- 集中式模型:所有用户都连接到一个中央的仓库
- 分布式模型:每个用户都在自己的计算机上拥有完成的仓库。
在集中式模型中,有一台功能强大的中央服务器托管项目。每个每户都必须通过这台中央服务器。
在分布式模型中,没有中央信息库,每个开发者的计算机都有一份完整的项目拷贝。因为每台计算机都有完成的项目拷贝,这就意味着我们可以离线工作,不受网络的限制了。
目前来说,由于 Git
可以离线使用,更加强大,所以 Git
是目前最流行的版本控制方式,本次也会主要讲解 Git
的使用方式。说到 Git
,你可能听说过 GitHub
,Git
和 GitHub
是完全不同的东西。 Git
是版本控制工具,而 Github
是托管 Git
项目的服务。
- github
- coding
- 码云
- gitblit
- gogs
Git 简介
Git的诞生确实是一个有趣的故事,我们知道,当年 Linus 创建了开源的 Linux,从此,Linux 系统不断发展,现在已经成为最大的服务器系统软件了。(请不要傻傻分不清 Linus 和 Linux )
但是随着Linux的不断壮大,就需要各种版本控制了,起初 Linus 带着他的小弟们使用的是 BitKeeper (商业版本控制系统),之后呢由于某种原因 BitKeeper 的公司不让他们使用了,于是 Linus 自己花了两周时间写出了 Git 并且开源了(BitKeeper已哭晕在厕所).
这里先引用一张图解释 Git :
-
Workspace:工作区,即自己当前分支所修改的代码,
git add *
之前的!不包括git add *
和git commit -m 'xxx'
之后的。 -
Index(stage):暂存区,已经
git add *
进去,且未git commit -m 'xxx'
的。执行git add *
命令就把改动提交到了暂存区,执行git pull
命令将远程仓库的数据拉到当前分支并合并,执行git checkout [branch-name]
切换分支 -
Repository:仓库区(或本地仓库),执行
git commit -m '说明'
命令就把改动提交到了仓库区(当前分支/本地分支) -
Remote:远程仓库,就是类似 github,coding 等网站所提供的仓库,执行
git push origin master
提交到远程仓库,执行git clone 地址
将克隆远程仓库到本地
Git 术语
Repository
: 仓库, 包括了所有的版本信息、所有的分支和标记信息。在Git中仓库的每份拷贝都是完整的。仓库让你可以从中取得你的工作副本Branches
: 分支, 一个独立的、拥有自己历史信息的代码线, 你可以从已有的代码中生成一个新的分支,这个分支与剩余的分支完全独立, 默认的分支往往是叫master- origin master,origin就是指向某一个repository的指针,这个可以自己定义,不过一般是用origin罢了,master是默认的分支,服务器端的"master"(强调服务器端是因为本地端也有master)就是指向某个repository的一个branch的指针。
Tag
: 标记, 某个分支某个特定时间点的状态, 通过标记,可以很方便的切换到标记时的状态Commit
: 提交, 提交代码后,仓库会创建一个新的版本, 这个版本可以在后续被重新获得\HEAD
指针,表示当前版本,也就是最新的提交3628164...882e1e0
,Git 为我们自动创建的第一个分支是 master,以及指向 master 的一个指针叫 HEADRevision
: 修订, 用来表示代码的一个版本状态
忽略特定的文件
我们可以配置Git忽略特定的文件或者是文件夹,这些配置都放在.gitignore
文件中。这个文件可以存在于不同的文件夹中,可以包含不同的文件匹配模式, 比如.gitignore
内容可以如下:
# 忽略某文件
npm-debug.log
# 忽略文件夹
dist/
node_modules/
.idea/
Bash常用命令
$ cd 文件目录 # 改变/切换 目录
$ cd .. # 退回到上一个目录
$ pwd # 会显示我们当前所在的目录路径
$ ls、ll # 列出当前目录中的所有文件
$ cat 文件名 # 查看当前文件内容
$ touch 文件名 # 创建一个指定名称的新文件
$ mkdir 文件夹名字 # 新建一个目录,即创建一个指定名称的文件夹
$ vim text.txt # 编辑文件内容
$ rm 文件名 # 删除当前目录下指定名称的文件
$ rm -r 文件夹名字 # 删除一个指定名称的文件夹 r(recusive):递归的意思
$ mv 文件 目标文件夹名 # 移动文件
$ reset/clear # 清屏
$ git status # 查看状态
$ esc 后 输入:wq # 保存并退出
Git 基础配置
# 显示当前的Git配置
$ git config --list
# 编辑Git配置文件,只是配置用户信息的话直接看下面两行命令即可
$ git config -e [--global]
# 设置提交代码时的用户信息,是否加上全局--global自行决定,一般是直接设置全局的。另外用户邮箱需要注意最好使用gmail,QQ也可以,需要和你远程仓库保持一致不然你的contribution是不会被记录在远程仓库的
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
一台电脑同时链接github、conding、码云
Git 安装
Git-for-window, 这个不用多说,下载后下一步就好了
如果使用 mac 或者 linux, 建议使用命令行安装,请自行搜索相关教程。
创建 Git 仓库
有以下几种方式进行创建:
# 在当前目录创建一个文件夹
$ mkdir [project-name]
# 在当前目录新建一个Git代码库
$ git init
# 或者新建一个目录,将其初始化为Git代码库
$ git init [project-name]
# 或者下载一个项目和它的整个代码历史(各个分支提交记录等)
$ git clone [url]
git init
后会出现.git文件夹,里面有配置文件,如果没有 则可以在git bash里面输入ls -lah
就可以看到了
常用操作
首次推送
# 添加当前目录的所有文件到暂存区
$ git add *
# 或者
$ git add .
# 提交暂存区到仓库区
$ git commit -m [message]
# 为远程Git更名为origin
$ git remote add origin git@github.com:abcd/tmp.git
# 推送此次修改,这是首次推送需要加上-u,之后推送就可以直接git push origin master,origin是远程Git名字,这个可以自己定义,不过一般是用origin罢了,master是默认的分支,如果不在master分支提交需要写清楚分支名称
$ git push -u origin master
Git 常用命令<增加/删除/提交/推送/拉取>
# 添加文件
# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add *
# 添加每个变化前,都会要求确认,对于同一个文件的多处变化,可以实现分次提交
$ git add -p
# 删除文件
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
# 提交文件
# 提交暂存区到仓库区
$ git commit -m [message]
$ -m 可以实现输入多行的注释:
1) 通过打开引号,按Enter并再次关闭带引号的提交,可以实现多行结构的提交,包括标题和正文
2) 如果给出了多个-m选项,则它们的值被串联为单独的段落 `git commit -m '111' -m '2222'`
https://blog.csdn.net/True_Rain/article/details/107283306
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交,如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
# 推送到远程
# 推送更改到远程仓库
$ git push origin master
# 拉取文件
# 拉取远程更改到本地仓库默认自动合并
$ git pull origin master
或者
$ git fetch origin
或者更新分支
$ git pull origin <branch-name>
git commit -am
等同于 git add . && git commit -m
如果只是简单的小项目,上面的命令已经够用了,直接在master分支进行操作
commit 提交注释规范
规范的注释方便自己进行合并、撤消、回退。当代码有几十个分支,有成千上万条提交时,你随时可能面临着合并分支,回退代码,舍弃代码,对比代码,复制历史记录中有用的代码片段等等。如果仅靠千篇一律的注释,是很难从快速从注释中提取有用的信息,并且会遇到选择困难,不知道要合并哪个点,不知道要回退到哪里等。而传统的tag是用来记录大版本号,或发布时使用的。
commit规范
提交的格式:type: message
,注意中间使用 :
分割(后面带有一个空格),内容不超过 50 字。
type
用于指定提交的 commit 的类别,下面只允许以下几个动词原语。
'init/create', // 初始化项目时使用。
'feat', // 新功能 feature
'fix', // 修复 bug
'docs', // 文档注释
'style', // 代码格式(不影响代码运行的变动)
'refactor', // 重构(既不增加新功能,也不是修复bug)
'remove/delete', // - 移除文件、代码时使用。
'perf', // 性能优化
'test', // 增加测试
'chore', // 构建过程或辅助工具的变动
'revert', // 回退
'merge', // - 在解决代码冲突,合并分支时使用。
'build' // 打包
'release' // - 发布新的版本时使用。
type 的作用是为了区分,并且能根据 type 做有效的 commit logger 数据统计。
message
用于指定提交的描述文字,需要注意几个事项。
- 使用中文表述。
- 保证有明确的语义化说明。
- 保证表述内容简短。
- 以动词开头,比如:更新,增加,修复等。
正确的示例:
fix: 修复登录邮箱格式验证错误的问题。
feat: 优化 Button 组件样式。
test: 添加搜索模块的单元测完。
release: 发布 v0.1.12 版本。
remove: 移除多余的 console.log 代码。
错误的示例:
fix: 修复一个大 BUG。
feat: 更新代码。 // 表述不清楚。更新了什么代码,改变了什么功能?
添加搜索模块的单元测完。 // 没有写 type。
add: 更新 API 文档用户信息接口说明。 // type 使用错误。
规范终究是规范,无法约束所有人,只有利用Hooks来拦截提交,后期可以在项目中集成git提交的规范git hooks
Git Hooks : https://git-scm.com/docs/githooks
1. commit-msg : 可以用来规范化标准格式,并且可以按需指定是否要拒绝本次提交
2. pre-commit : 提交前被调用,可以拦截本次提交
https://www.yuque.com/u2368282/ting/nheukx
Git 分支 Branch
简单小项目的话,上面的命令已经够用,但如果是一个比较大的,多人协作的项目,我们一般并不会直接在 master 主分支进行操作,不然出现问题,可能无法挽回,所以一般会使用 Git 的分支功能,以人或者功能为单位,创建分支,各分支互不干扰的工作,完成后再合并到 master 上
可参见 : Git教程-创建合并分支
实际项目中如何使用Git做分支管理
Git分支管理策略及简单操作
分支功能常用命令:
# 查看所有本地分支
$ git branch
# 查看所有远程分支 -r 是--remote:远程
$ git branch -r
# 查看所有本地分支和远程分支
$ git branch -a
$ git branch -all
# 默认只有master分支,所以会看到如下两个分支
# master[本地主分支] origin/master[远程主分支]
# 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同步
# 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同步
# 查看本地与远程分支的关联
$ git branch -v / git branch -vv
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
$ git branch dev # 这个时候dev是一个本地分支,远程仓库不知道它的存在,本地分支可以不同步到远程仓库,我们可以在dev开发,然后merge到master,使用master同步代码,当然也可以同步
# 新建一个分支,并切换到该分支,在该分支开发代码
$ git checkout -b [branch-name]
$ git checkout -b feature-x develop # 从develop创建一个功能分支
# 新建一个分支,指向指定commit
$ git branch [branch-name] [commit_id]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 发布dev分支,发布dev指的是同步dev分支的代码到远程服务器
$ git push origin dev:dev # 这样可以提交一次代码到远程仓库,远程也有一个dev分支了,但是没有建立关联关系,下次不能直接push推送,继续用下一步
$ git branch --set-upstream-to=orgin/dev,# 建立关联
# 上面两步可以省掉,直接用下面的↓
# 发布dev分支并建立追踪关系,在现有分支与指定的远程分支之间
$ git push --set-upstream origin dev
###### 合并
# 如果功能开发完成了,可以合并主分支
git checkout master # 切换到主分支
git merge dev # 把dev分支的更改和master合并
git push # 提交主分支代码远程
# 注意:在分支切换之前最好先commit全部的改变,除非你真的知道自己在做什么
# 合并指定分支到当前分支,如果有冲突需要手动合并冲突(就是手动编辑文件保存咯),然后add,commit再push
$ git merge [branch]
$ git merge –no–ff dev #–no–ff参数是什么意思。默认情况下,Git执行”快进式合并”(fast-farward merge),会直接将 Master 分支指向 Dev 分支。使用–no–ff参数后,会执行正常合并,在 Master 分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除本地分支
$ git branch -d [branch-name]
# 删除远程分支 你最好想好了
$ git push origin :[branch-name]
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
Git 分支命名规范
分支: 命名: 说明:
主分支 master 主分支,所有提供给用户使用的正式版本,都在这个主分支上发布
开发分支 dev 开发分支,永远是功能最新最全的分支
功能分支 feature-* 新功能分支,某个功能点正在开发阶段
发布版本 release-* 预发布分支,发布定期要上线的功能
修复分支 bug-* 修复线上代码的 bug
git reflog 查看版本记录
git branch 查看分支
git branch -v 查看分支
git branch dev 创建分支:一般master分支是锁定的,只允许管理员进行提交和合并,其他人都在dev分支上开发/合并/提交,并且还可以在dev上再迁出其他分支
git checkout dev 切换分支
分支一般在本地,不提交到远程
每做一个功能可以迁出一个分支,然后到开发分支上进行合并原有分支,然后还要删除这个分支
进入主分支后 git merge dev 合并分支
git branch -d dev 删除分支
git remote -v 查看远程仓库
Git 标签 Tag
1、来做版本回退的,关于版本回退,这也是Git的亮点之一,起到了后悔药的功能·
2、上线后一般会打一个tag: NSA-0.0.1
git tag的用法
# 查看本地所有tag
$ git tag
# 查看远程所有 tag:
$ git ls-remote --tags origin
# 新建一个tag在当前commit
$ git tag [tag-name]
# 新建一个tag在指定commit
$ git tag [tag-name] [commit]
# 删除本地tag
$ git tag -d [tag-name]
# 删除远程tag
$ git push origin :refs/tags/[tagName]
$ git push origin :<tagName>
# 查看tag信息
$ git show [tag-name]
# 提交指定tag
$ git push [remote] [tag-name]
$ git push origin test
# 提交所有tag
$ git push [remote] --tags
$ git push origin --tags
# 新建一个分支,指向某个tag
$ git checkout -b [branch-name] [tag-name]
$ git tag -a <tagname> -m "XXX..." 可以指定标签信息。
Git 撤销、版本回退
https://blog.csdn.net/asoar/article/details/84111841
1、在工作区的代码
# 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
$ git checkout .
# 注意:git checkout . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。
2、代码git add到缓存区,并未commit提交
$ git reset HEAD .
或者
$ git reset HEAD a.txt
# 这2个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
3、git commit到本地分支、但没有git push到远程
# 得到你需要回退一次提交的commit id
$ git log
# 回到其中你想要的某个版, 重置当前分支的HEAD为指定commit_id,同时重置暂存区和工作区,与指定commit_id一致
$ git reset --hard <commit_id>
或者
# 回到最新的一次提交,回退到上一个版本,在Git中,用HEAD表示当前版本
$ git reset --hard HEAD^
或者
# 此时代码保留,回到 git add 之前
$ git reset HEAD^
4、git push把修改提交到远程仓库
1)通过git reset是直接删除指定的commit
$ git log # 得到你需要回退一次提交的commit id
$ git reset --hard <commit_id>
$ git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除
2)通过git revert是用一次新的commit来回滚之前的commit
$ git log # 得到你需要回退一次提交的commit id
$ git revert <commit_id> # 撤销指定的版本,撤销也会作为一次提交进行保存,后者的所有变化都将被前者抵消,并且应用到当前分支
* git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop
回滚
已进行git push
,即已推送到“远程仓库”中。我们将已被提交到“远程仓库”的代码还原操作叫做“回滚”!注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
如果你每次更新线上,都会打tag,那恭喜你,你可以很快的处理上述场景的情况 :
$ git checkout <tag>
如果你回到当前HEAD指向
$ git checkout <branch_name>
情况一:撤销指定文件到指定版本
# 查看指定文件的历史版本
$ git log <filename>
# 回滚到指定commit_id
$ git checkout <commit_id> <filename>
情况二:删除最后一次远程提交
方式一:使用revert
$ git revert HEAD
$ git push origin master
方式二:使用reset
$ git reset --hard HEAD^
$ git push origin master -f
二者区别:
- revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
- reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。
情况三:回滚某次提交
# 找到要回滚的commit_id
$ git log
$ git revert commit_id
冲突
https://www.cnblogs.com/gavincoder/p/9071959.html
如果双方改的是不同的文件,或者同一个文件的不同部分,那么 git 是可以自动合并的。如果修改的是同一个文件同一个部分,git 就没办法自动合并了,这种情况被称为「冲突」,git 会列出双方的最新版本,然后由进行合并的人(例子里是 C), 手动进行编辑。在实际开发中,如果两个人只是往这个文件里加函数,是完全可以自动合并的,冲突主要是出现了修改了同一行的情况。
或者只需要先在本地改了东西 add后然后commit后 再回滚一下 就会冲突.
1、git冲突的场景
- 情景一:多个分支代码合并到一个分支时;
- 情景二:多个分支向同一个远端分支推送代码时;
- 实际上,push操作就是将本地代码merge到远端库分支上。关于push和pull其实就分别是用本地分支合并到远程分支 和 将远程分支合并到本地分支,所以这两个过程中也可能存在冲突。
git的合并中产生冲突的具体情况:
<1>两个分支中修改了同一个文件(不管什么地方)
<2>两个分支中修改了同一个文件的名称
两个分支中分别修改了不同文件中的部分,不会产生冲突,可以直接将两部分合并。
2、冲突解决方法
- 在当前分支上(master),直接修改冲突代码—>add—>commit—>push。
- 注:借用vim或者IDE或者直接找到冲突文件,修改。
远程同步
#显示所有远程仓库
$ git remote
$ git remote -v #更详细
#显示某个远程仓库的信息
$ git remote show [remote]
> git remote show origin
#增加一个新的远程仓库,并命名
$ git remote add [shortname] [urI]
> git remote add origin git@github.com:abcd/tmp.git
# 改地址同时改用户名
> git remote set-url origin http://yourname:password@bitbucket.org/yourname/project.git
> https://www.cnblogs.com/void9main/p/9493220.html
#下载远程仓库的所有变动
$ git fetch [remote]
> git fetch origin
#取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]
> git pull origin master
# git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
# git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
#上传本地指定分支到远程仓库
$ git push [remote] [branch]
> git push origin master
#强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
#推送所有分支到远程仓库
$ git push [remote] --all .
查看信息
#显示有变更的文件
$ git status
# 显示当前分支的版本历史
$ git log
# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat
# 单行显示 并指定显示几条 n3就是3条
$ git log --oneline -n3
# 搜索提交历史,根据关键词
$ git log -S [keyword]
# 显示指定文件是什么人在什么时间修改过
$ git blame [file]
> git blame 'index.html'
> git blame *
# 记录某个文件的更改历史和更改,甩锅利器
$ git blame [filepath]
# 显示暂存区和工作区的差异
$ git diff
# 显示暂存区和上一个commit的差异
$ git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示当前分支的最近几次提交
$ git reflog
退出编辑
# 1、git log 退出
如果commit(提交)比较多,git log 的内容就会比较多;当满屏放不下,就会显示冒号,回车(往下滚一行)、空格(往下滚一页)可以继续查看剩余内容;
$ 退出:按 q 退出 git log 状态。
# 2、git commit 退出
当该命令没有带-m参数时,会跳出commit change log (COMMIT_EDITMSG)界面(如下所示),这个是vi编辑器(也有可能是vim编辑器),和linux的使用时一样的,因为涉及到是否要保存编辑内容,所以退出命令有多种。
2.1 保存并退出:
$ 按 Esc 键退出编辑模式,然后输入 :wq ,然后回车(write and quit)。
$ 按 Esc 键退出编辑模式,然后大写模式下输入 ZZ ,然后回车。
2.2 不保存退出:
$ 按 Esc 键退出编辑模式,输入 :q! ,然后回车。
$ 按 Esc 键退出编辑模式,输入 :qa! ,然后回车。
小结
彻底熟练使用 git 那需要记住的命令多了去了,起码几百个,不过在日常使用中,涉及的命令不算太多
SSH协议
https://gitee.com/help/articles/4181#article-header0
密钥对
SSH Key SSH公钥
Gitee提供了基于SSH协议的Git服务,在使用SSH协议访问仓库仓库之前,需要先配置好账户/仓库的SSH公钥。
$ ssh-keygen -t rsa -C 'cheerqjy@163.com'
# keygen就是key的生成器 rsa非对称算法
注意:这里的xxxxx@xxxxx.com只是生成的sshkey 的名称,并不约束或要求具体命名为某个邮箱。现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。
按照提示完成三次回车,即可生成ssh key。通过查看~/.ssh/id_rsa.pub文件内容,获取到你的public key
id_rsa是私钥 id_rsa.pub是公钥(码云要用的)
在码云仓库中 点击设置按钮 把公钥 id_rsa.pub粘贴到《SSH公钥》处,以后就可以使用ssh协议操作码云而不需要使用HTTPS协议,这样也就不需要输入用户名了
issue
相当于工单
rebase 变基 合并提交信息
可视化工具
使用命令行控制 Git 需要记忆很多命令,如果实在记不住,可以使用可视化客户端来控制 Git, 但最好还是将常用的 Git 命令记住。这儿推荐几个比较优秀的可视化工具:
GitHub for Desktop
全球开发人员交友俱乐部(GitHub
)提供的强大工具,功能完善,使用方便。对于使用 GitHub
的开发人员来说是非常便捷的工具
Source Tree
SourceTree
SourceTree 是老牌的 Git GUI 管理工具了,也号称是最好用的 Git GUI 工具。强大,功能丰富,基本操作和高级操作都设计得非常流畅,适合初学者上手,支持 Git Flow,可以用git-flow用来管理分支。先贴上项目地址nvie/gitflow · GitHub
git-flow主要有5中分支:master、hotfix、release、develop、feature。https://www.zhihu.com/question/21995370
TortoiseGit
小乌龟,SVN 的超广泛使用也使得这个超好用的 Svn 客户端成了几乎每个开发人员的桌面必备软件。小乌龟只提供 Windows 版本,提供中文版支持的
软件及汉化包下载地址:https://tortoisegit.org/download/
教程: https://www.cnblogs.com/anayigeren/p/10177027.html
配置密钥的方法: https://www.cnblogs.com/suger43894/p/10694657.html https://www.cnblogs.com/xiuxingzhe/p/9312929.html
idea中集成
vscode就集成了git版本管理工具
- http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html)
vscode插件GitLens
//link.zhihu.com/?target=https%3A//github.com/nvie/gitflow)
git-flow主要有5中分支:master、hotfix、release、develop、feature。https://www.zhihu.com/question/21995370
TortoiseGit
小乌龟,SVN 的超广泛使用也使得这个超好用的 Svn 客户端成了几乎每个开发人员的桌面必备软件。小乌龟只提供 Windows 版本,提供中文版支持的
软件及汉化包下载地址:https://tortoisegit.org/download/
教程: https://www.cnblogs.com/anayigeren/p/10177027.html
配置密钥的方法: https://www.cnblogs.com/suger43894/p/10694657.html https://www.cnblogs.com/xiuxingzhe/p/9312929.html
idea中集成
vscode就集成了git版本管理工具
- http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html)
vscode插件GitLens
https://www.yuque.com/brojie/grl5vg/qtasvtg5s47us1va