Git实战
0. 前奏
0.1 安装
- 下载 点击进入下载地址
- 无脑下一步
0.2 使用
[1]. 右键选择 Git Bash Here
[2]. 初始化本地仓库(创建一个文件夹用作本地仓库)
[3]. git config -e --global 命令生成 .gitconfig文件,默认在c盘下的当前用户目录里,删除里面的内容
[4]. 设置name和email GitBash中使用 git config --global user.name "名字" 和 git config --global user.email "邮箱" 设置
[5]. 在创建的文件夹中使用git init命令初始化本地仓库
0.3 ssh配置
# 执行下列操作,然后一直按回车
ssh-keygen -t rsa -C "这里换上你的邮箱"
在C:/Users/用户/.ssh文件下 id_rsa 和 id_rsa.pub 文件,将 id.rsa.pub 文件中的内容复制到github即可
1. git的本地版本管理
1. 初始化:在想要管理的文件夹下执行以下命令
git init
2. 本地版本的工作流程
各区域存放的东西:
1. 工作区:沙盒
2. 暂存区:预期下一次提交的快照
3. 版本库:本次提交的快照,下次提交的父节点
工作区文件的变动,会被git自动检测,并使其变成红色
使用git add . 将红色的文件复制到暂存区(这些文件就是下一次提交的快照),并使其变绿
使用git commit -m "message" 将绿色的文件复制到版本库,称为提交。(这些文件就是本次提交的快照,暂存区的文件存放的也变称为本次提交的快照)
- 仓库创建完(git init),工作区文件file.txt被检测到变化(工作区和暂存区不同,使用git status 命令查看 file.txt变为红色)
- 用 git add 把工作区中的内容复制到暂存区中(暂存区和版本库不同,使用git status 命令查看 file.txt变为绿色)
- 使用 git commit,它会取得索引中的内容并将它保存为一个永久的快照,然后创建一个指向该快照的提交对象,最后更新 master 来指向本次提交。(此时三个区域的文件一样,所以git status不会输出)
【切换分支或克隆的过程也类似。 当检出一个分支时,它会修改 HEAD 指向新的分支引用,将索引填充为该次提交的快照,然后将索引的内容复制到工作目录中。(三个区域还是相同的,所以git status不会输出)】
3. 功能命令
git status // 管理文件夹下的文件状态 红色:检测到文件被创建或者文件以修改; 绿色:文件已经被放入暂存区;
git log // 显示当前分支所有提交过的版本信息,不包括已经被删除的 commit 记录和reset的操作。
git reflog // 显示所有分支的所有操作记录信息(包括已经被删除的 commit 记录和 reset 的操作)。
// reset是让HEAD指针指向前面的版本
// --soft HEAD指向当前版本的前n个版本,仅改变 版本库 的内容,所以版本库的内容会和暂存区不一样,git status命令查看文件会变绿
// --mixed HEAD指向当前版本的前n个版本,会改变 版本库、暂存区 的内容,所以暂存区的内容会和工作区不一样,git status命令查看文件会变红
// --hard HEAD指向当前版本的前n个版本,会改变 版本库、暂存区、工作区 的内容,三个区域内容一样,git status命令不会输出
git reset [--soft | --mixed | --hard] [HEAD~n]
4. 分支-基础命令
git branch //查看所有分支,*只当前分支
git branch -r // 查看所有远程分支
git checkout 分支名 // 切换分支
git checkout -b 分支名 // 创建分支并切换分支
git merge 分支名 // 将分支合并到当前分支
git branch -d 分支名 // 删除分支
5. 远程仓库(github)
5.0 首先创建仓库(或者创建组织,然后创建仓库)
创建仓库
创建组织,邀请成员,创建仓库
5.1 基础命令
git remote add origin 远程仓库地址 // 给远程仓库起别名
git push origin 分支名 // 给远程仓库推送分支并合并,如果远程仓库没有该分支,就创建。
git push origin 本地分支名:远程分支名 // 给远程仓库的远程分支推送本地分支并合并,如果远程仓库没有该分支,就创建。
git push origin --delete 远程分支名 // 删除远程分支
git clone origin // 克隆远程仓库的代码(所有分支都会克隆下来)
git pull origin 分支名 // 从远程仓库拉取分支并合并
git pull origin 远程分支名:本地分支名 // 从远程仓库拉取远程分支到本地分支并合并
git checkout -b 本地分支名 origin/远程分支名 // 拉取远程分支并创建本地分支
6. 工作流
7. 发布版本
为了能清晰的管理版本,在公司不会直接使用commit来做版本,会基于Tag来实现:v1.0、v1.1、v2.0...
git tag // 查看所有版本
git tag -a v1.0 -m "版本介绍" // 创建本地 Tag 版本(基于当前分支的当前内容 创建一个tag)
git tag -d v1.0 // 删除tag
git push origin tagName // 将本地的tag 推送到远程仓库
git push origin --tags // 将本地的所有tag 推送到远程仓库
git pull origin --tags // 将远端的tag 拉取到本地
git checkout tagName // 切换 Tag
git clone -b tagName 远程仓库地址 // 指定tag下载代码
8. 给开源项目做贡献
- fork源代码,把别人带代码拷贝到自己的远程仓库
- 拉取到本地进行修改
- 修改完推送到自己的远程仓库
- 提交bug申请 (pull request)
3. Question
3.1 为什么需要暂存区
暂存区实际上时索引区,提供了指针->版本库文件的映射
因为版本库中存放的文件是以【commit->树】的形式存储的(commit文件相当于一个指针,指向了文件树,还指向前一个commit,除此之外还有提交的时间等信息),如果修改了某路径的文件,需要从树根依次遍历到该文件,有了暂存区(索引区),就可以直接定位到该文件了