分支模型
常驻型分支:
master:每个提交都是稳定版本,每次提交打tag
develop:每次提交都是可完整编译的开发版本,代码稳定后进入master分支
临时性分支:
feature:特定单一功能模块分支,完成后进入develop
release:特定发布版本分支,来源于develop,完成最终小修复、发布版本资料准备等,发布后同步至develop和master分支,并删除
hotfixes:特定严重bug修复分支,来源于master,完成后同步至develop和master,并删除。发布期间同步至release分支,最后由release分支同步至develop和master
介绍一个成功的 Git 分支模型
A successful Git branching model
Config配置
默认仓库级:.git/.gitconfig
global用户级:C:\Users\username.gitconfig 或 /home/[username]/.gitconfig
system系统级:git的安装目录\etc\gitconfig
优先度:仓库级 > 用户级 > 系统级
Alias配置
~/.gitconfig
[user]
name = xxx
email = xxx@xxx.com
[color]
ui = auto
[alias]
st = status
cm = commit
cmm = commit -m
coamd = commit --amend --no-edit
coamd-re = commit --amend --no-edit --reset-author
ck = checkout
br = branch
unstage = reset HEAD --
last = log -1 HEAD
loga = log --oneline --graph --decorate --all
ck = checkout
alias = config --get-regexp alias
基本命令1
git init 在当前目录(项目)创建git仓库
git config [-local | -global | -system] -l 列出指定级别的配置文件内容
git config -l 列出综合计算(排除冲突)后有效的配置内容
git config -e 编辑器打开配置文件(默认为local级)
git config --add section.key value 增加配置项(默认为local级)
git config --get / --unset section.key 获取、删除配置项(默认为local级)
设置用户全局提交签名
git config --global user.name myName
git config --global user.email myEmail@email.com
git config --global core.editor emacs 配置缺省编辑器
git config --global merge.tool vimdiff 配置缺省比较工具,可选有kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, 和 opendiff
git remote -v 列出远程仓库及对应url
git remote show origin 显示远程仓库origin的详细关联信息
git remote add [shortname] [url] 追加新的远程仓库到当前项目
git remote prune origin 移除在origin中已删除的本地过期分支
git fetch origin 拉取origin服务器上的所有数据到本地,更新远程分支数据及索引
git fetch origin tag <tagname> 拉取远程tag
git fetch -p 拉取服务器数据后并执行prune 命令删除过期分支
git remote add 添加新的远程仓库附加到当前项目远程分支
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master 推送当前分支到origin下的master分支上,尤其第一次提交分支
git push [origin] 之后的更新提交可使用这种简单形式
git push origin fixBugs:greatJob 推送fixBugs分支到origin的greatJob 分支上
git push --all origin 一次性推送所有分支到远程
git push --tags 推送本地tag到服务器
git push origin :master 表示提交本地空分支到远程(即删除远程分支)
相当于 git push origin --delete master
git merge origin/master 把远程master分支合并到当前分支
git checkout -b localfix origin/serverfix 把远程分支serverfix检出到本地新分支localfix
git checkout --track origin/serverfix 检出远程分支serverfix到本地(功能同上,v 1.6.2)
从远程分支checkout出来的本地分支称为 跟踪分支(tracking branch),已记录与远程分支的关联,可直接使用git push/git pull操作。
git push origin :serverfix 删除远程分支serverfix(使用空分支push到远程指定分支)
git push origin --delete <branchName> 删除远程分支(v1.7)
git push origin :refs/tags/<tagname> 删除远程tag
git push origin --delete tag <tagname> 删除远程tag(v1.7)
git pull origin targetBranch 拉取远程分支到本地并合并,相当于:
git fetch origin targetBranch
git diff targetBranch
git merge targetBranch
git reset HEAD <file> 取消被错误add . 添加到暂存区的文件
git checkout -- <file> 回滚文件到原始状态
git mergetool 启动GUI合并工具
git branch -vv
查看本地分支-远程分支映射
git branch -u upstream/foo [local_branch]
git branch --set-upstream-to=upstream/foo [local_branch]
设置分支映射
git push origin local_branch:remote_branch
推送本地分支到远程分支
git push origin :remote_branch
git push --delete origin devel
删除远程分支(推送空分支)
拉取远程分支并创建本地分支
从remote_branch节点创建并切换到本地分支local_branch
git checkout -b local_branch origin/remote_branch
拉取远程分支到本地分支(新建分支但并不自动checkout)
git fetch origin remote_branch:local_branch
定位 commit
显示包含该commit的分支列表
git branch --contains <commit>
搜索特定message的所有commit
git log -S "searching words"
git log -G "regex"
git log --grep="searching words"
git log | grep "searching words"
git bisect:
二分查找法定位、检出当前branch的关键commit,寻找bug被引入的源头commit
基本命令2
-
init [--bare]
初始化git仓库,bare 指定创建远程仓库,仅用于管理记录,不用于实际工作 -
clone <url> [新项目文件夹名]
克隆远程项目 -
add -i
交互模式下选择需要加到暂存区的文件 -
add -p <file>
交互模式下选择当前文件中需要加到暂存区的代码块 -
commit --amend -m <message>
修改上次提交的注释 -
commit --amend
使用新的commit替换掉上一次commit -
cherry-pick <commit1 ...>
指定commit复制并提交到当前分支 -
stash
入栈缓存并reset --hard
list / show / apply / pop / drop / clear
-
save <comment>
入栈缓存并添加备注 -
branch <name> [id]
基于进度创建新分支
clean [-f 清理 UNTRACKED 文件] [-d 以及目录] [-n 测试运行模式] [-i 交互模式]
-
rm [--cached 仅在暂存区中] <file>
删除文件的标准方式,指定 cached 则仅在git系统管理中删除文件,但保留物理文件 -
reset [目标,默认为HEAD] [文件]
回滚提交记录或文件,被回滚的记录将被清除-
--soft
回滚commit提交记录 -
--mixed
默认值,回滚 commit 和 add 动作(清理暂存区) -
--hard
回滚提交记录,清理暂存区并物理删除新文件
-
-
revert
撤销某次记录的提交,实际上是执行一次反向提交,增加一条commit记录,不清除被撤销的旧提交 -
branch <name>
创建新分支 -
checkout -b <name> [start-point]
创建并切换到新分支 -
checkout [目标,默认为HEAD] [-- 文件路径]
检出指定版本的项目或文件,覆盖当前 -
update-index --assume-unchanged <file>
暂时忽略对文件修改的跟踪,常用于大型二进制文件管理时提高git性能 -
update-index --no-assume-unchanged <file>
恢复对文件的实时跟踪 -
diff
对比暂存区或最近的commit版本与当前工作区的区别-
--cached
对比暂存区与最近一次commit版本之间的区别 -
--stat [当前] [目标,默认为HEAD] [-- 文件路径]
对比项目或文件
-
-
blame <file>
查看文件每行提交者及提交时间 -
show
显示单条 git 提交记录,并使用diff
分析,可用选项与log
相同 -
log
显示 git 有效提交历史,不包括被 reset 掉的提交- --all --oneline --graph 所有分支以简化的树状图方式表示
- --decorate 彩色标记分支名等信息
- --stat 统计方式显示提交的文件
- -n 查看最近n条记录
-
reflog
查看 git 本地操作的完整记录,可用于恢复被 reset 清除掉的历史提交,但该记录并非永久记录,过于古老的提交将被自动清理掉 -
tag [-f 强制更新] [-m <message>] <tag-name> [commit-id]
对目标commit添加tag,默认为最近一个commit,message信息可通过show
命令查看-
-d [tag-name]
删除本地tag -
-l
列出清单
-
-
fetch <repo-name>
拉取远程仓库的所有分支更新,刷新所有远程分支HEAD位置 -
merge
无参数表示更新本地分支HEAD标记到远程分支版本-
--no-commit
相当于dry-run -
--no-ff / --ff-only
Fast-Forward -
--squash
将目标分支的修改应用到当前分支并产生一个独立commit,不混合提交历史记录
-
-
pull
相当于fetch + merge
-
remote
管理远程仓库映射-
add <repo-name> <url>
追加远程仓库映射 -
rename / remove
重命名、移除远程仓库映射 -
set-url [--push] <repo-name> <new-url> [old-url]
修改远程仓库映射的链接 -
-v
列出所有远程仓库 -
prune <repo-name>
对比并移除本地仓库中已失效的远程分支映射
-
-
rebase
节点重置,用于重新整理、修建、重新提交当前分支-
<branch / commit>
重置当前分支根节点到指定分支的HEAD节点或指定commit提交点 -
-i <branch / commit>
交互模式修改提交树,可对部分提交进行拆分、合并、删除、重排序、修改信息等操作 -
--root
特殊模式,针对从仓库第一条历史记录开始修改(或删除) -
--onto <target-branch / commit> <from-branch / commit> [working-branch]
切换到指定工作分支,缓存从指定位置开始到HEAD之间的所有提交,迁移到指定的目标分支或提交上(重新执行提交序列,不改变提交的历史日期),若在同一分支上操作,则进行commit历史的裁剪操作
-
要撤销的文件已被 add
到暂存区时,需要先 reset
退出暂存区,再 checkout
检出原始版本覆盖当前修改。
.ignore 对当前文件夹以及子文件夹有效,但仅作用于未添加到 git 跟踪的 UNTRACKED 文件。
patch补丁主要用于非开发人员,不需要进行pull、merge等操作即可得到最近代码
本地配置文件不需要跟踪时,从一开始就不要添加到 git 库进行管理。
分支节点符 ^ ~
^
旁系节点,用于表示分支树同一层级的兄弟父节点
^
表示当前commit所在当前分支的(第一个)父节点
^2
表示当前commit所在 第二分支 的(第一个)父级兄弟节点(与 ^
并列同一层级)
~
直系节点,用于表示分支树中当前分支的各个直系父节点
~
表示当前commit所在当前分支的(第一个)父节点
~2
表示当前commit所在当前分支的(第一个)祖父节点(直系节点)
^^^ = ^1^1^1 = ~3 当前分支的 父节点 的 父节点 的 父节点
^^2 = ~1^2 = ~^2 当前分支的 父节点 的 第二分支 的 父节点
^2 当前节点的 第二分支 的 父节点
节点符可用于 HEAD
、分支或任意一个 commit
可视化工具
SourceTree
免费的Mac平台git可视化客户端
GitUp
可视化Git工具,结构比SourceTree简单,功能强大,可直接操作提交树图形,提供多种简易自动化编辑功能
网友评论