参考 Gitlab flow,这里以开发新功能为例

  1. feature 分支必须(MUST)以 master 主分支最新代码为基线创建(换句话说,就是临时分支的根源必须是 master 主分支。如下这种方式也是可以的:从 master 创建了 feature/a,然后又从 feature/a 创建了 feature/b,注意合并顺序)
  2. 建议(RECOMMENDED)将本地 feature 分支推至远端
  3. 在 feature 分支进行功能开发、编码
  4. 提交 commit
  5. 使用 git merge —no-ff 将 feature 分支合并进 develop 分支
  6. 在 develop 分支自测、联调(若有 bug,回到步骤 3)
  7. 使用 git merge —no-ff 将 feature 分支合并进 test 分支
  8. 在 test 分支提测(若有 bug,回到步骤 3)
  9. 将 master 的最新代码同步至 feature 分支(若为公共分支,使用 git merge —no-ff;若为个人分支,使用 git rebase -i master)
  10. 将 feature 分支合并进 master(在符合 commit message 规范 的前提下,应该使用 git merge —squash;否则使用 git merge —no-ff)
  11. 使用 master 分支进行上线
  12. 删除本地及远端的 feature 分支

git merge —no-ff

git rebase -i master

rebase之前确保 基分支 是最新代码

git merge —squash

--squash选项的含义是:本地文件内容与不使用该选项的合并结果相同,但是不提交、不移动HEAD,因此需要一条额外的commit命令。其效果相当于将another分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来。

判断是否使用--squash选项最根本的标准是,待合并分支上的历史是否有意义。

如果在开发分支上提交非常随意,甚至写成微博体,那么一定要使用--squash选项。版本历史记录的应该是代码的发展,而不是开发者在编码时的活动。

只有在开发分支上每个commit都有其独自存在的意义,并且能够编译通过的情况下(能够通过测试就更完美了),才应该选择缺省的合并方式来保留commit历史。

git 撤销操作

如果不小心git commit 了的话

  1. git reset --soft HEAD^
  2. //或者
  3. git reset --soft HEAD1
  4. // 如果进行两次的commit,想要都撤回
  5. git reset --soft HEAD2
  6. // 修改注释
  7. git commit --amend

—soft 不删除工作空间的改动代码 ,撤销commit,不撤销git add file —hard 删除工作空间的改动代码,撤销commit且撤销add

git log

  1. // 列举几个常用的 log 参数
  2. // 输出 log 的首行
  3. git log --pretty=oneline
  4. // 只输出首行的 commit 信息。不包含 hash 和 合并信息等
  5. git log --pretty=format:%s
  6. // 查找有关“更新菜单配置项”的提交
  7. git log --grep="更新菜单配置项"
  8. // 打印出 chenfangxu 的提交
  9. git log --author=chenfangxu
  10. // 红色的短 hash,黄色的 ref , 绿色的相对时间
  11. git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'

删除分支

  1. // 删除本地分支
  2. // 先查看所有分支, 输入q退出
  3. git branch -a
  4. // 先切换到其他分支,再删除
  5. git checkout master
  6. git branch -D XXX
  7. // 如果发现删错了本地分支,可以直接checkout 恢复
  8. git checkout XXX
  9. // 删除远端分支
  10. git push origin --delete XXX

git rebase

在目标分支

合子分支, 步骤

  1. git pull
  2. git merge feature/xxx
  3. git push

    在子分支

    拉目标分支最新代码,首先要切换到目标分支

  4. git checkout master

  5. git pull
  6. git chekout feature/xxx
  7. git pull
  8. git rebase master
  9. git pull
  10. git push

有冲突则解决冲突

git 常用命令

开发任何一个页面/活动,最好都是从master分支上新建个人分支,合并到dev分支

git 初始化

  1. // 1,生成ssh key
  2. cd ~/.ssh/
  3. ssh-keygen -t rsa -C "公司开发邮箱"
  4. // 复制 id_rsa.pub 里的内容到 gitlab或github上去
  5. // 设置用户名和密码
  6. git config --global user.name "name" | 设置用户名
  7. git config --global user.email "eamil" | 设置用户邮箱
  8. // 2, clone 项目,新建分支
  9. git clone git@XXX
  10. // 一般默认是master, 先新建自己的分支
  11. git checkout -b XXX

git 提交

  1. // 3,提交代码
  2. git add .
  3. git commmit -m "xxx"
  4. git push
  5. // 然后会提示输入
  6. // git push --set-upstream origin XXX
  7. // 输入就行
  8. git push --set-upstream origin XXX

git 分支

  1. // 4, 合并分支
  2. // 首先,把想要合并的目的分支拉到本地
  3. git status
  4. git checkout -b test origin/test
  5. // 在任何分支,有合并操作前,一定一定一定 要先 git pull 拉去最新代码
  6. git pull
  7. // 把XXX分支合并到test分支
  8. git merge XXX
  9. // 5,推送到远端
  10. git push origin test
  11. // 6, 删除本地分支
  12. // 先查看所有分支, 输入q退出
  13. git branch -a
  14. // 先切换到其他分支,再删除
  15. git checkout develop
  16. git branch -d XXX
  17. // 7, 删除远端分支
  18. git push origin --delete XXX

git stash

  1. // 9.1 如果在a分支上开发,突然b分支有一个紧急bug需要修复,这个时候需要
  2. git stash save "备注名"
  3. git checkout b // 修复完成之后
  4. git checkout a
  5. git stash list // 查看
  6. git stash show stash@{n} // 查看n里面的内容
  7. git stash pop // 应用最新的一个stash,并删除它的备份
  8. git status apply stash@{n} // 应用,但不删除备份 git stash list 仍然可以读取到
  9. git stash drop // 默认删除最新的一个
  10. git stash drop stash@{n} // 删除stash@{n}

解决冲突

  1. // 8,查看命令历史,日志 q 退出
  2. git log --oneline
  3. // 10, 解决冲突
  4. // 10.1 在本地分支,提交前一定要git pull 一下
  5. // 在目标分支,merge之后,出现冲突,找到冲突文件,然后解决冲突,在冲突行,先复制自己的修改内容,再选择使用他人的修改,然后把自己的修改粘贴在后面
  6. // 向master提merge request 出现冲突,解决方案,先切换到master分支,git pull
  7. 然后切回自己的分支,git pull, git merge master, 解决冲突之后,再提merge request