一.设置
1.查看配置
git config --list
2.查看用户名
git config user.name
3.查看邮箱
git config user.email
4.配置全局用户名
git config --global user.name "nameVal"
5.配置全局邮箱
git config --global user.email "eamil@qq.com"
6.全局缓存登录凭证
git config --global credential.helper store
7.配置单个目录邮箱和用户名
进入到项目文件夹根目录里面.
$ git config user.name “xxxx”
$ git config user.email "xxxx@xx.com"
$git config credential.helper store :设置改目录缓存登录凭证
8.清除缓存登录凭证.
git config --global credential.helper wincred
9. 清除缓存在git中的用户名和密码
git credential-manager uninstall
二.常见操作.
1.初始化
git init
2.添加
git add readme.txt(将文本上传到本地git库)
对于一个文件夹添加
git add . :把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
git add -u:仅监控已经被add的文件(即tracked file)将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git add -A:是上面两个的合集,提交所有变化。(git add --all的缩写)
3.状态查看
git status(这句话查看工作目录中的状态)
4.提交
git commit -m "first"(可以将他理解为注释,当上传项目到github时,作用是标注我上传该项目时想要说的话)
5.查看git版本号
git version:查看git软件的版本号。
三.branch(分支)
1.列出所有的分支
git branch (所有本地分支)
git branch -r (所有远程分支)
git branch -a (所有本地和远程分支)
2.新建分支
(1.)新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
例如,创建名称为dev的分支:
$ git branch dev
(2.)新建一个分支,并切换到该分支
$ git checkout -b [branch-name]
例如,创建名称为dev的分支并切换到该分支上
$ git checkout -b dev
3.切换分支
(1.)切换到指定分支,并更新工作区
$ git checkout [branchname]
例如,切换到dev分支上
$ git checkout dev
(2.)合并指定分支到当前分支
$ git merge [branchname]
例如,当前在master分支上,将dev分支合并到当前master分支上来
$ git merge dev
4.删除分支(需要切换到对应的分支才能删除)
(1.)删除本地分支
$ git branch -d [branchname]
例如,删除本地dev分支
$ git branch -d dev
(2.)删除远程分支
$ git push origin --delete [branchName]
例如,删除远程的dev分支
$ git push origin --delete dev
(3.)分支重命名
git branch -m [oldname] [newName]
(4.)查看当前分支的父分支
git reflog --date=local | grep nikeglass
四.tag操作.
1.列出所有tag
$ git tag
2.打轻量标签
$ git tag [tagname]
3.附注标签
$ git tag -a [tagname] -m [message]
例如,打v1.0标签
$ git tag -a v1.0 -m 'v1.0 release'
4.后期打标签
$ git tag -a [tagname] [version]
5.删除本地tag
$ git tag -d [tagname]
例如,删除本地v1.0 标签
$ git tag -d v1.0
6.删除远程tag
$ git push origin --delete tag <tagname>
还有另外一种方式来删除,推送一个空tag到远程
$ git tag -d <tagname>
$ git push origin :refs/tags/<tagname>
7.查看tag信息
$ git show [tag]
8.提交指定tag
$ git push [remote] [tag]
例如,将v1.0标签推送到远程服务器上
$ git push origin v1.0
9.提交所有tag
$ git push [remote] --tags
10.切换到对应标签状态
git checkout [tagname]
但是,这时候 git 可能会提示你当前处于一个“detached HEAD" 状态。 因为 tag 相当于是一个快照,是不能更改它的代码的。
如果要在 tag 代码的基础上做修改,你需要一个分支:
git checkout -b [branchname] [tagname]
<!--这样会从 tagname 创建一个branchname分支,然后就和普通的 git操作一样了。-->
五.版本回溯
1. 每一次操作记录
git log
2.查看所有分支的所有操作记录
可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录,而且跟进结果可以回退道某一个修改。
git reflog
git reset --hard HEAD^ 回退到上个版本
git reset --hard commit_id 退到/进到 指定commit_id
六.克隆
1.克隆项目
git clone git@git... .git
git clone http://... .git
2.指定邮箱或者用户名克隆项目
git clone http://邮箱(或用户名):密码@仓库地址
如果用户名或者邮箱及密码中包含了@符号,所以需要把@转码一下代替:@-->%40
3.克隆指定分支的项目
git clone -b + 要clone的分支名 + 仓库地址
4.克隆项目所有分支
clone只能clone远程库的master分支,无法clone所有分支.解决:
(1.)git branch -a
,列出所有分支名称如下:
* master
remotes/origin/HEAD -> origin/master
remotes/origin/add-license-1
remotes/origin/dev
remotes/origin/master
(2.)checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支
git checkout -b dev origin/dev
(3.)切换到dev
分支
git checkout dev
七.远程.
1.本地项目关联远程仓库。
git remote add origin git@gitee.git:关联远程仓库地址(origin 是默认的远程版本库名称,添加多个不同的远端需要不同的标识)
2.查看本地项目关联的远程仓库。
git remote:列出所有的远端.
git remote -v:列出所有的远端,详细信息.
3.删除关联的远程仓库。
git remote rm origin:origin(远程关联仓库的别称)
4.推送到远程仓库。
git push <远程主机名> <本地分支名>:<远程分支名>
如果当前分支只有一个追踪分支,那么主机名和后面都都可以省略。
git push
如果当前分支与多个主机存在追踪关系,那么这个时候-u选项会指定一个默认主机,这样后面就可以不加任何参数使用git push。
git push -u origin(远程主机名) master:master(本地分支名:远程分支名)
5.获取远程仓库内容。
(1.)git fetch 相当于是从远程获取最新到本地,不会自动merge,如下指令:
git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master...origin/master //比较本地的master分支和origin/master分支的差别
git merge origin/master //进行合并
(2.)git pull:相当于是从远程获取最新版本并merge到本地。
git pull origin master
6.git fetch和git pull 区别:
git在本地会保存两个版本的仓库,分为本地仓库和远程仓库。
(1.)本地仓库就是我们平时 add、commit 的那个仓库。
(2.)远程仓库可以用git remote -v查看(这里的远程仓库是保存在本地的远程仓库,等同于另一个版本,不是远程的远程仓库)。
fetch 和 pull 的不同: fetch 只能更新远程仓库的代码为最新的,本地仓库的代码还未被更新,
我们需要通过 git merge origin/master 来合并这两个版本,可以把它理解为合并分支一样的。
pull 操作是将本地仓库和远程仓库(本地的)更新到远程的最新版本。如果想要更加可控一点的话推荐使用fetch + merge。
分支进行强行合并
git pull origin master --allow-unrelated-histories
九.Git Flow(版本管理工作流)
Git 作为一个源码管理系统,不可避免涉及到多人协作。为了避免协作过程中产生混乱,必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去。Gitflow是基于Git的强大分支能力所构建的一套软件开发工作流,这些流程应被视作为指导方针,而非“铁律”。Gitflow使用多个分支来记录项目开发的历史,而不是使用单一的master分支。
1.主要分支
主要分支包括Master和Develop,前者用于正式发布,后者用于日常开发。常设分支只需要这两条就够了,不需要其他的了。
Master分支(主):
Git主分支的名字,默认叫做Master。该分支上的代码随时可以部署到生产环境, 这个分支只能从其他分支合并,并且不能在这个分支做任何直接修改。每次版本封版后由主程序员合并release
分支代码进来,发布完成以后打上tag,开发人员不可以随意操作。
develop分支(开发):
用来开发的分支,通常可以直接在其上进行开发,在每次发布版本(release)和线上紧急bug(hotfix)修复后,需要同步到其上。理论上此版本只在开发阶段使用,提测时不可以直接修改,而在测试结束后由release
分支合并到其上。如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"(merge)。
2.临时性分支
除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:功能分支 (feature),预发布分支 (release),修补bug分支 (fixbug),这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。
release分支(预发布):
在发布正式版本之前(即develop合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从Develop分支上面分出来的,所有测试阶段的bug全部在此分支修复,测试结束后,必须合并进Develop和Master分支。它的命名,可以采用release-xx的形式。
feature分支(功能):
为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。功能分支的名字,可以采用feature-XX的形式命名。如果在团队开发时,有一个功能的开发周期要长过本次版本开发周期,建议开启一个 feature
进行单独开发,当需要此功能的时候,只需要将 feature
合并入 develop
分支,下次一并提测即可。这样设计可以避免这个功能在尚未开发完成或者通过测试的时候混入发布的版本,而导致不可预知的不稳定。当然也可以同时开启多个 feature
分支进行不同新功能开发,在合适的时候合并提测即可。
hotfix分支(bug修复):
软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-XX的形式。线上bug修复的热补丁分支,应由 master
拉出,并在修复完成后合并入 master
和 develop
保证两分支的bug已修复。
3.新功能开发中,各角色的工作流程
(1.)前置阶段(新功能启动)
开发主管--》基于master主干创建一个develop分支。
现有主干分支: master、develop
(2.)开发阶段(开始开发)
功能开发人员--》基于develop分支创建一个feature_XX分支
功能开发人员--》在feature_XX分支上开发新功能
功能开发人员--》新功能开发完成以后,在git上发起Pull request把代码合并到到develop分支上
开发主管--》确认代码没问题,通过该合并请求
现有主干分支: master、develop、feature_XX
(3.)测试阶段(开发完毕)
开发主管--》基于develop分支创建一个分支名为release-1.0.0的预发布版本
测试人员--》对release-1.0.0分支的代码进行测试,测试通过在git发起Pull request把release-1.0.0代码合并到到master分支上。
现有主干分支: master、develop、feature_XX、release-1.0.0
(4.)发布阶段(测试通过)
开发主管--》基于master分支创建一个里程碑版本(tag)名为1.0.0-Release
删除完成使命的其他分支:feature_login、release-1.0.0
现有主干分支: master、develop、1.0.0-Release(tag)
4.线上代码出现bug时,各角色的工作流程
(1)前置阶段(提交bug)
测试人员--》发下问题,基于1.0.0-Release里程碑版本在git上新建一个issue
现有主干分支: master、develop、1.0.0-Release(tag)
(2)修复阶段(开始修复bug)
功能开发人员--》基于1.0.0-Releasetag创建一个hotfix_XX(该issue序号)分支,在hotfix_XX分支上修复bug,修复完成后,在git上发起Pull request把代码合并到到master主干上
开发主管--》确认代码没问题,通过该合并请求
现有主干分支: master、develop、1.0.0-Release(tag)、hotfix_0001
(3)测试阶段(bug修复完毕)
测试人员--》对master分支的代码进行测试
现有主干分支: master、develop、1.0.0-Release(tag)、hotfix_0001
(4)发布阶段(测试通过)
开发主管--》基于master分支创建一个里程碑修复版本(tag)名为1.0.1-Release,删除完成使命的其他分支:hotfix_XX
现有主干分支: master、develop、1.0.0-Release(tag)、1.0.1-Release(tag)
十.常见问题.
第一次输入错误的gitlab用户名和密码,第二次clone不弹框提示输入用户名和密码的解决方案。
git clone remote: HTTP Basic: Access denied
方式一:在控制面板里面将凭证删除.
方式二:使用git命令重置凭证.
git config --system --unset credential.helper
git config --global credential.helper store