给新人做 Git 使用培训,整理此篇文章。旨在快速入门、熟练使用最常规的操作。Git 的详细介结、Git 与 SVN 的区别,可从网上了解。
Git 使用相关教程资源Git 中文网, Git 官网中文教程, 廖学峰 Git教程, Runoob Git教程, git - 简明指南。
Git 是开源的分布式版本控制系统,这里的分布式主要体现在各个开发工程师都有项目的本地仓库,在做修改后,先是提交到本地仓库,再推送到远程共享仓库,即使远程仓库断开,仍可以基于本地仓库继承更新开发和跟踪,不会丢失元素数据。
Git 即是客户端,也是服务器;不同于 SVN 有个中心服务器。Git 可以使用四种主要协议来传输数据:本地传输、SSH 协议、Git 协议、HTTP协议。 GitHub 是基于 Git 技术的最大的开源项目托管平台。
Git 安装
安装
apt install git
查看版本
git --version
可通过help查看命令使用,子命令同样可查看帮助
//查看命令使用帮助 git git --help //简要帮助说明 git log -help //详细帮助说明,Windos会弹帮助页面,Linux相当于:man git-log git log --help //Linux 下使用 man git-reset
Git 配置
使用 Git,配置作者相关信息,git config
如果加上 --golobal
参数,则是设置全局配置。
查看 git 配置
git config --list
查看 git 用户名,密码,邮箱配置
git config user.name git config user.password git config user.email
设置 git 用户名,密码,邮箱
git config user.name "Tom" git config user.password "123456" git config user.email "tom@163.com"
设置 git 用户名,密码,邮箱 的全局配置
git config --global user.name "Your Name" git config --global user.password "Your Password" git config --global user.email "Your Email Address"
仓库管理
版本库又名仓库,英文名 repository, 可理解为操作系统中的一个目录,该目录下的所有资源都将被 Git 管理起来,每个文件的增、删、改都将被跟踪并记录历史,可以追踪历史和还原。
创建本地仓库
将一个空目录创建为本地仓库
git init
克隆远程仓库
从远程共享仓库拉取项目到本地
git clone https://xxx/xxx-project.git git clone git@github.com:your-name/xxx-project.git
查看远程仓库信息
git remote git remote -v //显示详细信息 //默认会有 fetch 和 push 两个分支。
从远程仓库更新
//拉取远程仓库更新的内容, 默认拉取最新的版本
git pull
推送到远程仓库
git commit 提交到本地仓库后,还需要推送到远程仓库以作备份,或供给项目团队多人协作
//默认推送本地的 origin 分支到远程的 master 分支上
git push
git push origin master
//推送到其他分支,如开发分支 dev
git push origin dev
Git 空间
创建仓库后,文件所在的目录是工作区
,隐藏目录.git
是 Git 版本库,Git 的版本库中还有暂存库
和随仓库创建而自动创建的master
分支,以及指向master
的HEAD
指针。
在把修改的文件添加到 Git版本库时,分两步执行:
- 使用
git add
将工作区的修改的文件添加到暂存区(index)。 - 使用
git commit
将暂存区的所有内容提交到当前分支。
修改提交
对比差异
对比已修改待提交的文件与当前版本的差异,可看到详细的差异内容
//对比所有差异
git diff
//指定文件对比差异
git diff filename
查看状态
查看工作区和暂存区的状态,此命令可看到哪些修改已被暂存(add), 哪些没有暂存。
git status
添加修改
提交已修改的文件到本地仓库的暂存区。 git add
后面跟.
表示当前目录修改的文件, 后面跟文件名则是添加指定的文件。
每次提交成功后都会生成一个40位长度 commit id来作为本次提交的版本号,该版本号是用 SHA1 计算得出,十六进制表示。
//添加新文件和编辑过的文件,不包括删除文件
git add .
//添加所有变更,包括增加、修改、删除
git add -A
//添加修改、增加的变更, 不包括新增的文件
git add -u
//添加指定文件
git add file1.txt file2.txt
提交修改
给本次提交添加说明,内容以描述修改为佳,易于阅读。git commit只对已执行git add的文件执行提交。
//提交并添加说明
git commit -m "说明"
//将添加和提交个步骤合并到一条命令执行
git commit -a -m "说明"
查看历史
查看提交历史
查看提交历史,显示是按从最近到最远的提交日志来排序。每个版本号是以 git log 查看每个版本的大致变动情况 git log --stat --summary
指定版本查看细节
//查看当前版本 git show git show HEAD //查看上一个版本 git show HEAD^ //查看前第4个版本 git show HEAD~4 //指定commit_id查看 git show dfb02
撤销修改
撤销工作区的修改
//checkout 检出版本库中的文件到当前工作区覆盖不需要的修改达到撤销修改的目录 git checkout -- filename
撤销添加到暂存区的修改
撤销暂存区中的修改,默认是回到 HEAD 版本//默认撤销所有已添加到暂存区但未提交的修改 git reset git reset HEAD //指定当前版本中的文件撤销 git reset filename git reset HEAD filename
删除文件
//删除文件并提交
git rm filename
git commit -m "说明"
//恢复误删除的文件
git checkout -- text.txt
删除目录
//切换到分支
git checkout branch_name
//删除目录
git rm folder_name -r -f
//提交
git commit -m "delete xxx folder"
//推送到远程分支
git push origin
版本回退
Git 使用 HEAD
表示当前版本,上一个版本用HEAD^
表示,上上一个版本用HEAD^^
表示,若要往上50个版本,可用HEAD~50
表示。git reset
即可以用来撤销添加到暂存区的修改,也可用于回退版本。
回退到上一个版本
git reset HEAD^
回退到指定版本
//先使用 **git log** 查看历史版本,并记录要回退到的版本号 git reset commit_id 示例:$ git reset a238
注意:执行回退版本前,最好记录最新的版本号,以便于还原到最新的版本;因为回退版本后,比回退到的版本更新的版本都不再显示,但实际存在。
还原版本和回退版本是同样的操作
git reset "还原到的版本号"
Git 对版本号的变更保存了操作记录,可使用git reflog查看, 当要还原版本又不记得版本号时有用。
git reflog
分支管理
项目开发过程会创建很多分支来区分定制版本或稳定版本与开发中的版本的区别。
master:主分支是非常稳定的,仅用来发布新版本,时刻要与远程主分支同步。
dev:开发分支是不稳定的,在 dev分支上工作。在团队协作时,每个人有自己的分支,往dev
分支上合并。
bug 分支:用于在本地修复Bug, 若修复的是线上Bug, 修复后是需要发布版本,就需要推送到远程仓库。
查看分支
列出所有分支,master 是主分支,分支前面带星号(*)的是当前分支
git branch
创建分支
git branch <branch_name>
切换分支
git checkout <branch_name>git checkout -b <branch_name> //创建+切换分支
合并分支
//切换到主分支,要全并到某个分支,就切换到这个分支作为当前分支,再把其它分支合并到当前分支上git checkout master//合并某分支到当前分支,通常情况下,我们是把开发分支测试通过后合并到主分支。git merge <branch_name>//禁用 Fast forward, -m 添加注释git merge --no-ff -m "new merge" <branch_name>//查看分支合并图git log --graph//查看分支树git log --graph --pretty=oneline --abbrev-commit
推送分支
推送分支到远程仓库
git push --set-upstream origin <branch_name>
拉取远程分支
//将自动创建一个本地分支,并与远程分支关联git checkout -b local_branch_name origin/remote_branch_name//若出现 fatal,可先执行git fetch
删除分支
// -d 选项只能删除已经合并过的分支,未合并的分支无法删除。git branch -d <branch_name>// -D 选项是强行删除分支。git branch -D <branch_name>
Bug分支
需要从在线版本的分支上创建修复Bug分支来修复Bug, 而正在开发的分支还未完成不能提交,Git 提供了一个把当前工作区收藏起来的功能(stash
),相当于把当前工作区进行隔离,这样当前工作区变成干净的了,就可以放心创建分支来修复Bug,又不影响之前未提交的工作区。
收藏(隔离)当前工作区
git stash
查看收藏的工作区
git stash list
恢复收藏的工作区
//恢复内容但不删除 git stash apply git stash drop //删除工作区 //恢复同时删除工作区 git stash pop
若有多次
stash
,可指定stash进行恢复。git stash list //输出 stash@{0}: WIP on test: d59518b merger stash@{1}: WIP on dev: 2259e12 add ffff //恢复指定的工作区 git stash pop stash@{0}
标签管理
分支的ID不容易记住,所以提供了给分支打标签的功能,实际使用一般将人为定义的版本号作为标签来操作。
通常在master
分支发布线上版本时打标签,以标签发布的版本。
打标签
打标签, 默认是打在最新 commit 上
git branch master git tag v1.0 git tag -a v1.0 -m "v1.0 released" cf810a1 //给标签添加说明
给指定的 commit_id 打标签
//查看 commit log git log --pretty=oneline --abbrev-commit //给指定的 commit_id 打标签 git tag v1.0.1 cf810e4
查看标签
查看所有标签
git tag
查看标签详细信息
git show v1.0
推送标签
创建的标签都只存储在本地,不会自动推送到远程,若要将本地某签推送到远程,可使用如下命令:
git push origin <tagname>
git push origin --tags //一次推送所有远程还没有的本地标签
拉取标签版本
拦取打了标签的版本源码,实际和拉取分支是同一个操作
//根据标签名检出源码
# git checkout tag_name
//根据标签的提交ID检出源码
# git show v1.3.1
commit e0694b01ccf904b842ec8434a6e5b4db52f45fb7 (tag: v1.3.1, tag: show, origin/master, origin/HEAD, master)
# git checkout e069
删除标签
标签一般不会执行删除操作,除非打错了标签
//删除本地标签
git tag -d <tagname>
//删除远程标签,需要先删除本地标签, 再推送到远程标签
git push origin :refs/tags/<tagname>
Git 使用流程
Git 的使用要确保 master 分支的稳定,主分支只与发布版本有关;提交冲突控制在最小分支范围内。
遵循以下两和要原则:
master 发布分支确保稳定,即确保为发布的最低版本。
严禁把 master 往开发分支合并的操作。
分支合并,必须遵从单向合并,即 feature > develop > test > release > master 合并。
修复Bug分支
使用
git stash
暂存当前工作区拉取 master 分支,创建 hotfix 分支,在此分支上修复 Bug
在 hotfix 分支上打包测试
测试通过,把 hotfix 分支合并到 master 分支,发布生产
同时把 hotfix 分支合并到 develop 分支
使用
git tash pop
恢复工作区
多feature分支
一个大的项目,有多个小团队并行开发,有先发布,后发布。
- 项目领导从 master 上创建 develop 分支
- 小团队分别从 develop 分支创建各自的 feature 分支
- 各个 feature 分支开发完,只能往 develop 上合并,合并可能出现冲突,谨慎解决
- develop 打包给测试,测试通过,develop 合并到 release 预发布分支
- 即发布环境没问题,release 往 master 合并,生布生产
命令参考
注意:本文归作者所有,未经作者允许,不得转载