原理
工作区:就是当前正在操作的文件夹
暂存区 :需要提交的文件修改暂时放到暂存区,然后再一次性提 交到本地版本库中。
本地版本库:版本库又名仓库,可以理解成一个目录,这个目录里面的所有文件都可以被 Git 管 理,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将 来某个时刻可以“还原”。所以,首先应该创建一个本地版本库。
常用命令
git init //初始化一个仓库:
git branch //查看分支:
git add [file] 或 git add . //将已修改或未跟踪的文件添加到暂存区:
git commit -m "提及记录 xxxx" //提交至本地仓库:
git push origin //本地分支推送至远程分支:
git status //查看当前工作目录和暂存区的状态:
git log //查看提交的日志记录:
git pull //从远程分支拉取代码:
git merge xxx //合并某分支(xxx)到当前分支:
git checkout xxx //切换到分支 xxx:
git checkout -b xxx //创建分支 xxx 并切换到该分支:
git branch -d xxx //删除分支 xxx:
git stash //将当前分支到改动保存到堆栈中:
git stash pop //恢复堆栈中缓存的改动内容:
Git分支管理
git remote //不带参数,列出已经存在的远程分支
git branch //查看分支,一般克隆下来的默认只有一个master分支 前面加* 号的是当前的分支
git branch -a //加上-a参数可以查看远程分支
git branch <name> //创建分支
git switch <name>
git checkout <name> //切换分支
git switch -c <name> //创建分支的同时切换到该分支(写法1)
git checkout -b <name> //创建分支的同时切换到该分支(写法2)
git branch -d <name> //删除分支
git branch -r -d origin/branch-name
git push origin :branch-name //删除远程分支
git branch --set-upstream-to=origin/remote_branch your_branch //将本地的仓库和远程的仓库关联起来
//如果远程新建了一个分支,本地没有该分支。可以利用
git checkout --track origin/branch_name //这时本地会新建一个分支名叫 branch_name ,会自动跟踪远程的同名分支 branch_name。
//如果本地新建了一个分支 branch_name,但是在远程没有。
//这时候 push 和 pull 指令就无法确定该跟踪谁,一般来说我们都会使其跟踪远程同名分支
//所以可以利用
git push --set-upstream origin branch_name
//这样就可以自动在远程创建一个 branch_name 分支,然后本地分支会 track 该分支。 //后面再对该分支使用 push 和 pull 就自动同步。
Git 多人协同
master分支:只有项目经理才能合并,是项目的最终版
dev开发分支:最后要合并到master分支上的,我们在开发分支上操作
先拉取dev分支到本地
然后在本地再建新分支开发新功能:
比如新建feature分支,在feature分支上写代码,运行没问题后再合并到dev分支上,dev分支检查下有没有问题,没有问题就可以推送到远程
//怎么合并分支,首先,我们要切换到dev分支上,然后输入
git merge feature //把feature分支的代码合并到dev
其他命令
git remote update origin --prune //更新远程分支列表\
git branch -a //查看所有分支
git push origin --delete Chapater6 //删除远程分支Chapater6
git branch -d Chapater6 //删除本地分支 Chapater6
项目开发完毕时,在远程的dev分支上新建出一个测试分支,用来测试,测试没问题后就可以将dev分支合并到master分支上,然后就能上线了
git版本回退
当修改出错的时候想回退到某个版本
git log //该命令显示从最近到最远的提交日志。每一次提交都有对应的 commit id 和 commit message。
git log --pretty=oneline //简化
git reset --hard id //根据 id 回退到指定的版本;
git 代码提交规范
在多人协作的背景下,git 仓库和 workflow 的作用很重要。而对于 commit 提交的信息说明存在一定规范,现使用 commitlint + husky 规范 git commit -m “” 中的描述信息。我们都知道,在使用 git commit 时,git 会提示我们填入此次提交的信息。可不要小看了这些 commit,团队中规范了 commit 可以更清晰的查看每一次代码提交记录,还可以根据自定义的规则,自动生成 changeLog 文件。
提交格式(注意冒号后面有空格):
<type>[optional scope]: <description>
type :用于表明我们这次提交的改动类型。
optional scope:可选,用于标识此次提交主要涉及到代码中哪个模块。
description:一句话描述此次提交的主要内容,做到言简意赅。
Type 类型
//build:编译相关的修改,例如发布版本、对项目构建或者依赖的改动
//chore:其他修改, 比如改变构建流程、或者增加依赖库、工具等
//ci:持续集成修改
//docs:文档修改
//feat:新特性、新功能
//fix:修改bug
//perf:优化相关,比如提升性能、体验
//refactor:代码重构
//revert:回滚到上一个版本
//style:代码格式修改, 注意不是 css 修改
//test:测试用例修改
如何将本地的项目上传到GitHub上?
git init //把这个文件夹变成Git可管理的仓库
git add .
git commit -m "aaa"
//在Github上创建好Git仓库之后我们就可以和本地仓库进行关联了
git remote add origin https://github.com/guyibang/TEST2.git
//或者
git remote add origin git@github.com:GDUFS-IIIP-DEV/yunyin.git
git push -u origin master // 由于新建的远程仓库是空的,所以要加上-u这个参数
git push origin master //等远程仓库里面有了内容之后,下次再从本地库上传内容的时候只需这样就可以了
git pull --rebase origin master //当github上的仓库不是空的时,即在GitHub上创建仓库的时候勾选了创建README.md文件时,要先pull
git log --oneline --graph //以简洁的方式显示 git 记录
git log -最近提交的次数 //查看最近几次的 git 记录
Git rm 文件名 --cached //某个文件不再被 Git 控制
Git mv hello.txt world.txt //更新文件名
Git checkout 文件名 //找回已删除的文件:
Git reset master^ //撤销某次 commit
项目开发中使用git的标准
master分支:只有项目经理才能合并,是项目的最终版
dev开发分支:最后要合并到master分支上的,我们在开发分支上操作
开发: 先拉取dev分支到本地 然后在本地再建新分支开发新功能:
比如新建feature分支,在feature分支上写代码,运行没问题后再合并到dev分支上,dev分支检查下有没有问题,没有问题就可以推送到远程
//怎么合并分支,首先,我们要切换到dev分支上,然后输入
git merge feature //把feature分支的代码合并到dev
其他命令
git remote update origin --prune //更新远程分支列表
git branch -a //查看所有分支
git push origin --delete Chapater6 //删除远程分支Chapater6
git branch -d Chapater6 //删除本地分支 Chapater6
测试分支: 项目开发完毕时,在远程的dev分支上新建出一个测试分支,用来测试,测试没问题后就可以将dev分支合并到master分支上,然后就能上线了
对 GitFlow 的理解?
GitFlow 重点解决的是由于源代码在开发过程中的各种冲突导致开发活动混乱的问题。重点是对各个分支的理解。
- master:主分支。
- develop:主开发分支,平行于master分支。
- feature:功能分支,必须从develop分支建立,开发完成后合并到develop分支。
- release:发布分支,发布的时候用,一般测试时候发现的 bug 在该分支进行修复。从develop分支建立,完成后合并回develop与master分支。
- hotfix:紧急修复线上 bug 使用,必须从master分支建立,完成后合并回develop与master分支。
git merge 和 git rebase 的区别?
相同点:
git merge和git rebase两个命令都⽤于从⼀个分⽀获取内容并合并到当前分⽀。
不同点:
git merge会⾃动创建⼀个新的commit,如果合并时遇到冲突的话,只需要修改后重新commit。
- 优点:能记录真实的commit情况,包括每个分⽀的详情
- 缺点:由于每次merge会⾃动产⽣⼀个commit,因此在使用⼀些可视化的 git 工具时会看到这些自动产生的commit,这些commit对于程序员来说没有什么特别的意义,多了反而会影响阅读。
git rebase会合并之前的commit历史。
- 优点:可以得到更简洁的提交历史,去掉了 merge 产生的commit
- 缺点:因为合并而产生的代码问题,就不容易定位,因为会重写提交历史信息
场景:
当需要保留详细的合并信息,建议使⽤git merge, 尤其是要合并到master上 当发现⾃⼰修改某个功能时提交比较频繁,并觉得过多的合并记录信息对自己来说没有必要,那么可尝试使用git rebase
切换分支,代码暂存
在开发中经常会遇见:正在A分支开发,但是有紧急需求需要在B分支处理,此时A分支代码没有开发完整,又不能提交代码,这个时候暂存本地代码就非常的YYDS了!
- git status 查看当前修改的文件
- git stash 暂存当前未commit的代码
- git stash save "备注的内容" 暂存当前未commit的代码并添加备注
- git stash list 查看所有stash记录
- git stash apply 应用最近一次stash
- git stash apply stash@{序号} 应用指定的stash
- git stash pop 应用最近一次stash并删除其记录
- git stash pop stash@{序号} 应用指定的stash并删除其记录
- git stash drop 删除最近一次stash
- git stash drop stash@{序号} 删除指定的stash
- git stash clear 删除所有stash记录