git及TortoiseGit的使用
一、安装git、tortoiseGit进行操作
1、客户端软件安装
git 安装略, https://gitforwindows.org/ 安装
tortoiseGit, 安装 https://tortoisegit.org/
git 安装后可以先不配置,在tortoise安装后启动配置用户名和邮箱即可
2、提交测试
代码提交(这里其实做了一台电脑两个用户的交叉测试,退出用户在乌龟上清除认证即可)
一般先进行commit,本地提交(分布式管理方式),记得选上新增、改名的文件
然后push
3、命令行git环境配置
#配置用户名:username
git config --global user.name "lzh.hns.pc"
#配置邮箱:user@email
git config --global user.name username
#配置密码
git config --global user.email user@email
#该命令会记住密码,执行一次 git pull 或 git push 等需要输入密码的命令,输入一次密码。
git config --global credential.helper store
查看配置
git config --list
附:本章节参考资料 https://blog.csdn.net/u010476739/article/details/108812522
二、git 本地管理
命令汇总
本地-》暂存区
git add xxx
git restore –staged xxx 或 * (从暂存区清除,变成无管理状态)
暂存区-》本地
git restore xxx 或 * 从暂存区还原到本地,如果遇到误删除或想重置为暂存区版本
暂存区 - 》 版本库
git commit -m “this is a message” xxx 或 * 部分提交或全部提交
版本库
git reset –hard xxxxx(7位或全称编号) 搭配 git reflog 进行版本间的穿梭,记得参数hard!
分支
git branch -v 查看分支清单
git branch xx 创建分支
git branch -d xx 删除分支
git checkout xx 切换分支
git merge xx 合并分支(目标合并到当前所在分支)
冲突处理(同一个文件多个分支都做了修改提交)
vim xxx(冲突部分会在文件里有两部分差异显示,进行手工修改、删除即可,这个操作是可选!)
git add hello.txt
git commit 注意!这里做二次确认达成合并
合并只是合并到当前分支,被合并的分支如果要达到最新也要切换过去做同样的 merge,不过此时应该无冲突,直接合并到最新!
2.1 基本操作(设置、初始化、添加、提交)
- 设置本地git用户、邮箱(一次,用于本地管理), 实际文件存储于 %userhome%/.gitconfig
# 命令一览
# 1、用户名、邮箱配置
git config --global user.name xxx
git config --global user.email xxx@xxx.com
# 2、仓库初始化、查看状态、添加到缓存区、提交代码
git init
git status
git add xxx 或 * 代表全部
git commit -m "this is a message" xxx 或 * 代表全部
- 创建独立文件夹做测试
# 创建目录并检查git状态
mkdir -p d:/test/gittest
cd d:/test/gittest
git status
#初始化本地库, 当前文件夹生成.git 文件夹
git init
# 添加文件,查看状态
touch hello.txt
git status
# 添加到暂存区
git add hello.txt
# 提交版本管理
git commit -m "first commit" hello.txt
2.2 暂存区管理(提交撤回、还原)
开发未提交阶段仅一个版本管理,就是放到暂存区,如遇到想回退、误删还原可操作
最终目的是为了一次整洁的提交!
# 命令一览
# 1、添加缓存区, 撤出缓存区
git add xxx 或 * 代表全部
git restore --staged xxx 或 *
#2、从缓存区修复本地(如遇误删除、想回退到暂存区的版本)
git restore xxx 或 *
- 提交暂存区
# 添加一个文件及文件夹(含文件)
touch test1.txt
mkdir folder1
touch folder1/test2.txt
git status
#单个提交
git add test1.txt
#全部提交
get add *
- 从暂存区撤回(部分)
git restore --staged *
- 暂存区文件修改、删除后再还原或回退
# 修改文件,查看变化
echo "hello" >> folder1/test2.txt
cat folder1/test2.txt
# 从暂存区还原文件, 查看变化
git restore folder1/test2.txt
cat folder1/test2.txt
- 暂存区文件整理后准备提交(该提交暂存的提交,该撤出暂存区的撤出)
两个文件,一个在暂存区被修改需要重新提交暂存(如果有重新add),一个没有跟踪需要删除
2.3 版本管理(提交、穿梭、回退到历史版本修改后再提交)
# 命令一览
# 1、查看概要日志、完整日志
git reflog
git log
#2、版本穿梭
git reset --hard xxxxx(7位或全称编号)
- 创建两个版本
cat hello.txt
echo "1111" >> hello.txt
git add hello.txt
git commit -m "test1 change hello.txt" hello.txt
echo "222" >> hello.txt
git add hello.txt
git commit -m "test2 change hello.txt" hello.txt
- 回滚到版本1,再回滚到最新版本2
git reflog
git reset --hard bacc4c4
cat hello.txt
回滚到版本1
git reset –hard b2c14b5
回滚到版本2
- 回滚到版本1,修改后提交成为版本3
git reset –hard bacc4c4
$ cat hello.txt
1111
$ echo “3333” >> hello.txt
$ git add hello.txt
$ git commit -m “test3 change hello.txt” hello.txt
2.4 分支常规管理(list、创建、切换、合并)
# 命令一览
# 1、查看分支、创建分支、删除
git branch -v
git branch xx
git branch -d xx
# 2、切换分支
git checkout xx
# 3、合并分支(目标合并当前所在分支)
git checkout master
git merge xx
- 查看、创建、删除分支
# 查看有多少分支,当前在那个分支
git branch -v
# 创建分支
git branch hot-fix
# 删除分支
git branch -d hot-fix
- 切换分支修改,合并到主干(主干未动,无冲突)
# 切换分支,修改文件,提交
git checkout hot-fix
echo "hot-fix1" >> hello.txt
git add hello.txt
git commit -m "branch hot-fix commit 1" hello.txt
#切换主干,合并分支
git checkout master
git merge hot-fix
切换分支、修改文件、提交,很帅,一气呵成……
注意此时reflog, head指针同时指向主干和分支,代表两个同步!
提交后,指针指向分支,主干在后
切换回主干,指针有多行,代表主干来回切换多个版本其实都是相同无变化,ID都相同!
合并分支,指针同步
2.5 分支冲突处理
2.5.1 单文件冲突(相同起点、修改了相同文件、都做了提交,等合并)
复盘:主要代码
# 切换回主干,直接合并出现报错,手工修改,提交暂存,继续合并成功!
git checkout master
git merge hot-fix
vim xxx.txt
git add xxx.txt
git commit
#注意,这里commit没有注释,这是规则要求的,每步执行前随时可以执行git status查看提示
同一个文件,主干分支都修改提交,将分支合并到主干
# 主干修改文件、提交
linzh@DESKTOP-FC5TQ4K MINGW64 /d/test/gittest (master)
$ echo "conflict master 1" >> hello.txt
$ git add hello.txt
$ git commit -m "conflict master 1" hello.txt
# 切换分支修改,提交
linzh@DESKTOP-FC5TQ4K MINGW64 /d/test/gittest (master)
$ git checkout hot-fix
$ echo "conflict hot-fix 1" >> hello.txt
$ git add hello.txt
$ git commit -m "conflict hot-fix 1" hello.txt
# 切回主干进行合并,出现冲突,手工修复,提交合并
linzh@DESKTOP-FC5TQ4K MINGW64 /d/test/gittest (hot-fix)
$ git checkout master
$ git merge hot-fix
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
# 出现冲突手工vim修改
linzh@DESKTOP-FC5TQ4K MINGW64 /d/test/gittest (master|MERGING)
$ vim hello.txt
# 系统提醒继续合并就提交,不合并就提交缓存区做多版本并行
linzh@DESKTOP-FC5TQ4K MINGW64 /d/test/gittest (master|MERGING)
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
# 提交到暂存区,查看状态,可以继续合并了,不过命令有点特殊,不能写注释!
$ git add hello.txt
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: hello.txt
$ git commit -m "merging branch master conflict" hello.txt
fatal: cannot do a partial commit during a merge.
$ git commit
[master 4e53063] Merge branch 'hot-fix'
#分支也更新到最新
git checkout hot-fix
git merge master
2.5.2 混合操作(冲突、并行合并,协同作战常见处理!)
原理分析,分子主干并行开放旧了有四部分数据
共有部分,两边都没有修改的,保留不变
共有部分,两边都有修改提交,手工处理冲突,方案看上一章节
分支有修改或新增的部分,主干合并时直接自动合并
主干有修改或新增的部分,保留在主干,全部合并完,分支可直接操作合并进行拉取,完成两边同步
制造冲突(共有部分两边修改提交、主干新增及修改、分支新增及修改)
# 主干修改冲突文件,修改独立文件,新增独立文件
linzh@DESKTOP-FC5TQ4K MINGW64 /d/test/gittest (master)
$ echo "conflict 2 master 1" >> hello.txt
$ git add hello.txt
$ git commit hello.txt -m "conflict 2 master 1"
$ echo "conflict 2 master 1" >> test1.txt
$ git add test1.txt
$ git commit test1.txt -m "conflict 2 master 2"
$ touch master1.txt
$ git add master1.txt
$ git commit -m "conflict 2 master 3" master1.txt
# 分支修改冲突文件,修改独立文件,新增独立文件
$ git checkout hot-fix
$ echo "conflict 2 hot-fix 1" >> hello.txt
$ touch hot-fix1.txt
$ echo "conflict 2 hot-fix 1" >> folder1/test2.txt
$ git status
On branch hot-fix
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: folder1/test2.txt
modified: hello.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
hot-fix1.txt
$ git add hot-fix1.txt
$ git commit -m "conflict 2 hot-fix mix3" *
# 主干进行合并,并手工解决冲突(省略掉vim修改部分,直接执行添加缓存区、提交版本库)
$ git checkout master
$ git merge hot-fix
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
$ git add hello.txt
$ git commit
# 分支同步,两边一致(可选操作,建议执行,除非确实要一直分离,不建议)
$ git checkout hot-fix
$ git merge master
2.5.3 部分合并(不规范、建议GUI操作??)
鉴于命令行操作很麻烦,这个操作也恨不规范,不建议这么干,要么全部合并,要么在下面IDE部分来做讲解
三、git 远程团队协作
团队分工
架构师/Team Lead
1、本地创建好项目、调试OK
2、gitlab创建新项目
3、创建远程地址在本地的别名
git remote add gitlab-gittest http://192.168.20.163/linzh/gittest.git
4、关联当前分支到远程仓库(别名)及分支,此命令可重复执行,用于调整
git push –set-upstream gl-gittest master
开发工程师
- 1、克隆远端项目
- 2、创建本地/远端 同名分支,切换分支
- 3、分支上日常开发、push/pull、冲突自处理
$ git clone http://192.168.20.163/linzh/gittest.git
$ cd gittest/
$ git branch hot-fix
$ git checkout hot-fix
$ git branch --set-upstream-to=origin/hot-fix hot-fix
$ git pull
$ git push
版本管理员
- 同开发工程师,增加以下内容
- 1、调整角色为maintainers 维护组
- 2、拉取主干、分支代码到本地
- 3、做分支合并,再提交到远端
发布管理员
- 同开发工程师,增加以下工作
- 1、低风险环境配置钩子自动化发布,如开发、测试
- 2、高风险环境进行手工灰度、一键部署并做好备份!
3.1 架构师/管理员,项目创建
远程协作(提交、拉取、合并、强制提交、强制覆盖)
创建远程项目
- 查看远程路径的别名清单、改名、删除
linzh@DESKTOP-FC5TQ4K MINGW64 /d/test/gittest (master)
$ git branch -v
hot-fix c1a75af Merge branch 'hot-fix'
master c1a75af Merge branch 'hot-fix'
# 添加别名
git remote add gitlab-gittest http://192.168.20.163/linzh/gittest.git
$ git remote -v
gitlab-gittest http://192.168.20.163/linzh/gittest.git (fetch)
gitlab-gittest http://192.168.20.163/linzh/gittest.git (push)
# 改名、删除
$ git remote rename gitlab-gittest gl-gittest
$ git remote remove gl-gittest
- 提交分支要远程节点(首次提交容易成功,建议首次是远程创建项目后,马上本地提交,远程任何文件不要自动生成,包括readme.md)
- 创建项目
# 直接git push gb-gittest 报错,按提示操作,文件上传成功
$ git push gl-gittest
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream gl-gittest master
git push --set-upstream gl-gittest master
3.2 开发成员,建立同步环境
成员拉取镜像,编辑提交
邀请成员
可以管理员搜索成员邮箱、账号进行邀请, Project Information==>member下
可以成员搜索到项目,在项目首页点击 request accest
# 成员2拉取
……新建文件夹略过,进入文件夹后
$ git clone http://192.168.20.163/linzh/gittest.git
Cloning into 'gittest'...
remote: Enumerating objects: 58, done.
remote: Counting objects: 100% (58/58), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 58 (delta 14), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (58/58), done.
$ cd gittest/
# 出现403权限不足需要找管理员授权
$ git push
remote: You are not allowed to push code to this project.
fatal: unable to access 'http://192.168.20.163/linzh/gittest.git/': The requested URL returned error: 403
# 授权成功后的提醒
$ git push
Everything up-to-date
# 不过提交新内容还是会报错,因为master分支默认不允许被修改提交,
$ echo "lintest1" >> hello.txt
$ git add hello.txt
$ git commit hello.txt -m "lintest1"
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 289 bytes | 289.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: GitLab: You are not allowed to push code to protected branches on this project.
To http://192.168.20.163/linzh/gittest.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://192.168.20.163/linzh/gittest.git'
团员正确拉取方式(事先已加入团队,作为developer角色)
先clone,创建与远程相同的分支名,关联远程分支
日常拉取、修改、提交、冲突处理即可
# clone到本地
$ git clone http://192.168.20.163/linzh/gittest.git
Cloning into 'gittest'...
remote: Enumerating objects: 58, done.
remote: Counting objects: 100% (58/58), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 58 (delta 14), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (58/58), done.
$ cd gittest/
# 此时已经建立默认远程别名origin
$ git remote -v
origin http://192.168.20.163/linzh/gittest.git (fetch)
origin http://192.168.20.163/linzh/gittest.git (push)
# 创建本地同名分支,切换分支,与远程建立关联关系
$ git branch hot-fix
$ git checkout hot-fix
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> hot-fix
$ git branch --set-upstream-to=origin/hot-fix hot-fix
$ git pull
Already up to date.
# 尝试将本地提交的内容发送到远端, OK!!!
$ echo "lintest 2" >> hello.txt
$ git add hello.txt
$ git commit hello.txt -m "lintest 2"
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 290 bytes | 290.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote:
remote: To create a merge request for hot-fix, visit:
remote: http://192.168.20.163/linzh/gittest/-/merge_requests/new?merge_request%5Bsource_branch%5D=hot-fix
remote:
To http://192.168.20.163/linzh/gittest.git
1775cbe..a487dc0 hot-fix -> hot-fix
3.3 版本管理员,日常更新、合并分支
# 常规合并分支, 参考第二章节的分支冲突处理
……
git merge XXX
……
# 远程分支关联后,提交就是了,拉取把push换pull即可
git push --set-upstream nickname branch
git push
- 如果分支需要协作,则提交远端,其他成员拉回来协同
# 切换分支,关联远程节点,新增分支,不直接关联master
$ git checkout hot-fix
$ git push --set-upstream gl-gittest hot-fix
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for hot-fix, visit:
remote: http://192.168.20.163/linzh/gittest/-/merge_requests/new?merge_request%5Bsource_branch%5D=hot-fix
remote:
To http://192.168.20.163/linzh/gittest.git
* [new branch] hot-fix -> hot-fix
Branch 'hot-fix' set up to track remote branch 'hot-fix' from 'gl-gittest'.
3.4 发布管理员,自动化发布&灰度一键发布???
九、git使用规范
用好暂存区,避免低效反复提交!
master主干用于仅限于维护组,不允许提交合并!
开发统一另建分支,如develop
用好分支,最终都要合并,没有合并就另起项目!
分支合并、版本发布建议处理milestone,建立Tag?
同一团队,需求确实有需要,就创建分支提交远端进行协同
日常合并本地处理,主干、分支提交gitlab,大量文件远端合并不好调试!
跨团队,建议从github、gitee走clone+pull request流
评论系统未开启,无法评论!