Git 使用培训
1、git基本操作
1.1、git安装
下载地址: https://git-scm.com/downloads
# 安装完通过查看版本号来检查是否安装成功
git --version
# git version 2.18.0.windows.1
# 将用户名、邮箱进行全局设置(改成自己的用户名、邮箱)
git config --global user.name "李贤伟"
git config --global user.email "lixw@wiseda.com.cn"
1.2、创建一个git项目
# 创建一个git-demo项目
git init git-demo
# 如果有一个已经存在的项目,直接进入项目执行
# git init
# 添加.gitignore忽略不需要提交的文件
# touch .gitignore
# 进入创建的项目
cd git-demo
# 查看文件对象
find .git/objects
1.3、文件操作
# 添加一个文件<文件未跟踪>
echo "hello git" > index.html
# 查看状态
git status
# 将index.html文件添加到暂存区
#git add .
git add index.html
# 将文件从暂存区移出<变成Untracked状态>
#git rm --cached index.html
# 撤销最后一次操作
#git reset index.html
# 从分支的最新提交,覆盖index.html修改的内容<放弃当前修改>
#git checkout -- index.html
# 提交暂存区中的文件
git commit -m "添加index.html文件"
# 修改文件
echo "测试修改" >> index.html
# 通过-a参数相当于先把index.html添加到暂存区,再执行提交
git commit -a -m "修改index.html"
# 查看文件版本历史
git log index.html
# commit 38f93a339526dc1a746277db6ee5afa3c872072a (HEAD -> master)
# 一个长度为 40 个字符的校验和,前两个字符用于命名子目录,余下的 38 个字符则用作文件名
# 文件SHA-1哈希值
git hash-object -w index.html
# 查看文件内容 -p 选项可指示该命令自动判断内容的类型
git cat-file -p 8d0e41234f24b6da002d962a26c2495ea16a425f
# 做个测试,把该文件删除
rm -f index.html
git commit -a -m "删除index.html"
# 再从文件对象中找回
git cat-file -p 8d0e41234f24b6da002d962a26c2495ea16a425f > index.html
#再添加到暂存区进行提交
git add .
git commit -m "恢复index.html"
1.4、远程仓库
# 克隆远程仓库
git clone http://git.spm.wiseda.com.cn:2080/k8s/training/git-training.git
# 克隆指定分支
# git clone -b v1 http://git.spm.wiseda.com.cn:2080/k8s/training/git-training.git
# 克隆指定最近多少次提交历史(--depth=1,表示最近1次提交)
# git clone http://git.spm.wiseda.com.cn:2080/k8s/training/git-training.git --depth=1
# 显示远程仓库简写与其对应的 URL
git remote –v
# 推送到远程仓库 origin-远程仓库名称 ;master-本地master分支
git push origin master
# 更新远程分支(用于同步远程分支)
# git remote update origin --prune
- 第一次clone需要输入用户gitlab上的账号、密码
- 如修改了wpm密码,原来的凭证需要删除才会在clone时重新输入
2、分支管理
2.1、分支管理基本操作
# 新建一个iss53分支来修复issues上的#53 bug
git branch iss53
# 切换到iss53这个分支
git checkout iss53
# 相当于上面两个命令(新建一个分支,并切换到iss53这个分支)
# git checkout -b iss53
# 查看分支,*号标识的为当前分支,也就是当前HEAD指向的引用
git branch
#* iss53
# master
# 模拟修复bug并提交
echo "fixes #53" > 53bug.html
git add .
git commit -m "修改#53 bug"
# 切换到master分支
git checkout master
#合并iss53分支中的内容
git merge iss53
# 查看已经合并的分支 --no-merged:参数不未合并的分支
git branch --merged
# 指定某个分支进行创建(以iss53分支为基础创建iss54分支)
git branch -c iss53 iss54
# 删除分支
git branch -d iss53
# 刷新一下远程分支信息
git remote update origin --prune
# 从某一tag进行checkout,修改bug
# 列出所有标签版本
git tag
# 从某一标签版本checkout (如v1.2.1.RELEASE标签)
git checkout v1.2.1.RELEASE
# 通过git branch,当前HEAD没有具体分支指定(指向了当前创建tag的那个commit)
git branch
#* (HEAD detached at v1.2.1.RELEASE)
# dev
# master
# v2.0
# 如果在某一tag做临时bug修改,需要创建一个新分支(这样可以对新分支进行修改,提交,发布hotfix,合并到master或某一分支下,删除临时分支)
git checkout -b tmp01
# 删除某一分支
git branch -d tmp01
2.2、 默认状态
2.3 当系统发现某个bug
建立了一个issues 为#53,可针对这个bug建立一个分支来修复如:
git branch iss53
2.4 修复bug时的提交,如到:C3
2.5 系统出现一个需要紧急修复的bug
git branch hotfix
2.6紧急bug修复合并到master
#合并hotfix分支中的内容(这时master移到C4)
git merge hotfix
2.7 删除hotfix分支再接着修改#53的bug
2.8 合并iss53分支
当#53的bug修复后,需要合并到master,这时master已经移到C4了,需要找出他们的共同父级做一个三方合并,即:C5、C2、C4进行一起合并。
2.9 三方合并,master移到C6
2.10 rebase方式
在2.7不进行三方合并,直接rebase到master后面,然后再跟master做合并,也就是丢弃掉与C2的合并,一般我们不采用这种方式,操作的步骤如下:
# 分支切换到iss53
git checkout iss53
# rebase(变基)到master
git rebase master
# 切换到master分支
git checkout master
# 合并iss53
git merge iss53
3、TortoiseGit使用
3.1、git安装
下载地址: https://tortoisegit.org/download/
根据自己操作系统选择对应的文件,还可以选择下载汉化包
安装过程中用户、邮箱可以设置成自己的。
安装完后建议重启一下电脑,免得TortoiseGit管理的文件不显示状态。
3.2、右键菜单
安装完,资源管理器里随便哪个目录右键可以看到这几个菜单项,跟SVN的菜单长得差不多。
**Git Clone:**克隆一个远程仓库(如gitlab、github)
**Git Create repository here:**在当前目录创建一个git仓库
**TortoiseGit:**相关git功能操作(Add、Fetch、Push、Merge
3.3、克隆项目
在创建的项目中,点击“克隆”,然后选择使用HTTP克隆,复制。
在自己的某个文件夹下,右键选择“Git Clone",在弹出的窗口中,URL填gitlab项目的地址(正常情况在gitlab复制后,这里能够自动识别)
点击”OK“就可以了,其他的默认就可以了,如果自己熟悉可以对其他参数设置。
3.4、文件操作
3.4.1、添加文件到gitlab
如自己已经添加了一堆文件,需要提交到gitlab上,这里右键选择”Git Commit -> master“,当前分支为master
Message: 写个简要的注释说明当前提交了些什么内容
Check: 选择需要提交的文件
Commit & Push: 选择这个,单独的commit只会在本地仓库完成文件的提交,不会推送到gitlab上,所以我们直接选择Commit & Push
提交完关闭即可,然后可以去gitlab上检查一下自己的提交,可以看到自己提交的内容已经上传到gitlab了,其他人就可以同步了。
3.4.2、修改文件
假如我们修改了一下readme.md
文件,可以看到文件状态变了。
同样的方式右键选择”Git Commit -> master“,这时可以看到文件的状态为修改状态”Modified",Commit & Push
后可以到Gitlab检查文件是否已经更新。
3.4.3、撤销修改的文件
假如修改了readme.md
后,发现改得有问题,这时可以右键“TortoiseGit-->Revert"
弹出来窗口直接点击”OK"就可以看到文件已经还原到上次提交状态
3.4.4、删除文件
把readme.md
文件删除,右键选择”Git Commit -> master“,可以看到状态的不一样,Commit & Push
后可以到Gitlab检查文件是否已经删除。
3.4.5、恢复被删除的文件
右键: TortoiseGit--> show log
,找到删除的文件,然后右键Revert to parent revision :...
然后再将文件Commit & Push
,推送到gitlab上。
3.5、gitlab拉取操作
3.5.1、拉取gitlab上的更新
右键: TortoiseGit--> Fetch/Pull
都可以将gitlab的最新提交同步到本地,会跟本地的分支做一个合并,如果出现冲突,需要手工来解决。
git fetch
是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull
则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决
在没有冲突情况下,pull会自动合并,如果出现冲突,需要通过下面方式解决。
3.5.2、冲突解决
提交时产生冲突
这些错误的窗口可以都不管,手工去处理冲突,找到冲突的文件,然后打开编辑来处理冲突,处理完将下面标识的删除
然后在文件上右键TortoiseGit-->Resolve..
点击OK,确认已经处理完冲突的文件
然后再进行提交到gitlab
另一种冲突处理方式,直接把自己的文件备份出来,将gitlab上的版本覆盖本地版本,然后再来合并,选择哪种方式,看个人习惯。对于office系列的文档不太好对比,如果确定不了自己修改了哪些,还是搜索冲突标识去逐一合并,建议不要出现好几个人去修改同一个文件,二进制的文件冲突多了合并是比较痛苦的过程。
3.6、修改远程仓库地址
右键TortoiseGit-->Settings
进行设置修改
修改URL中的地址即可
对于TortoiseGit的操作基本上这些够用了,其他的可以自己尝试用用。
4、IDE使用Git
在IDE里使用git主要是开发,技术人员,大家百度一下,基本上都能解决,这里只简单介绍一下IDEA里使用Git(jetbrains相关的产品 IntelliJ、PyCharm、WebStorm等操作方式基本相同)
4.1、常规代码pull、push操作
Git设置,正常情况安装git后,通过环境变量读取过来,不需要做什么设置,如果这个路径不对,自行选择安装的git.exe
路径
- 拉取、推送
如下截图两种方式来Pull
、Push
操作
修改文件提交
注意这里也同样选择Commit and Push...),不然只是在本地仓库提交了,没有推送到gitlab上
- 如果只是commit,再push一下,推送到gitlab
- 冲突解决
当Pull有冲突时,会弹出冲突列表,可以一一去解决,如果不需要自己的版本,选择”Accept Theirs",最好不要选择“Accept Yours"这样别人提交的在你提交后将被覆盖,”Merge..." 合并两个版本的代码
也可手工来合并:合并完删除<<<<<<< HEAD
、=======
、>>>>>>> origin/master
之类的标识
# HEAD与===之间的为本地分支版本
# === 与 origin/master为远程分支冲突的
<<<<<<< HEAD
=======
>>>>>>> origin/master
处理完选择Resolve Conflicts
进行”Merge..." ,合并完后点击“Apply",再进行提交
4.2、变更远程仓库地址
右键选择Remote...
菜单
- 直接修改URL即可
4.3、Issue修复
在开发过程中,测试出来的bug、功能优化之类提交的issues,分配到相应的开发人员,在问题解决后需要提交代码。
在这里建议修复的issue跟代码进行关联,这样在复测这问题可以查看整个问题的修复代码链路。
如下,issue在waf-web
应用中创建,目前大部分项目采用前后端分离,一个问题可能会牵涉到前后端多个应用,这时问题的修复需要多个应用来提交日志。
# 当前应用,在提交的日志后添加“#+序号”,如下格式
#18
# 其他应用,在提交的日志添加“应用编码+#+序号”,如下格式
waf-web#18
# 如果该issue在个人提交代码后,确认已经个修复,在注释中添加“fixes 应用编码+#+序号”,如下方式:
fixes #18
fixes waf-web#18
- 前端应用提交修复代码
- 后端应用提交修复代码
- gitlab上某个issue,如:
#18
就可以看到整个修复的过程
参考文档
Git-内部原理-Git-对象:https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-Git-%E5%AF%B9%E8%B1%A1
Git-分支-分支的新建与合并:https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6
Git-分支-变基:https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA