分支的定义
一个分支是git一个可移动的指针,指向某次提交。每次提交后,当前分支指针就往前挪一个,挪到最新的提交上。
HEAD 指向当前活动的分支
master 默认分支名 (git init命令 默认创建它)
常见分支指令
创建一个分支
git branch testing #创建一个新的分支,指向原来同样的提交
切换分支
git checkout testing #切换分支,底层是把HEAD指向新的分支。切换后 提交(commit) 会提交到新的分支上
git checkout -b <新分支名> #创建并切换分支
git switch testing-branch #2.23后,切换分支
git switch - #回到前一个分支#切换分支,工作目录会恢复到该分支的最后一次提交(快照内容)上。
# 作用:便于不同方向的开发#切换分支前,保持干净的状态(要保证 工作目录 和 暂存区,没有 未被提交的修改)
# 也可用 暂存(stashing)和 清理(clean)
合并分支
git checkout master #切换分支
git merge iss53 #将iss53上的修改 合并到当前分支(master)中# git merge B #即 将B合并到当前分支中
即 生成一次新提交,有两个父提交的最新的文件修改。(若最新的文件修改有冲突,需要进行冲突处理)
删除分支(带'-d' 选项)
git branch -d 要删除的分支
查看 本地和远程的分支
git branch -a# 分支前的'*':当前HEAD 所指向的分支
查看分支状态(每次分支的最后一次提交)
git branch -v
查看合并/未合并的分支
git branch --merged #已合并的分支
git branch --no-merged #查看未合并工作的分支。用-d选项删除会失效。可以用-D选项强制删除
远程分支
是本地特殊的的分支,与远程仓库保持一致,不能被手工移动,即不能再远程分支上做提交。通常,用于远程分支的移动/同步。
git fetch 远程分支名 #拉取远程的分支内容到本地
删除远程分支
git push origin --delete [branch_name]
rebase
git checkout experiment #切换到e分支
git rebase master #修改冲突文件git checkout master #需要切换到当前执行rebase的分支,用其进行提交
git merge experiment #合并
每次提交都是一个快照,两个快照不出现冲突时,快照的关联关系是可以改变的。
适用于:本地的分支合并
当出现冲突(修改相同文件),冲突处理方式与merge相同。
但其如果出现冲突,必须使用当前执行rebase分支的提交,否则会引起后续的一系列冲突。
其他命令
git log 查看分叉历史
git log --oneline --decorate --graph --all 输出提交历史、各分支指向、项目分叉情况
分支的创建和销毁异常高效,因为创建一个分支 即 写入41字节(40个字符和一个换行符)
fast-forward快进:当合并操作没有需要解决的分歧,只是 简单的 将指针向前推进。
三方合并:将两个分支的末端所指的快照(c4和陈) 及两个分支的公共祖先(才),做一个合并。
一次合并提交:将三方合并的结果 作为一个新的快照(c6),并自动创建一个提交指向它。(特点:不止一个父提交)
贮藏(stash)
将 脏状态(跟踪文件的修改和 暂存的改动),保存到一个栈上。可以在任何时候重新应用
这些改动(甚至在不同分支上)
适用于 要切换分支,但不想提交工作。-> 推到栈上
git status #查看改动的状态
git stash #贮藏修改(通常会贮藏 已修改、暂存的已跟踪的文件)# git stash 或是 git stash push 皆可贮藏#当工作区干净时,可以切换到其他分支git stash list #查看贮藏的内容
git stash apply #将 刚刚 贮藏的工作 重新应用git stash apply stash@{x} #指定应用某个贮藏git stash apply --index #?? 重新应用暂存的修改git stash drop 要移除的贮藏 #移除贮藏git stash -u #贮藏任何未跟踪的文件
贮藏创建分支 并丢弃贮藏
git stash branch 新分支
#检出贮藏工作所在的提交,并重新在那应用工作,应用成功后丢弃贮藏
清理(clean)
git clean #去冗余文件或 清理工作目录git clean -f -d #移除 未跟踪的文件和 空的子目录
#-f 表示 强制执行,需要git配置变量clean.requireForce 没有显示设置为falsegit clean -d -n #演习,告诉你,将会移除什么
# -n 将会 移除什么(不移除,仅演习)
参考:怎样用git将一个分支的东西移动到另一个分支? - 知乎 (zhihu.com)
Pro Git(中文版) (gitee.com)