Git安装、配置、使用、常见问题汇总、gitflow版本管理、gitlab搭建、CICD

2021/03/02

Git安装、配置、使用、常见问题汇总、gitflow版本管理、gitlab搭建、CICD

参考资料

一、git基础使用

Git 是一个开源的分布式版本控制系统

1.windows环境下载、安装

https://git-scm.com/download

2.linux安装git

$sudo apt-get install git
$git --version

3.Git Bash基本操作:克隆、切分支、日志查看、拉取、提交、推送

配置账号信息:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"` 

基本操作:

git clone -b dev http://gitlab.xxx.com/root/xxx.git  //克隆Dev分支代码
git checkout -b dev //切换dev分支,同时本地分支新增检出dev分支
git checkout -b v0.9 origin/v0.9 //拉取远端 origin/v0.9,本地新增v0.9 ,并切换至v0.9
git log //查看提交记录
git branch //查看本地分支
git branch -a  //查看所有的分支
git branch -r  //查看远程所有分支
git pull //拉取远程代码并合并
git fetch  //相当于是从远程获取最新版本到本地,不会自动merge
git status //查看当前状态
git checkout . //本地所有修改的。没有的提交的,都返回到原来的状态,‘.’前面有空格
git add .  //添加所有改动文件
git commit -a -m"commit message"  //提交到本地
git push  //将本地分支推送到服务器上去。
git pull出错回滚
    1.git log 查看要回滚的版本
    2.git reset --hard "commit Id"

4.生成SSH key以及免密设置

生成SSH key以及免密设置
创建 SSH Keys

5.TortoiseGit 安装 配置

1.下载:
https://tortoisegit.org/download/
TortoiseGit下载页面: http://download.tortoisegit.org/tgit/

2.安装:
TortoiseGit使用需要依赖Git基础环境,所以首先安装Git基础环境。

3.配置Git.exe:
TortoiseGit-> settings-> General-> Git.exe path 选择Git.exe安装目录

4.TortoiseGit记住账号密码

1.TortoiseGit-> settings-> git-> global 设置name、email
或者在C:\Users\username下面,有一个.gitconfig文件,这个是记录git配置信息的。在该文件内容后面加上
[user]
	name = xx
	email = xx@xx.com

2.编辑.gitconfig 添加 
[credential]
    helper = store

3.检出项目,输入git用户名、密码,会在目录下面生成.git-credentials文件,文件明文记了输入的账号密码,后续操作不在需要输入
https://username:password@github.com

5.TortoiseGit配置ssh key
https://www.cnblogs.com/dongguangming/p/13900081.html
TortoiseGit配置GitHub账号的SSH keys
GIT TortoiseGIT中怎么配置SSHKey

1.TortoiseGit -> PuttyGen ->Generate //生成过程中空白处晃动鼠标,生成后窗口先留着不关闭。

2.github-> setting-> SSH and GPG keys-> 添加生成的key

3.回到TortoiseGit Generate 界面-> Save private key: private.ppk

4.点击“Save public key”保存为authorized_keys文件(无扩展名)

5.配置SSH登录密钥: TortoiseGit-> Pageant-> Add key->选中之前配置生成的密钥文件(private.ppk)

6.分支合并、撤销、回滚版本、修改commit msg等操作

  • 1.merger分支
    • 切换至master分支,更新代码至最新
    • merger,from哪个分支,如有冲突解决冲突,commit,push,没有冲突直接commit,push
  • 2.只合并某个分支上的某次修改commit到指定的分支上.
    • 使用git log 查看提交的信息,记住commit id. 只需要将62ecb3,合并到master,而不合并其他commit
    • git checkout master
    • git cherry-pick 62ecb3,62ecb3 就被合并到master分支
  • 3.撤销未提交删除操作: Revert
  • 4.回滚版本:showlog -> 选择次提交记录 -> 右键 -> Revert “**branch” to this commit
  • 5.撤销已提交(任意一次提交): …同上,revert change by this commit
  • 6.修改的commit msg是当前分支的最新的一个 commit msg
    • git commit 提交的界面,选择Amend Last Commit
    • 根据需要修改日志信息,包括commit message,日期,作者

7.问题记录

  • 1.See “git help gc” for manual housekeeping——解决办法
第一条命令是原因,第二条命令是解决办法
$ git fsck
dangling blob d9ff0aeac4aa8b4e0907daed675ebf60278bc977
dangling blob dbff2d073741f9775c815d04a3c623736af224dad
dangling blob e1ffbab1c5b985cd1cd3bc0281075ea2ed80744a
dangling blob fdff59878ccb3a75689f4acca615cfb635288774
 
$ git gc --prune=now
  • 2.git运行突然提示 Auto packing the repository in background for optimum performance 查资料,原来是自己本地一些“悬空对象”太多(git删除分支或者清空stash的时候,这些其实还没有真正删除,成为悬空对象,我们可以使用merge命令可以从中恢复一些文件)
1.输入命令:git fsck --lost-found,可以看到好多“dangling commit” 
2.清空他们:git gc --prune=now,完成
  • 3.git push error: RPC failed result=56, HTTP code = 0
error: RPC failed; result=56, HTTP code = 0
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
Everything up-to-date

通过设置Git的http缓存大小,解决了这个问题,在当前工程目录下运行如下命令:
git config --global http.postBuffer 20M
  • 4.github访问龟速 :获取、配置github hosts
1.访问:https://www.ipaddress.com/
2.搜索:github.com  //得到ip
3.搜索:github.global.ssl.fastly.net  //得到ip  
4.修改hosts: C:\Windows\System32\drivers\etc\hosts 
199.232.69.194 github.global.ssl.fastly.net
140.82.114.4 github.com

或者访问此链接直接下载hosts,https://cdn.jsdelivr.net/gh/521xueweihan/GitHub520@main/hosts

PS:修改hosts时,先修改文件权限,或者桌面新建hosts文件,编辑后复制替换到C:\Windows\System32\drivers\etc下
  • 5.TortoiseGit:git pull 报错 Disconnected:No supported authentication methods available
    “ 没有支持的认证方法 ”,我们需要修改 TortoiseGit 网络的 SSH 客户端为 git 服务器的 ssh.exe (前提条件:本地必须已经安装 git 服务器)。
    解决方案:
    修改前,TortoiseGit 使用的是自己的 TortoiseGitPlink.exe 作为 SSH 客户端,鼠标右键 -> TortoiseGit -> Settings -> Network -> SSH Client 项
    修改为:Git/usr/bin/ssh.exe

git项目迁移

迁移方式一:clone ->修改remote-url ->push

https://www.cnblogs.com/shijiaoyun/p/13527036.html  
将项目从git迁移到gitlab步骤:  

第一步:克隆老项目  
git clone --mirror https://XXXX/project.git  

第二步:gitlab创建新项目 
https://gitee.com/wdsheng0i/test.git  

第二步:设置新的地址 
git remote set-url --push origin https://gitee.com/wdsheng0i/test.git  

第三步:push 
git push --mirror https://gitee.com/wdsheng0i/test.git  

第四步:让其他同事执行以下操作,将git地址更新为新的git地址、或者从新的地址重新git clone  
git remote set-url origin http://new_XXXXXX/project.git    

或者直接修改:项目xx/.git/config   
[remote "origin"]  
	url = 新地址 

迁移方式二: 通过原仓库地址、账号直接导入

.gitignore配置样例

### Java template
*.class

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff:
.idea/workspace.xml
.idea/tasks.xml
.idea/dictionaries
.idea/vcs.xml
.idea/jsLibraryMappings.xml

# Sensitive or high-churn files:
.idea/dataSources.ids
.idea/dataSources.xml
.idea/dataSources.local.xml
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml

# Gradle:
.idea/gradle.xml
.idea/

# Mongo Explorer plugin:
.idea/mongoSettings.xml

## File-based project format:
*.iws

## Plugin-specific files:

# IntelliJ
/out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

### Windows template
# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties

# ignore eclipse files
.project
.classpath
.settings
.metadata
.tern-project
.springbeans

git提交钩子设置

校验、规范提交commit message
Git Hook 插件: githook-maven-plugin, 用于提交代码前强制执行各类检查。

二、gitflow版本管理

1、背景分析

  • 问题:使用git管理代码时,都只有一个master版本,所有开发人员使用一个git来进行开发,导致开发过程中的问题凸显出来:
    • 1.合并过程中经常将别人的源码覆盖。
    • 2.版本管理混乱,每个版本都没有创建tag标记。
    • 3.没有将发布版本和开发版本区分开。
    • 4.解决现场问题时,无法快速切换到某一版本。
    • 5.提交树混乱,没有规范项目组内提交内容的格式。
  • 改进:基于上述的问题和对别的项目组的借鉴,采用git flow的开发模式。优点有下面几方面:
    • 1.基于版本开发和发布
    • 2.基于功能开发,功能之间代码互不干扰
    • 3.符合持续发布的风格

2、git flow使用规范

2.1、Git Flow常用的分支

  • master 分支 也就是我们经常使用的Master分支,这个分支最近发布到生产环境的代码,最近发布的Release, 这个分支只能从其他分支合并,不能在这个分支直接修改
  • develop 分支
    这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支
  • feature 分支
    这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release
  • release分支
    当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支
  • hotfix分支
    当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release

2.2、Gitflow分支操作

1、分支命名:Master、Develop、Feature、Release、Bugfix、Hotfix

2、研发动作:
Develop ——> Feature: 特性开发
Feature——>Develop:特性分支合并
Release——> Bugfix:Bug修复
Bugfix——>Release:Bug分支合并
Master ——> Hotfix: 补丁修复
Hotfix ——> Master: 补丁合入

合并动作均由pull request发起

2.3、产品约束

  • 为合理管理分支,所有的分支均有主程序员创建,其他程序员切换到该分支进行开发。
  • master分支分支平时处于锁定,不允许开发人员直接提交代码。
  • develop分支处于开放状态,允许小功能修改及提交。
  • 开发阶段
    • 同一时间,如果有多个功能处于开发阶段,为了减小冲突。基于功能打Feature分支,例如要开发example1和example2功能,则打两个Feature分支,名称为feature/example1和feature/example2分支,不同Feature分支中代码不能交叉提交。
  • 测试阶段
    • 当项目提交测试时,将需要这一版改造的feature合并到develop分支。
    • 如果版本要发布的功能部分完成时,在develop分支上提测。
  • 发布阶段
    • 发布阶段将release分支合并到develop和master分支上。
    • release合并到master分支时,必须增加版本号作为tag。

2.4、git commit约束

以前大家的commit message各种各样,没有统一规范 commit时,message需要清晰的描述出修改的内容,不要出现修改bug/修改等不清楚的描述。

建议参考Git commit message和工作流规范,当前产品先不做要求。

2.5、pull request & Code Review

GitHub Flow

所谓 GitHub Flow,其实也叫 Forking flow,也就是 GitHub 上的那个开发方式。

  • 每个开发人员都把“官方库”的代码 fork 到自己的代码仓库中。
  • 然后,开发人员在自己的代码仓库中做开发,想干啥干啥。
  • 因此,开发人员的代码库中,需要配两个远程仓库,一个是自己的库,一个是官方库(用户的库用于提- 交代码改动,官方库用于同步代码)。
  • 然后在本地建“功能分支”,在这个分支上做代码开发。
  • 这个功能分支被 push 到开发人员自己的代码仓库中。
  • 然后,向“官方库”发起 pull request,并做 Code Review。
  • 一旦通过,就向官方库进行合并。

这就是 GitHub 的工作流程。

如果你有“官方库”的权限,那么就可以直接在“官方库”中建功能分支开发,然后提交 pull request。通过 Code Review 后,合并进 Master 分支,而 Master 一旦有代码被合并就可以马上 release。

这是一种非常 Geek 的玩法。这需要一个自动化的 CI/CD 工具做辅助。是的,CI/CD 应该是开发中的标配了。

三、gitlab搭建

  • 《Jenkins持续集成入门到精通》-Gitlab代码托管服务器安装
  • https://blog.csdn.net/duyusean/article/details/80011540
  • https://www.jianshu.com/p/ade38a53b1ac
  • docker 部署Gitlab

问题记录:


1.如果报错了,Gitlab 默认的日志文件存放在/var/log/gitlab/reconfigure 目录下,可以看一下具体的错误信息。
ERROR: execute[semodule -i /opt/gitlab/embedded/selinux/rhel/7/gitlab-7.2.0-ssh-keygen.pp] (gitlab::selinux line 20) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '127'
---- Begin output of semodule -i /opt/gitlab/embedded/selinux/rhel/7/gitlab-7.2.0-ssh-keygen.pp ----
解决方案:sudo yum install libsemanage-static libsemanage-devel
然后重启:sudo gitlab-ctl reconfigure 
————————————————

2.The chef recipe still fails with SELinux inside of OpenVZ containers: 
Error executing action `run` on resource 'execute[semodule -i /opt/gitlab/embedded/selinux/rhel/7/gitlab-7.2.0-ssh-keygen.pp]' 
Expected process to exit with [0], but received '1'
---- Begin output of semodule -i /opt/gitlab/embedded/selinux/rhel/7/gitlab-7.2.0-ssh-keygen.pp ----
STDOUT: 
STDERR: semodule: SELinux policy is not managed or store cannot be accessed.
---- End output of semodule -i /opt/gitlab/embedded/selinux/rhel/7/gitlab-7.2.0-ssh-keygen.pp ----
Ran semodule -i /opt/gitlab/embedded/selinux/rhel/7/gitlab-7.2.0-ssh-keygen.pp returned 1 

I "fixed" this by commenting out all the lines in
/opt/gitlab/embedded/cookbooks/gitlab/recipes/selinux.rb
 
I fixed this with running this
gitlab-ctl start postgresql

Followed by this
gitlab-ctl reconfigure

3.访问502错误,内存修改为3G

4无法修改密码
.https://gitlab.com/gitlab-org/gitlab/-/issues/28294
https://www.jianshu.com/p/f9e725c44475

按照官网配置会有坑
官方详解邮件服务配置
1. 配置文件位置/etc/gitlab/gitlab.rb

以腾讯企业邮箱为例其它邮箱大同小异
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "test@qq.com"
gitlab_rails['smtp_password'] = "test123"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_domain'] = "exmail.qq.com"
gitlab_rails['gitlab_email_from'] = 'test@qq.com'
端口号实际测试是465,gitlab给出的是587

2.更新配置 gitlab-ctl reconfigure

(测试发现控制台调试第四步生效了,但是页面发送邮件并没有立即生效)

3.重启服务 gitlab-ctl restart

4.非必需步骤进入控制台gitlab-rails console (测试邮件服务是否正常)
Notify.test_email('test@qq.com','email title','email content desc').deliver_now 

四、基于gitlab CICD流程

五、问题记录

代码行数统计

个人:git log --since="2020-01-01" --before="2021-11-16" --author="wds@xxx.com" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'

总数:git log --since="2020-01-01" --before="2021-11-16" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'

Post Directory

扫码关注公众号:暂无公众号
发送 290992
即可立即永久解锁本站全部文章