logo头像

分享技术,品味人生

git及TortoiseGit的使用

一、安装git、tortoiseGit进行操作

1、客户端软件安装

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流

评论系统未开启,无法评论!