Write By CS逍遥剑仙
我的主页: www.csxiaoyao.com
GitHub: github.com/csxiaoyaojianxian
Email: [email protected]
$ git branch # git branch -v
$ git branch [branch name] # 从当前分支新建分支
$ git checkout [branch name] # git switch [branch name]
# 创建 + 切换分支
$ git checkout -b [branch name] # git switch -c [branch name]
# 切换到之前的分支
$ git checkout -
$ git branch -d [branch name]
# 强行删除未合并分支 (会丢失未合并分支修改)
$ git branch -D [branch name]
merge 分支合并有 fast-forward
和 no-fast-forward
两种模式。下图 dev 合入 master,默认触发快进模式(fast-forward),因为只需要修改指针即可实现合并;而普通模式(no-fast-forward)需要生成一个新的commit,因此即使 dev 分支删除,也能从 master 分支历史上看出分支合并信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXAFekPT-1591542278830)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/3-01.png)]
# 查看分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
合并分支时 git 默认会优先用 fast forward
快进模式。
# 合并某分支到当前分支,默认 git merge --ff [待合入分支]
$ git merge dev
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCujiEXb-1591542278833)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/gif/fast-forward.gif)]
# 添加 --no-ff 参数禁用 fast forward 改为普通模式合并保留合并历史
$ git merge --no-ff -m "merge with no-ff" dev # 可以通过 -m 填写新 commit 信息
# 方案1:全局设置禁用 fast-forward
$ git config --global --add merge.ff false
# 方案2:某个分支单独禁用 fast-forward
$ git config branch.[branch name].mergeoptions "--no-ff"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VsmJqh3j-1591542278838)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/gif/no-fast-forward.gif)]
# 若出现冲突,需要在文件中解决冲突,然后添加提交
# ...
$ git add [file name]
$ git commit -m "some message" # 注意:此时 commit 不能加具体文件名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gyXsmzbz-1591542278845)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/gif/merge-conflict.gif)]
rebase 操作可以通过复制提交记录,改变本地未 push 的分叉提交历史所基于的 commit,并整理成直线,使得查看历史提交的变化时更直观,缺点是本地的分叉提交会被修改。
# 将当前 dev 分支修改合并到 master 分支
$ git rebase master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-op4Ah6sZ-1591542278847)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/gif/rebase.gif)]
关于交互式变基修改 commit (commit合并、顺序调整、提交日志修改) 等可以参考 https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1
对于工作区中未开发完无法 add / commit 的内容,可以先 stash 起来,切换到其他分支,后面再切回来恢复。
$ git stash # 此时 git status,工作区是干净的,可以切换到其他分支
工作区的恢复有两种方式:
# 首先查看stash列表
$ git stash list
# stash@{0}: WIP on dev: xxxxxx
方式1:使用 git stash pop
恢复,同时删除 stash 内容:
$ git stash pop
方式2:使用 git stash apply
恢复,删除需要额外使用 git stash drop
来删除:
$ git stash apply stash@{0}
$ git stash drop stash@{0}
有一种场景,如 BUG 修复,在 dev 分支上修复并提交,需要同样在 master 上修改,但是却不能直接合并 dev 分支,因为只需要复制其中某一个 commit,使用 cherry-pick
命令,即可复制一个特定的提交到当前分支并生成一次新的提交,避免了在 master 分支再修复一次。
# 在 master 分支执行 cherry-pick,将指定提交作为新提交添加到 master
$ git cherry-pick [提交索引]
如下图,dev 分支上的 76d12 提交添加了 index.js 文件,使用 cherry-pick 将本次提交更改加入到 master 分支。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LovsKl2N-1591542278849)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/gif/cherry-pick.gif)]
多人协作分为团队内部协作和跨团队协作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ioPpbqVN-1591542278849)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/3-02.png)]
# 在用户主目录~找到.ssh目录,有id_rsa和id_rsa.pub两个文件
$ cd ~
# 创建 SSH Key
$ ssh-keygen -t rsa -C "[email protected]"
# 登录远程库,如GitHub,Add SSH Key,粘贴id_rsa.pub文件内容
$ cd .ssh
$ cat id_rsa.pub
# 查看远程库信息
$ git remote
# or
$ git remote -v
# 创建远程库地址别名,远程库的名字默认是 origin,可以修改
# git remote add [别名] [远程地址]
$ git remote add origin [email protected]:csxiaoyaojianxian/test.git
# clone 过程完成了远程库下载到本地、创建 origin 远程地址别名、初始化本地库
$ git clone [email protected]:csxiaoyaojianxian/test.git
# git支持多种协议,包括https,但ssh协议速度最快
# 本地和远程分支名最好一致
$ git checkout -b [branch name] origin/branch-name
本地库分支修改后需要使用 push 命令推送到远程库。
# git push [远程库地址别名] [本地分支名]:[远程分支名]
# 把当前分支 master 推送到远程
# 首次推送加上 -u 参数,会把本地 master 分支和远程 master 分支关联
$ git push -u origin master
# 后续推送
$ git push origin master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0O7hRPf4-1591542278850)(./pic/3-04.jpg)]
若分支 push 失败,提示远程分支比本地分支更新,则需要先更新本地,合并后再尝试 push,更新有两种方式:fetch
和 pull
。
使用 git fetch
指令可以下载远程分支上最新的修改而不影响本地分支(即HEAD指针位置未改变),需要 git merge
手动合并;使用 git pull
指令可以下载远程分支上最新的修改并与本地合并。
# git fetch [远程库地址别名] [远程分支名]:[本地分支名(不存在自动创建,可省略表示与远程一致)]
# 仅拉取远程库更新,不更改本地工作区文件
$ git fetch origin master
# 可以查看远程文件
$ git checkout origin/master
# 查看完后决定合并远程 master 到本地 master 分支,git merge [远程库地址别名/远程分支名]
$ git merge origin/master
还可以 fetch 到一个临时新分支进行安全合并:
# 将远程 origin 仓库的 master 分支代码下载到本地新建的 temp 分支
$ git fetch origin master:temp
# 比较本地代码与刚下载的远程代码的区别
$ git diff temp
# 合并 temp 分支到本地 master分支
$ git merge temp
# 删除临时的 temp 分支
$ git branch -d temp
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lhJSmA0X-1591542278851)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/gif/fetch.gif)]
# pull = fetch + merge
# git pull [远程库地址别名] [远程分支名]:[本地分支名(不存在自动创建,可省略表示与远程一致)]
$ git pull
# 若提示 no tracking information,可建立本地分支和远程分支的关联
$ git branch --set-upstream-to <branch-name> origin/<branch-name>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MC0zU3gs-1591542278852)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/gif/pull.gif)]
跨团队协作需要使用 Fork / Pull request 的方式,需要在远程库管理端界面操作。
master:主干分支
hotfix:bug 修理分支
release:预发布分支
develop:开发分支
feature:功能分支
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGFCylNr-1591542278853)(https://raw.githubusercontent.com/csxiaoyaojianxian/ImageHosting/master/blog/125/3-05.png)]
参考:
https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1
https://dev.to/maxpou/git-cheat-sheet-advanced-3a17
https://gitee.com/liaoxuefeng/learn-java/raw/master/teach/git-cheatsheet.pdf
https://juejin.im/post/5e9e49356fb9a03c917fe7fd
https://www.liaoxuefeng.com/wiki/896043488029600