本文概要:
- git 工作流
- git 常用操作命令
- git merge VS git rebase
- 回退版本 git reset VS git revert
(1)任何新的功能(feature)或 bug 修复全都新建一个 branch 来写
(2)branch 写完后,合并到 master,然后删掉这个 branch
(1)代码分享:写完之后可以在review之后再merge到master分支
(2)一人多任务:当正在开发接到更重要的新任务时,你可以回到 master(dev) 去创建一个新的 branch 进行开发就好了。
(1)master分支作为部署分支
(2)从master分支切出dev分支,作为开发基准分支
(3)开发者从dev分支切出新的分支进行开发 => merge request 请求合并到dev分支 => review通过后,合并到dev分支 => 需要发布时,在master分支merge dev分支代码,进行发布
(4)删除已经合并的分支
单独拿出来,是为了说明为什么命令中为什么经常出现origin
# 查看仓库所有地址
git remote -v
# 增加地址/别名
git remote add 名称 地址
# 删除地址/别名
git remote remove 名称
# 通常用作代码需要推送到多个不同地址的仓库
# e.g.
# git remote add ervincheung git@github.com:ErvinCheung/iotboss.git
# git remote -v
# =>
# ervincheung git@github.com:ErvinCheung/iotboss.git (fetch)
# ervincheung git@github.com:ErvinCheung/iotboss.git (push)
# origin git@git.tajansoft.com:tajan/iotboss.git (fetch)
# origin git@git.tajansoft.com:tajan/iotboss.git (push)
我们命令中经常输入的 origin 不是固定的,而是对应不同的仓库别名。
# 创建分支; git branch feature/new_branch
git branch 名称
# 查看本地分支
git branch -l
# 查看所有分支
git branch -a
# 删除本地分支(没有被合并到 master 过的 branch 在删除时会失败,把-d换成-D可以强制删除)
git branch -d 名称
git branch -D 名称
# 删除了本地分支后,删除远程仓库分支(分支名称前需加冒号); 如: git push origin :feature/new_branch
git push origin :名称
git checkout 名称 # 切换分支
git checkout -b 名称 # 创建 + 切换分支
branch 命名:
新功能: feature/XXX
bug修复:fix/XXX
# 分支切换
git checkout dev
# 切换远程分支
git checkout origin/dev
# 基于远程分支创建本地分支,并跟踪对应来自 'origin' 的远程分支
git checkout --track origin/feature/new_branch
# 基于本地分支开出新分支
git checkout -b feature/new_branch
# 切换上一个分支
git checkout -
# 彻底丢弃某个文件的改动
git checkout -- 文件名
git checkout 文件名
# 放弃本地所有改动
git checkout .
# 显示工作区状态
git status
# 查看未提交内容的修改/单个文件的修改
git diff
git diff 文件名
# 临时存放工作目录的改动
# 查看stash保存记录 eg: stash@{0}: On dev: 测试
git stash list
# 缓存当前工作区的内容
git stash
# -a|--all: 除了未跟踪的文件,其他变动的文件都会保存
git stash save "备注名称,更改信息"
# -u|--include-untracked:包括没有添加到暂存区的文件
git stash save -u "备注名称,更改信息"
# 现在基本推荐用 push,因为有 pop,语义上和维护上更清晰
# 上面有的参数,它也有,还有-m 来备注这个 stash 的大概情况
git stash push -m "备注名称,更改信息"
git stash push -u -m "备注名称,更改信息"
# 从stash恢复代码
# pop: 取会删除对应的保存记录
# apply: 取但保留记录
git stash pop
git stash apply
git stash apply stash@{0}
git stash pop stash@{0}
# 只想删除暂存记录怎么办:
# clear : 清空所有 stash
# drop: 清除指定的 stash
git stash clear # 慎用!
git stash drop stash@{0}
# 想看 stash 做了什么改动
git stash show stash@{0}
# 添加文件内容至索引
# 提交所有变化; (旧版本的git: 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件)
git add .
# 提交所有变化
git add -A
# 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add -u
# 提交概要信息,并没有提交到远程仓库
git commit -m "xxx"
# 查看所有tag
git tag -l
# 打标签,通常用来标记发布版本,或用来触发仓库的hook, 自动部署、自动构建镜像
git tag 标签名
# e.g. git tag release-vlatest
# git tag –a release-v1.1.0 –m "1.1版本发布"
# 推送到远程仓库
git push origin release-v1.1.0
git push --tags
# 删除标签
git tag -d 标签名
# 删除标签后,更新你的远程仓库
git push origin :标签名
# 提交本地commits变动到远程仓库
git push
git push origin feature/new_branch
# -f ,强制更新,一般不用,除非你的commit顺序,tag顺序和远端不一致(也是确保不会覆盖掉别人的commits)
git push origin feature/new_branch -f
# 更安全的推送,如果远端有人提交,将推送失败
git push --force-with-lease origin feature/new_branch
# 推送tag
git push --tags
git push --tags -f
# 复制一个Repository到新Repository
git push --mirror 仓库地址
#如:
git push --mirror ssh://git@gitlab.com/donghe/demo_project.git
# 把远程仓库新的提交通过 pull指令拉取到你的本地
git pull
git pull origin feature/new_branch
# 更新仓库中所有分支的改动
git fetch
# -p, --prune 清除远程已经不存在的分支的跟踪分支
# -P, --prune-tags 清除远程不存在的本地标签,并且替换变更标签
git fetch -p
# 更新某一个远端仓库(场景一般在fork仓库)
git fetch origin
# 查看commit日志
git log
# 输出概要日志,这条命令等同于 git log --pretty=oneline --abbrev-commit
git log --oneline
# 指定最近几个提交可以带上 - + 数字
git log --oneline -5
# 提供类似 GUI 工具的 log 展示
git log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'
# 查看某个分支的log
git log -s master
git log -s origin/master
# 查看引用记录, 记录了所有行为(一定时间后git会对任何branch都追溯不到的commit进行回收,回滚操作要及时)
git reflog
# merge dev分支的代码
git merge dev
# 如果有冲突会merge失败, 这时候要手动解决冲突,重新add
git merge --continue // commit 或 git merge --continue (建议使用)
# 如果代码出现了难以抉择或者解决错误的情况,可以放弃解决冲突,取消merge
git merge --abort
# rebase dev分支的代码
git rebase dev
# 如果有冲突会rebase失败, 这时候要手动解决冲突,重新add
git rebase --continue
git rebase --abort
merge | rebase | |
---|---|---|
commit 顺序 | commit 会出现分叉,混乱,难以管理(包含别人修改) | commits 序列重新设置基础点,所有commit在一起 |
commit 个数 | 每次merge会自动新增一个commit | 不会新增commit |
冲突解决 | 只解决一次 | 可能每一个commit都要解决一次 |
协作开发 | 不需要强制push | 需要强制push,有覆盖commit风险 |
# 在当前分支挑其他分支的 commit,把那部分的变动那过来
git cherry-pick 提交号
# 支持一次性拿多个
git cherry-pick master~4 master~2
# 支持区间, 区间中间是 ..
git cherry-pick startGitSha1..endGitSha1
# --continue:继续 pick,一般有冲突解决后才需要这样
# --skip:跳过这次进入队列下一次行为
# --abort : 完全放弃 pick,恢复 pick 之前的状态
# --quit: 未冲突的自动变更,冲突的不要,退出这次 pick
# 这几个状态跟变基差不多,解决冲突继续,跳过处理,放弃这次pick,不输出错误
# 放弃本地所有修改,强制更新到远端分支最新, 使用场景: 你本地修改不需要了, 而且无法pull(比如远端commit顺序与本地不一致)
git reset --hard origin/branch
git reset --hard HEAD^ 回退到上一个版本
git reset --hard HEAD^^ 回退到上上一个版本
git reset --hard HEAD~10 往前回退10个版本
# 强制回到某一个commit
git reset --hard commit号
# 如果最后一个提交有问题, 不撤回,直接修改错误,然后使用 git commit --amend 提交修改, 会自动替换
git commit --amend -m "commit信息"
/ 回退代码到commit号
git reset commit号
# 撤销前一次commit
git revert HEAD
# 撤销前前一次commit
git revert HEAD^
# 撤销某一个commit
git revert commit号
git reset | git revert | |
---|---|---|
回退的commit | 回退的commit消失 | 回退的commit不变 |
提交 | 新提交commit需要 -f 强制提交(撤回远程commit) | 新产生一个反向修改的commit,不会影响commit顺序 |