GIT管理

补充:

推荐学习链接:https://git-scm.com/book/zh/v2

一 常用GIT命令

1 创建新分支(分支来源可以是另外一个分支名,或一个 tag 名称)

git branch 新分支名 分支来源

2 创建并切换到新分支(分支来源可以是另外一个分支名,或一个 tag 名称,或一个 commit id)

git checkout -b 新分支名 分支来源

3 删除分支

git branch –d 分支名

4 合并分支

先切换到合并的目的分支

git checkout dev

再将待合并分支合并到当前分支

git merge --no-ff feature-1.0.1

5 查看 commit-id(即commit 的 hash 值)

git log 或使用各种GIT GUI

6 将另外一个分支的某个 commit的 代码改动应用到当前分支

git cherry-pick commit-id

7 打 tag 标签

git tag 标签名 commit-id

8 在当前分支提取标签 tag 对应的版本

git checkout 标签名

还原指定的提交版本:git revert -m 【要撤销的那条merge线的编号,通常从1开始计算】 【merge前的版本号】,如:git revert -m 1 0a43c4cbd5e0beeae1645b1fbf8b401db4b645d3

推送还原后的代码到GIT中央仓库:git push

撤销已还原的提交:git revert 【方法二撤销 merge 时提交的 commit 的版本号,这里是 0a43c4cbd5e0beeae1645b1fbf8b401db4b645d3 】

9 revert & reset(很重要的两个操作)

 备注:个人认为,日常工作可以使用 TortoiseGit 代替使用命令。

二 分支权限分配

将 GIT 中央仓库的 dev 分支设成 default 分支,dev 分支和 master 分支设置为 protected 分支。

每个部门指定一或两个同事为 master 角色,其他成员可给予 developer 角色。

developer 角色:

feature 和 release分支为 public 分支,由 developer 维护。

master 角色:

负责 dev 分支跟 master 分支的合并等操作;

提测,上预发布,上线前,版本分支指定人对 feature, dev, release, master 分支的代码进行核对(可使用 beyond compare);

上线后,基于 master 分支打 tag;设置 feature/release/hotfix 分支 protected 分支;

需要了解各分支周期,合理分配版本号。

 三 分支策略

master 分支:用于版本发布。

dev 分支:用于做小改变提交或者从特性分支合并代码,可以方便的拉取新的提测分支。

feature 分支:开发某个改动较大的特定功能,命名规则:feature/<版本号>,如 feature/1.0.0。

release 分支:发布正式版本之前(合并到master之前),用于测试的一个较稳定版本,也是提测的版本,命名规则:release/<版本号>,如 release/1.0.0。

hotfix 分支:修复软件发布之后出现的 bug (即master分支上出现的 bug),命名规则:hotfix/<bug-id>,如hotfix/TR1234。

tag:上线后,基于master分支或 hotfix 分支打 tag ,保持跟线上代码一致。

 四 小技巧

作为 master 角色,需要合理分配版本号,尽可能地减少冲突;需要经常合并代码和对比代码,下面是一些小技巧:

1 记录各个版本的开发周期及分支情况(以下为wiki截图)

2 批处理命令(bat命令)

@echo off

:: 批量操作的模块:
:: project1
:: project2


:: 配置项
set topic=shop
set modelList=project1,project2
set urlPrefix=http://xxx/
set urlSuffix=.git
set lineSeparator=*****************************************


:: --------------------------------------------------------
@title %topic%的git命令批量操作
:: 切换到根目录
cd ../../

:begin
cls
echo 1: 显示当前分支状态
echo 2: pull到本地
echo 3: 切换分支
echo 4: 创建远程、本地分支,并切换
echo 5: clone到本地
echo 6: 查看%topic%的所有分支
echo 7: 查看%topic%的所有tag
echo 8: 基于master打tag
echo 0: 退出
echo.

set /p choice=操作: 
if %choice%==1 goto showCurrBranchStatus
if %choice%==2 goto pull2Local
if %choice%==3 goto switchBranch
if %choice%==4 goto createAndCheckoutBranch
if %choice%==5 goto clone2Local
if %choice%==6 goto showAllBranch
if %choice%==7 goto showAllTag
if %choice%==8 goto createTagBaseonMaster
if %choice%==0 (
	echo bye ~.~ 
	exit
) else (
	echo error input ~.~
)
pause
goto begin


:: --------------------------------------------------------
:showCurrBranchStatus
@echo off
set list="%modelList%"

:loop4ShowCurrBranchStatus
for /f "delims=,, tokens=1,*" %%i in (%list%) do (
	echo %%i:
	cd %%i
    git status
	cd ../
	echo %lineSeparator%
	echo.
	
    set list="%%j"
    goto loop4ShowCurrBranchStatus
)

pause
goto begin


:: --------------------------------------------------------
:pull2Local
@echo off
set list="%modelList%"

:loop4Pull2Local
for /f "delims=,, tokens=1,*" %%i in (%list%) do (
	echo %%i:
	cd %%i
    git pull
	cd ../
	echo %lineSeparator%
	echo.
	
    set list="%%j"
    goto loop4Pull2Local
)

pause
goto begin


:: --------------------------------------------------------
:switchBranch
@echo off
set /p branch=分支: 
set list="%modelList%"

:loop4SwitchBranch
for /f "delims=,, tokens=1,*" %%i in (%list%) do (
	echo %%i:
	cd %%i
    git checkout %branch%
	cd ../
	echo %lineSeparator%
	echo.
	
    set list="%%j"
    goto loop4SwitchBranch
)

pause
goto begin


:: --------------------------------------------------------
:createAndCheckoutBranch
@echo off
set /p originBranch=远程分支: 
set /p newBranch=新分支: 
set list="%modelList%"

:loop4CreateAndCheckoutBranch
for /f "delims=,, tokens=1,*" %%i in (%list%) do (
	echo %%i:
	cd %%i
	git checkout origin/%originBranch% -b %newBranch%
	git push origin %newBranch%
	git branch --set-upstream-to=origin/%newBranch%
	cd ../
	echo %lineSeparator%
	echo.
	
    set list="%%j"
    goto loop4CreateAndCheckoutBranch
)

pause
goto begin


:: --------------------------------------------------------
:clone2Local
@echo off
set list="%modelList%"

:loop4Clone2Local
for /f "delims=,, tokens=1,*" %%i in (%list%) do (
	echo %%i:
    git clone %urlPrefix%%%i%urlSuffix%
	echo %lineSeparator%
	echo.
	
    set list="%%j"
    goto loop4Clone2Local
)

pause
goto begin


:: --------------------------------------------------------
:showAllBranch
@echo off
set list="%modelList%"

:loop4ShowAllBranch
for /f "delims=,, tokens=1,*" %%i in (%list%) do (
	echo %%i:
	cd %%i
    git branch -a
	cd ../
	echo %lineSeparator%
	echo.
	
    set list="%%j"
    goto loop4ShowAllBranch
)

pause
goto begin


:: --------------------------------------------------------
:showAllTag
@echo off
set list="%modelList%"

:loop4ShowAllTag
for /f "delims=,, tokens=1,*" %%i in (%list%) do (
	echo %%i:
	cd %%i
    git tag
	cd ../
	echo %lineSeparator%
	echo.
	
    set list="%%j"
    goto loop4ShowAllTag
)

pause
goto begin


:: --------------------------------------------------------
:createTagBaseonMaster
@echo off
set list="%modelList%"
set /p tagName=tag名称: 

:loop4CreateTagBaseonMaster
for /f "delims=,, tokens=1,*" %%i in (%list%) do (
	echo %%i:
	cd %%i
    git checkout master
	git pull
	git tag %tagName%
	git push origin %tagName%
	cd ../
	echo %lineSeparator%
	echo.
	
    set list="%%j"
    goto loop4CreateTagBaseonMaster
)

pause
goto begin

  

原文地址:https://www.cnblogs.com/ken-jl/p/8371159.html