八. Git

201 阅读6分钟

1.简介

1.1 本地

  • 本地库( 历史版本 )
  • 临时存储( 暂存区 )
  • 工作区 ( 写代码 )
  • 远程库 ( 代码托管中心 )
工作区---git add---> 暂存区---git commit---> 本地库---git push---> 远程库
代码托管中心有: GitHub  码云    GitLab服务器(本地可以搭)

1.2 远程库

  • 团队内部合作
  • 跨团队协作
  • 远程库A 通过fork 远程库B
  • 当远程库B修改之后 pull request
  • 远程库A 审核 远程库B,通过之后 merge到远程库A

2.本地库操作

2.1 签名和本地库初始化

(1).设置签名
	git config --global user.name   ”GitHub用户名”
	git config --global user.email    ”邮箱”
    区分不同开发人员的身份,登录代码托管中心的邮箱和密码,与这个邮箱和密码没有关系
(2).命令级别
	项目级别(仓库级别),仅在当前本地库有效
    系统用户级别,登录当前操作系统的用户范围
    优先级: 项目级别的优先级大于系统用户级别
    git config是设置项目级别的
    git config --global 是设置系统用户级别的
(3).本地库初始化
	git init 来创建本地库

2.2常用命令

  • git status 查看日志

  • git add 123.txt (文件名) 添加这个文件到缓存区

  • git commit -m “这是第一次提交” 123.txt(文件名)

  • git log 查看曾经提交到本地仓库的日志

  • git log --pretty=oneline 作用同上, 只显示编号和信息

  • git log --online 作用同上,只显示编号的一部分

  • git reflog 记录每次执行的命令

  • git reset --hard HEAD^ 回退到上一个版本

  • git reset --hard HEAD^^ 回退到上两个版本

  • git reset --hard HEAD~100 回退到100之前的版本

  • git reset --hard 版本号 回退到具体某个版本

  • reset有三个参数

reset --soft 仅仅在本地库移动HEAD指针
reset --mixed 在本地库移动HEAD指针, 并且重置缓存区
reset --hard 在本地库移动HEAD指针, 并且重置缓存区, 重置我们的工作区
  • 删除文件 并找回
前提: 删除前,文件在时的状态为提交到了本地
操作: git reset  --hard [指针位置]
	删除已提交到本地库:  指针位置指向历史记录
    删除操作尚未提交到本地库: 指针位置使用HEAD
  • 比较文件差异
git  diff [文件名]     将工作区中的文件和暂存区进行比较
git  diff [历史版本号] [文件名]    将工作区中的文件和本地库的某个历史版本进行比较

3.分支

3.1 什么是分支

  • 在版本控制过程中, 使用多条线同时推进多个任务

3.2 分支操作

  • git branch -v, 打印分支

  • git branch 分支名, 创建分支

  • git checkout 分支名, 切换分支

  • git checkout -b 分支名 创建分支同时切换到该分支

  • git merge 分支名, 合并分支

  • git merge --no-ff把合并的记录添加到gitlog中

  • git branch -d 分支名 删除本地仓库的分支

  • 在week分支下执行 git push origin --delete week 删除远程week分支( week是自己随便取的名字)

  • 在week分支下执行 git push --set-upstream origin week 创建远程分支

3.3 解决冲突

当合并分支时,不同的分支更改同一个文件,更改的结果不同会产生分支冲突

  • 对比文件更改的不同内容, 手动更改文件,并删除特殊符号,达到更改结果一致
  • git add 文件名
  • git commit -m " 备注信息" (此时commit 一定不能带文件名)
  • git log --graph 查看分支合并图

3.4 撤销

  • git checkout --123.txt
    • 在add之前执行,撤回到与本地库相同
    • 若已经add到缓存区,又有修改,但还没commit到仓库区,撤回到与缓存区相同

3.5 分支策略

  • master主分支应该是非常稳定的,仅用来发布新版本的,平时不能在上面干活
  • 每个人都在自己建的分支上干活, 然后合并到dev开发分支. 再由组长把dev分支的内容合并到master主分支.
  • git checkout -b dev origin/dev 创建本地dev分支同时 创建远程分支dev

4. 托管中心(远程库) GitHub

4.1 生成秘钥

  • 终端命令窗口 ssh-keygen -t rsa -C “邮箱”
  • 在这个目录下 /c/users/Administrator/.ssh
  • 复制id__ras和id__rsa.pub文件中的秘钥
  • GitHub官网, 点击自己头像,再点击setting 复制秘钥于其中
  • cd到xx文件夹中,git bash测试秘钥: ssh -T git@github.com
  • 在GitHub网站手动创建仓库,用于与本地的仓库相连

4.2 关联远程仓库

  • 关联远程库, 网页右侧获得gitHub地址
  • git remote -v 打印远程库地址
  • 在xx文件夹下执行 git remote add origin “远程地址”
  • 取消关联远程仓库 git remote rm origin

4.3 拉取和推送内容###

  • 拉取远程库内容到本地库 git pull origin master --allow-unrelated-histories
  • 如不想覆盖本地: git pull --rebase origin master 来合并远程和本地仓库
  • 推送本地库内容到远程库 git push origin master
  • 选择不上传某些文件 touch .gitignore 在uu文件夹中创建一个文件 将不想提交的文件名写到 .gitignore文件中 但是如果想把.gitignore中的commit到本地仓库 则需加 -f
  • 在master 下执行 git push origin master 提交到远程主分支
  • 在week分支下执行 git push origin week 提交到远程week分支

4.4 克隆

  • git clone '远程库地址' 只能克隆master分支, 在本地再创建week分支,
  • 然后在week分支下执行 git pull origin week 把远程week分支的内容拉下来
  • 在github上邀请成为成员, 可以执行push操作
  • 当成员执行了push操作之后, 主管可以git fetch origin master 来抓取远程库, 无误再进行merge操作
  • pull相当于 fetch 和 merge的合并
  • 不太能产生冲突的时有pull,为了保险慎重使用fetch

4.5 解决与远程库冲突

  • 如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取
  • 拉取下来后如果进入冲突,则按照'分支冲突解决' 操作即可

5. 跨团队协作??? 未完待续.......

  • fork,用团队外第三方的身份点fork

6.标签管理

* git tag 标签名           // 打标签
* git tag                   // 查看所有标签
* git tag 标签名 commitID  // 给特定的commit id打标签
* git tag -a 标签名 -m “标签信息”  // 指定标签信息

* git  checkout  v1.0   // 切换到指定标签的版本
* git  show  标签名     // 查看说明文字
* git  tag -d 标签名       // 删除标签
* git  push origin 标签名      // 推送标签到远程
* git  push origin --tags   // 一次性推送全部尚未推送的标签到远程
* 删除已经推送到远程的标签: 先从本地删除 git tag -d 标签名
再从远程删除 git push origin  :refs/tags/标签名