avatar

目录
Vcs Git

本文总结版本控制工具git在日常开发工作常用到的一些命令,以及一些常用的场景应用,比如分支管理,远程管理,合并冲突处理等。后续持续更新中。

常用命令

下面的图片很清晰的说明来一些命令和各个区域的关系

img

常用
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
git remote add origin git@github.com:yeszao/dofiler.git   # 配置远程git版本库
git pull origin master # 下载代码及快速合并
git push origin master # 上传代码及快速合并
git fetch origin # 从远程库获取代码

git branch # 显示所有分支
git checkout master # 切换到master分支
git checkout -b dev # 创建并切换到dev分支
git commit -m "first version" # 提交

git status # 查看状态
git log # 查看提交历史

git config --global core.editor vim # 设置默认编辑器为vim(git默认用nano)
git config core.ignorecase false # 设置大小写敏感
git config --global user.name "YOUR NAME" # 设置用户名
git config --global user.email "YOUR EMAIL ADDRESS" # 设置邮箱
创建版本库
bash
1
2
git clone                  # 克隆远程版本库
git init # 初始化本地版本库
修改和提交
bash
1
2
3
4
5
6
7
8
9
git status                      # 查看状态
git diff # 查看变更内容
git add . # 跟踪所有改动过的文件
git add # 跟踪指定的文件
git mv # 文件改名
git rm # 删除文件
git rm --cached # 停止跟踪文件但不删除
git commit -m “commit message” # 提交所有更新过的文件
git commit --amend # 修改最后一次提交
查看提交历史
bash
1
2
3
git log                         # 查看提交历史
git log -p # 查看指定文件的提交历史
git blame # 以列表方式查看指定文件的提交历史
撤消
bash
1
2
3
4
5
git reset --hard HEAD           # 撤消工作目录中所有未提交文件的修改内容
git reset --hard # 撤销到某个特定版本
git checkout HEAD # 撤消指定的未提交文件的修改内容
git checkout -- # 同上一个命令
git revert # 撤消指定的提交
分支与标签
bash
1
2
3
4
5
6
7
8
9
10
11
git branch                      # 显示所有本地分支
git checkout # 切换到指定分支或标签
git branch # 创建新分支
git branch -d # 删除本地分支
git tag # 列出所有本地标签
git tag # 基于最新提交创建标签
git tag -a "v1.0" -m "一些说明" # -a指定标签名称,-m指定标签说明
git tag -d # 删除标签

git checkout dev # 合并特定的commit到dev分支上
git cherry-pick 62ecb3
合并与衍合
bash
1
2
3
4
git merge               # 合并指定分支到当前分支
git merge --abort # 取消当前合并,重建合并前状态
git merge dev -Xtheirs # 以合并dev分支到当前分支,有冲突则以dev分支为准
git rebase # 衍合指定分支到当前分支
远程操作
bash
1
2
3
4
5
6
7
8
9
git remote -v                   # 查看远程版本库信息
git remote show # 查看指定远程版本库信息
git remote add # 添加远程版本库
git remote remove # 删除指定的远程版本库
git fetch # 从远程库获取代码
git pull # 下载代码及快速合并
git push # 上传代码及快速合并
git push : # 删除远程分支或标签
git push --tags # 上传所有标签

Git 分支管理

本文主要分析Git Flow流程管理,参见如下图

img

git flow具体步骤如下:

  1. 代码项目会建develop/master两个分支,develop/master这两个分支不允许直接修改提交,在Git Flow 中,这两个分支至关重要,它们会贯彻整个流程始终,绝对不会被删除。只能合并,合并时会做代码审查。
  2. 代码开发或者修改bug时,以develop为基点,按功能xx 创建feature/xxx分支,测试完成后合并到develop分支
  3. 发布版本后合并release分支,并打标签,release分支从develop分支合并过来,master分支从release合并过来
  4. 线上版本出现bug时 从标签处创建hotfix分支,修改完毕后创建release标签,再合并到master和deveop分支
主分支master

master 分支时常保持着软件可以正常运行的状态。由于要维护这一状态,所以不允许开发者直接对master 分支的代码进行修改和提交。

其他分支的开发工作进展到可以发布的程度后,将会与master分支进行合并,并且这一合并只在发布成品时进行。发布时将会附加版本编号的Git标签。

开发分支develop

develop分支是开发过程中代码中心分支。与master 分支一样,这个分支也不允许开发者直接进行修改和提交。

程序员要以develop分支为起点新建feature 分支,在feature 分支中进行新功能的开发或者代码的修正。也就是说develop分支维系着开发过程中的最新代码,以便程序员创建feature分支进行自己的工作。

bash
1
2
3
4
5
6
7
git checkout -b develop master
# 切换到Master分支
git checkout master
# 对Develop分支进行合并,使用--no-ff参数后,会执行正常合并,
# 在Master分支上生成一个新节点。
# 为了保证版本演进的清晰,我们希望采用这种做法。
git merge --no-ff develop
临时分支
功能分支feature

feature 分支是为了开发某种特定功能,以develop分支为起点,是开发者直接更改代码发送提交的分支。开发完成后,要再并入Develop。它的命名,可以采用feature/的形式。开发流程:

  1. 从develop分支创建feature分支
  2. 从feature分支中实现目标功能
  3. 通过Github 向develop发送pull request
  4. 接受其他开发者审核后,将Pull Request合并至develop分支
bash
1
2
3
4
5
6
7
# 创建一个功能分支
git checkout -b feature-x develop
# 开发完成后,将功能分支合并到develop分支:
git checkout develop
git merge --no-ff feature-x
删除feature分支
git branch -d feature-x
预发布分支release

release分支是发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release/*的形式。

git-flow-release

bash
1
2
3
4
5
6
7
8
9
10
11
12
# 创建一个预发布分支
git checkout -b release-1.2 develop
# 确认没有问题后,合并到master分支:
git checkout master
git merge --no-ff release-1.2
# 对合并生成的新节点,做一个标签
git tag -a 1.2
# 再合并到develop分支
git checkout develop
git merge --no-ff release-1.2
# 最后,删除预发布分支:
git branch -d release-1.2
修补bug分支hotfix

软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用hotfix/*的形式。

git-flow-hotfix

bash
1
2
3
4
5
6
7
8
9
10
11
# 创建一个修补bug分支
git checkout -b fixbug-0.1 master
# 修补结束后,合并到master分支:
git checkout master
git merge --no-ff fixbug-0.1
git tag -a 0.1.1
# 再合并到develop分支
git checkout develop
git merge --no-ff fixbug-0.1
# 最后,删除"修补bug分支":
git branch -d fixbug-0.1

Git 远程管理

Git服务器迁移另外一台GIT服务器

前提条件:

  • first.git已存在

  • second.git 待同步仓储 第一次需初始化.

    可以在gitlab,github网页初始化,空项目,不要初始化README.md等

    可以以命令行方式初始化

bash
1
git init --bare

方式一:

bash
1
2
3
4
git clone --bare https://first.git First-Server 
cd First-Server
git add tencent https://second.git
git push tencent --all

方式二:

bash
1
2
3
git clone --bare https://first.git First-Server 
cd First-Server
git push --mirror https://second.git
SVN服务器迁移到GIT服务器

svn代码迁移到git服务器,主要用到git-svn命令

bash
1
2
3
4
5
6
7
8
9
10
11
12
# 创建user.txt 提交记录映射表
svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.* $1="/'
# 拉取svn代码
git svn clone http://svn_address --authors-file=users.txt --no-metadata -s my_project
# 如果提交记录太多,可选取最近提交记录,以下是取最近5000次
git svn clone -r5000:HEAD svn_address --authors-file=users.txt --no-metadata -s my_project
# 清理工作
cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/
rm -Rf .git/refs/remotes
# 添加git服务器地址,并上传
git remote add origin git@my-git-server:myrepository.git
git push origin --all
绑定多个服务器

方式一:git remote add

bash
1
2
3
4
git remote -v
git remote add tecent https://xxx.git
git push origin master:master
git push tecent master:master

方式二 git remote set-url

bash
1
2
3
git remote set-url --add https://xxx.git
cat .git/config
git push origin --all
切换已有仓储到另外一个git仓储
Code
1
2
git remote set-url origin https://xxx.git
git branch --set-upstream-to origin/remote_branch your_local_branch

合并冲突处理

bash
1
2
3
4
5
git merge 分支名
//有冲突的话,通过IDE解决冲突,
git status //查看状态然后再执行
git add
git commit

服务器选择

git服务器选择,如果是小团队的话,建议直接服务器安装git后,命令行直接创建,也可以选择gitlab搭建,当然如果不介意公网,想更可视化查看代码,也可以考虑一些云服务器,目前国内的码云,阿里云,腾讯云,以及国外的github等都提供免费的个人代码云仓储。

参考

推荐阅读

文章作者: laird.li
文章链接: https://lairdli.top/2019/07/09/Vcs-Git/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 黎明鸟飞去

评论