本文概要:

  • git 工作流
  • git 常用操作命令
  • git merge VS git rebase
  • 回退版本 git reset VS git revert


1.工作流:

核心:

(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)删除已经合并的分支

2.仓库地址变动

单独拿出来,是为了说明为什么命令中为什么经常出现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 不是固定的,而是对应不同的仓库别名。

3.常规操作:

git branch

# 创建分支; 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修复:bug/XXX

git checkout

# 分支切换
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 status

git diff

# 查看未提交内容的修改/单个文件的修改
git diff
git diff 文件名

git stash

# 临时存放工作目录的改动

# 查看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 add

# 添加文件内容至索引
# 提交所有变化; (旧版本的git: 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件)
git add .
# 提交所有变化
git add -A 

# 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add -u 

git commit(git cz 代替 git commit)

# 提交概要信息,并没有提交到远程仓库
git commit -m "xxx"

git tag

# 查看所有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 :标签名

git push

# 提交本地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

git pull(实为fetch和merge的组合操作)

# 把远程仓库新的提交通过 pull指令拉取到你的本地
git pull
git pull origin feature/new_branch

git fetch

# 更新仓库中所有分支的改动
git fetch

# -p, --prune           清除远程已经不存在的分支的跟踪分支
# -P, --prune-tags      清除远程不存在的本地标签,并且替换变更标签
git fetch -p

# 更新某一个远端仓库(场景一般在fork仓库)
git fetch origin

git log

# 查看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 reflog

# 查看引用记录, 记录了所有行为(一定时间后git会对任何branch都追溯不到的commit进行回收,回滚操作要及时)
git reflog

4.进阶操作、常见问题解决

git merge && git rebase

# 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

mergerebase
commit 顺序commit 会出现分叉,混乱,难以管理(包含别人修改)commits 序列重新设置基础点,所有commit在一起
commit 个数每次merge会自动新增一个commit不会新增commit
冲突解决只解决一次可能每一个commit都要解决一次
协作开发不需要强制push需要强制push,有覆盖commit风险



git  cherry-pick

# 在当前分支挑其他分支的 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,不输出错误

git reset --hard

# 放弃本地所有修改,强制更新到远端分支最新, 使用场景: 你本地修改不需要了, 而且无法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 reset && git revert)

# 如果最后一个提交有问题, 不撤回,直接修改错误,然后使用 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 resetgit revert
回退的commit回退的commit消失回退的commit不变

新提交commit需要 -f 强制提交(撤回远程commit)新产生一个反向修改的commit,不会影响commit顺序










0条评论 顺序楼层
请先登录再回复