起步:
1. 安装:安装过程很简单,根据电脑系统安装即可,官网链接。
2. 首次配置:
# 配置用户名及邮箱
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
# 查看配置
$ git config --list
关于Git的一个"游戏",边玩边学。
创建/克隆 git 仓库:
定位到项目目录下,运行如下命令。运行后会在本文件夹下创建一个隐藏的 ".git" 文件夹。
# 初始化本地版本库
$ git init
# 设置线上版本库链接的别名为 "origin" (不同步到线上可忽略此操作)
$ git remote add origin https://...
# 查看线上版本库链接的别名
$ git remote -v
# 移除对线上版本库的别名
$ git remote rm [origin name]
克隆线上项目,则通过 "git clone" 命令,也可以重命名拉取的项目。
$ git clone https://....
# 自定义项目名称
$ git clone https://.... [project name]
概念:
1. "三个区域":
- 工作区(working directory):就是电脑内能见的文件夹目录
- 暂存区(staging area):"git add ." 存放的位置
- 版本库(repository): "git commit -m 'msg' " 把内容提交到当前分支节点上
流程分两步,被修改文件通过 "git add . " 把所有被修改的文件都添加到 暂存区 ,然后通过 "git commit -m 'msg' " 把缓存区的文件提交到 版本库 对应的分支中。涉及的命令如下:
# 查看文件状态
$ git status
# 把所有被修改文件添加 ("."改为文件名可单独添加,多个文件用空格隔开)
$ git add .
# 把暂存区文件提交到版本库 (-m "xxx"表示上传时的预留信息)
$ git commit -m "xxx"
# 把本地版本库及文件推到线上 (忽略 "origin master" 操作当前分支) "origin" 为远程仓库地址的别名,默认就是"origin"
$ git push origin master
# 以暂存区文件覆盖工作区相应文件;带有"HEAD"的命令表示以版本库文件覆盖暂存区及工作区相应文件
$ git checkout --[file name]
$ git checkout HEAD --[file name]
# 移除暂存区的指定文件
$ git rm [file name]
2. 分支:
初始化 git 仓库后,首次提交默认创建一个 "master" 主分支;但首次提交前创建分支,则无 "master" 分支。每个节点均可以创建子分支。
分支的常见用法:
- 多人合作,每个人操作自己的分支,最后操作主分支合并代码。
- 修复bug,正在开发 "v2.0" 版本,但发现 "v1.0" 版本存在bug,则回到 "v1.0" 节点上,创建子分支修复bug,其他分支继续开发,最后一起合并。
涉及的命令如下:
# 获取所有分支名
$ git branch
# 切换到 "xxx" 分支
$ git branch "xxx"
# 创建&切换到 "xxx" 分支
$ git checkout -b xxx
# 把 "xxx" 分支内容合并到本分支
$ git merge "xxx"
合并分支的冲突处理:
假设张三和李四同时在"dev"分支上开发,且修改了相同的代码,则出现上图情况(张三已经push,李四pull后所看到)。"3-9行" 是代码冲突检测的部分,"=====" 上方为本人(李四)修改的代码;下方则是冲突的部分。此时,本地文件已经被修改成上图所示,我们需要做的是:
- 删除多余符号
- 删除多余代码
- 提交修改
改变 HEAD 指针(版本回退/切换分支)前的注意事项:
"git reset <commit id>" 把 HEAD 指针指向之前的提交的版本,但工作区的文件并不会改变,所以改变 HEAD 指针前,需要把当前工作区暂存( git stash)。
#### 场景:已在dev分支上开发,但master分支上需要修复bug ####
# 创建临时"储存"区
$ git stash
# 切换到 master 分支
$ git checkout master
# 创建并切换到"debug-101"分支
$ git checkout -b debug-101
### ...对"debug-101"分支修改bug ###
# 切换回master分支
$ git checkout master
# 合并"debug-101"分支的内容
$ git merge --on-ff -m "merge bug debug-101" debug-101
# 切换回"dev"继续开发
$ git checkout dev
# 可查看"stash"的内容,"git stash pop"后查看的为空
$ git stash list
# 取出"stash"
$ git stash pop
普通合并 与 快速合并:
### 非快速合并,合并后的会有新的"commit"提交;而 快速合并 则没有。 ###
# 快速合并
$ git merge [branch name]
# 非快速合并
$ git merge --on-ff -m "message" [branch name]
3. 撤销/删除/回退:(前提是未git push到远程仓库)
- 修改了工作区,但未 "git add" 到暂存区:(丢弃工作区)
# 查看文件状态
$ git status
# 丢弃当工作区的前文件,把file恢复到最新的版本库
$ git checkout --[file name]
- 恢复工作区被删除的文件
# 查看文件状态
$ git status
# 丢弃当工作区的前文件,把file恢复到最新的版本库
$ git checkout --[file name]
# 若确实需要删除文件,并把版本库区域的该文件删除:
$ git rm [file name]
- 修改了工作区,且"git add"到暂存区,但未"git commit"到版本库:(丢弃工作区并清除暂存区)
# 查看文件状态
$ git status
# 丢弃当工作区的前文件,把file恢复到最新一次 "commit" 版本
$ git checkout --[file name]
# 撤销暂存区(git add)的修改
$ git reset HARD [file name]
- 修改了工作区,且"git add"到暂存区,并"git commit"到版本库:(版本回退)
# 查看提交的历史信息,'git commit -m xxx'后才会有
$ git log
# 显示单行,开头一大串"乱码"的是commit_id
$ git log --pretty=oneline
# 查看"未来"版本,以便恢复错误回退
$ git reflog
# "HARD"表示当前版本;"HARD^"表示上个版本,如此类推。也可以用commit_id的前几位代替"HARD^"回退到指定版本
$ git reset --hard HARD^
标签管理(git tag):
标签管理用于对某次提交(git commit)进行标记,如特定版本的发布,将其标记为"v1.0"。
# 获取提交记录 (添加 tag 前需要知道 "commit id")
$ git log --pretty --oneline
# 对特定的 "commit id" 打上标签名
$ git tag [tag name] [commit id]
# 也可以对 当前版本 打上标签
$ git tag [tag name]
# 也可以对特定的 标签信息 打上标签
$ git tag -a <tagname> -m "commit_msg"
# 查看所有 tag
$ git tag
# 查看指定tag的详细信息
$ git show [tag name]
# 删除指定标签
$ git tag -d [tag name]
".gitignore" 配置:
1. ".gitignore" 文件用于 指定某些特征的文件不提交到线上版本库。配置规则如下:
# 忽略指定文件名:
ehthumbs.db
# 忽略指定后缀:
*.db
# 忽略指定目录下的指定文件:
test/test.db
# 具体规则如下:
# 空行不表示匹配,可用于分割,便于可读。
# 以#开头的是注释,如果要在开头使用#号,要转义\#。
# 两端的空格可以忽略。
# !表示否定,前面忽略的文件/目录将会被重新包含。如果父级目录被忽略,则子文件不能被再次包含。
# 如果结尾有/,则表示只匹配目录。比如,a/表示a是目录。
# 如果不包含/,则会全局匹配。比如a,匹配任何目录下的a。
# 通配符*不能跨目录。
# 如果开头有/,则表示匹配根目录。比如,/a表示根目录下的a。
# 关于两个星号**:
# 比如**/a,表示任何目录下的a。
# 比如abc/**,递归匹配abc下的所有文件和目录。
# 比如a/**/b,其中的**表示0到多层目录。
# 其他情况下的两个*属于无效用法
2. 强制提交被忽略的文件:
$ git add -f [file name]
3. 检查被忽略文件与 ".gitignore" 内的哪行配置匹配:
$ git check-ignore -v App.class
# 若显示".gitignore:3:*.class App.class",表示第3行的"*.class"匹配了该文件
配置公钥:
已有则无需创建,文件地址: C:user/computerName/.ssh;id_rsa.pub为公钥,id_rsa为私钥
ssh-keygen -t rsa -C "youremail@example.com"