在多人协作开发中,git分支操作的运用比较多,总结一下,
一般分支需要在主分支上切一个本地分支出来,然后有修改再合并到主分支上
如果有次修改在主分支上修改,但是主分支已经有同事推送新code。可以先git add .
再git pull,
这时候就会有很多更新,git push 远程分支是不行的,会提示冲突,这时可以新建一个本地分支出去
git branch V1.1
git add .
git commit -m "1、新的修改"
git push origin V1.1
这时候最新的修改已经推送至你分支,接下来要做的是要把你新的修改合并到主分支上
git merge:默认情况下,Git执行"快进式合并"(fast-farward merge),会直接将Master分支指向Develop分支。
使用--no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,建议采用这种方法。
再合并bBranch分支,产生冲突:
git merge --no-ff V1.1
git branch -a //查看所有本地分支和远程分支
git checkout V1.2 //切换至主分支
git merge V1.1 //把分支上的code合并至主分支
这时候已经把分支上的修改同步至本地主分支,执行git push origin V1.2推送至远程主分支,发现可能不行。因为有可能和同事的code有冲突。
冲突如下:
这时候需要处理一下冲突再重新提交
注:简单方法,使用vim修改,cat查看冲突文件。(注意要删除git自动生成的冲突代码分隔符)也可以用以下方法:
git diff //对比一下冲突
++<<<<<<< HEAD
+ govee_device_service_start();
+
++=======
+
++>>>>>>> f992d4b133ac282f043a552fa06547e715ed4691
HEAD是你修改的code,=======以下就是你同事同样的地方修改的code,对比一下删掉哪个code。然后如下就好了。
git add .
git commmit -m "修改冲突"
git push origin V1.2
git log --graph //查看分支结构
git log ----pretty=oneline
注:提交或者合并都会生成git节点。每个节点对应一个代码版本。
如果要把远程分支同步到开发分支上也是一样的道理,只是步骤相反
第一步:切换到本地的仓库,更新为最新的代码。
第二步:切换到要同步的子分支上。
第三步:在子分支上运行 git merge master 就会将主分支的代码同步到子分支上。
第四步:在子分支查看当前的代码状态 git status
第五步:git add . 将代码添加到本地仓库
第六步:git commit -m '主分支同步到子分支'
第七步:git push 将同步后的代码上传到git 服务器上托管。
最后需要把本地分支和远程分支关联:
git branch --set-upstream-to origin/newName
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
创建分支 :git branch [branchname]
需要注意,创建分支时,不会有什么提示。
查看全部分支(包含本地和远程) :git branch -a
根据指定版本号创建分支: git checkout -b branchName commitId
清理本地无效分支(远程已删除本地没删除的分支): git fetch -p
如果分支太多,还可以用此命令进行分支模糊查找: git branch | grep 'branchName'
删除远程分支: git push origin --delete [branchname]
删除本地已合并的分支: git branch -d [branchname]
某些情况下可以用 git branch -D [branchName]
(使用时应注意是否已合并)
1. 本地分支重命名(还未推送到服务器)
git branch -m oldBranchName newBranchName
2. 远程分支重命名 (已经推送远程-假设本地分支和远程对应分支名称相同)
a. 重命名远程分支对应的本地分支
git branch -m oldBranchName newBranchName
b. 删除远程分支
git push --delete origin oldBranchName
c. 上传新命名的本地分支
git push origin newBranchName
d.把修改后的本地分支与远程分支关联
git branch --set-upstream-to origin/newBranchName
c、d可以合并为
git push -u origin newBranchName
本地tag:
git tag TAG_NAME
tag推送远程:
git push origin TAG_NAME
这样别人同步了你的code会同时同步你的tag
要删除掉你本地仓库上的标签,可以使用命令 git tag -d
。 例如,可以使用以下命令删除一个轻量标签:
$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)
注意上述命令并不会从任何远程仓库中移除这个标签,你必须用 git push
来更新你的远程仓库:
第一种变体是 git push
:
$ git push origin :refs/tags/v1.4-lw
To /[email protected]:schacon/simplegit.git
- [deleted] v1.4-lw
上面这种操作的含义是,将冒号前面的空值推送到远程标签名,从而高效地删除它。
第二种更直观的删除远程标签的方式是:
$ git push origin --delete
避免每次推送需要输入账号密码:以下解释为git官方解释
//如果不想在每一次推送时都输入用户名与密码,你可以设置一个 “credential cache”。 最简单的方式就是将其保存在内存中几分钟,可以简单地运行 git config --global credential.helper cache 来设置它
it config --global credential.helper cache
或
git config --global credential.helper store
之后你输入一次会在你本地创建一个文本,每次需要提交会从文本中验证。
撤销或修改commit:
已经打上标记,但是没有推送远程分支,想撤销标记commit
git reset --soft HEAD^
这样可以重新commit
如果想撤销add,也就是撤销本地仓库的添加记录:
git reset --hard HEAD^ //删除工作空间的改动代码
HEAD^或者HEAD~1表示上一个推送标记(commit),如果两次,就是HEAD~2
修改commit不撤销可使用如下命令进入VIM编辑器修改:
git commit --amend
误删了操作可以用这个命令查看操作过的记录
$ git reflog --date=iso
然后用git reset --hard [操作前面的ID]
就可以返回到误删的代码head
Git stash 如果想把修改的代码不想推送但是又想暂时切换到其他分支查看情况,把代码暂存到本地仓库,可以切换其他分支查看。
需要复原时,切换至原来分支,使用git stash pop之前修改的代码已经复原
格式:type(scope) : subject
1. type 类型
( 1 ) type(必须 ):
commit 的类别,只允许使用下面几个标识:
perf : 性能优化
refactor : 某个已有功能重构
docs : 文档改变
fix: 修复bug
feat:新功能(feature)
update: 更新
style : 代码格式改变
test: 增加测试代码
revert: 撤销上一次的commit
chore : 构建过程或辅助工具的变动
build: 构建工具或构建过程等的变动,如:gulp 换成了 webpack,webpack 升级等
( 2 ) scope(可选):
用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同
( 3 ) subject(必须):
commit 的简短描述,不超过50个字符。
commitizen 是一个撰写合格 Commit message 的工具,
遵循 Angular 的提交规范。
不超过50个字符。
推荐以动词开头,如: 设置、修改、增加、删减、撤销等
git仓库转移到新地方
git remote -v 查看原来仓库位置
重定向新位置:
git remote set-url origin [email protected]:xxx/xxx.git
or
git remote set-url origin http://gitlab.xxxxx.com/xxx/xxx.git
git submodule init用来初始化本地配置文件
而git submodule update则从该项目中抓取所有数据并检出父项目中列出的合适的提交。
不过还有更简单一点的方式。如果给git clone指令传递--recurse-submodules选项,它会自动初始化并存储更新中的每一个子模块,包括可能的指令存在子模块。git clone --recurse-submodules https://gitee.com/XXXXXXXXXX.git
一次最好推送一个功能代码,好回溯
带上标识也就是commit规范
不要推送编译不过的代码
不要一次性推送许多代码
Commit写清楚推送内容,不超过50个词
每个版本需要打一个tag并且推送到远程生成记录
不管多人协作还是个人开发都习惯用分支开发,之后推送到master分支
忽略掉编译生成的文件,只记录代码
代码最好有改动就提交的习惯
多人协作情况下不要推送一些刷屏的打印代码
不要在远程分支上面做开发
非必要不要强制本地覆盖远程!!!除非你知道自己在做什么且有保险
忽略掉一些不想上传的文件,一般为忽略文件路径加文件尾缀
*.a
*.o
*.d
*.bin
*.elf
*.hex
*.map
*.TMP
*.axf
*.lst
*.objdump
*.img
*.xz
/project/XR806.si4project/
.project.ld
.image.cfg
include/generated/*
include/config/*
/project/*/gcc/*.iex
/project/*/gcc/*.dep
/project/*/gcc/*.build_log.htm
/project/*/gcc/mdk_debug/*.uvguix.*
/out/*
**/.config
**/.config.old
tools/settings_win.ini
tools/config/mconf
tools/config/conf
!/bin/xradio_*/**/*
!/lib/xradio_*/**/*
!/lib/libaac.a
!/lib/libadt.a
!/lib/libairkiss_aes.a
!/lib/libamr.a
!/lib/libamren.a
!/lib/libcedarx.a
!/lib/libeq.a
!/lib/libdrc.a
!/lib/libhostapd.a
!/lib/libmp3.a
!/lib/libopus.a
!/lib/libspeex.a
!/lib/libnet80211.a
!/lib/libreverb.a
!/lib/libsc_assistant.a
!/lib/libsecureboot.a
!/lib/libwav.a
!/lib/libwpa.a
!/lib/libwpas.a
!/lib/libwpas_wps.a
!/lib/libzbar.a
!/lib/libwatchpoint.a