git文件状态
- 已修改(工作区)
- 已暂存(暂存区)
- 已提交(版本库)
git配置
- /etc/gitconfig(几乎不用)
git config --system - ~/.gitconfig(常用)
git config --global - .git/config文件中
git config --local - 删除配置
git config -unset <key>
git commit --amend --reset-author
修改commit的message omend
git commit --amend -m '最新message'
好的工具推荐
oh-my-zsh
git分支管理及git常用
- 分支列表
git branch - 创建分支(新分支内容与当前分支一样)
git branch 分支名称 - 分支切换
git checkout 分支名称 - 两个分支来回切换
git checkout - - 创建分支同时切换到新分支
git checkout -b 新分支名称 - 删除分支
git branch -d 分支名称 - 删除分支时候,如果待删除分支有修改没有合并到其他分支上(not fully merged),删除分支需要用-D,
git branch -D 分支名称 - 查看当前分支的最新一次提交
git branch -v - 图形化查看日志
git log --graph - git add . + git commit -m(仅针对版本库的文件,新增不可以)
git commit -am '文本' - git 分支改名
git branch -m <历史分支名> <新分支名> - 查看文件近一次修改记录
git blame <文件名>
diff
-代表源文件,+表示目标文件,常用diff指令diff -u <源文件> <目标文件>
- 比较工作区与暂存区的区别
git diff - 比较工作区与最新一次提交的差别
git diff HEAD - 比较暂存区与最新一次提交(版本库)的差别
git diff --cached
git merge
- 将其他分支的修改合并到当前分支
git merge 待合并分支名称 - 禁用fast-forward,使用参数 --no-ff
分支
分支概念
一个commit对象链:一条工作记录线。 有一个parent属性值,记录上一次提交值
HEAD
HEAD指向当前分支;master指向提交
HEAD文件内部存的是指向另外一个引用的指针
修改HEAD文件 git symbolic-ref HEAD refs/heads/...
基于git分支开发模块
版本回退 git reset --hard
- 回退到上一个提交
git reset --hard HEAD^ - 回退到上两个提交
git reset --hard HEAD^^ - 回退到某个commit id(前面几位就可以了)
git reset --hard <commit_id> - 查看操作日志
git reflog - 通过checkout(detached HEAD, 游离状态)
git checkout <commit_id>但是需要用新的分支保存修改
git chekcout <新的分支> <commit_id>
远程版本库
- 本地添加远程仓库
git remote add origin <远程仓库地址> - 本地master与远程做关联-u
git push -u origin master - 查看对应的远程仓库
git remote show - 查看远程仓库详细信息
git remote show origin
push, pull, fetch
pull == fetch + merge
push除了会推送代码,还会同时更新origin/master的指向
git push完整:git push origin <本地分支名>:<远程分支名>
git pull完成:git pull origin <远程分支名>:<本地分支名>
git协作及远程分支
- 查看所有分支,包括远程分支
git branch -a - origin/master概念
- 三方合并
- 从远程非master分支拉新分支
git checkout -b <新分支名> origin/<远程分支名>git checkout --track origin/<远程分支名称>
- 本地推送并创建远程分支
git push -u origin <远程分支名>git push --set-upstream origin
- 删除远程分支
git push origin :<远程分支名>git push origin --delete <远程分支名>
- 重命名远程分支,目前只能先删除远程分支,在重新推送
- 删除本地存着的无效的origin分支
git remote prune origin - 查看远程分支日志
git log origin/<远程分支名>
commit 对象
当执行git commit时,git会创建一个commit对象,并且这个commit对象的parent指针设置为HEAD所指向的引用的SHA-1值
git refspec
git别名
语法如下 git config --local alias.<别名> <原名>
e.g. git config --global alias.br branch
gitk和git gui
git图形工具
git tag
- 标签创建
git tag <标签名称> - 查看标签
git tag - 标签推送至远程
git push origin --tags - 标签拉取 git pull
- 删除远程标签
git push origin :<refs/tags/标签名>
git gc
git裸库与submodule, git submodule有弊端
- git裸库是没有工作区的,远程服务器端,创建裸库
git init --bare - 将一个他git引入到本git
git submodule add <git地址,e.g. git@github.com:xxx> <新模块名称> - 一次更新所有子模块
git submodule foreach git pull - 克隆方式变更
git submodule init&&git submodule update --recursive
git subtree 推荐
针对双向修改,更为优秀
git cherry-pick
将对某个分支的修改(提交),应用到另外一个分支,是用在本地分支的 git cherry-pick <commit-id>
git rebase
rebase:变基衍合,改变分支的根基,功能是将两个分支的内容合并到一起,类似merge
但是merge是三方合并(有分叉), 而rebase是将一个分支的应用到另外一个分支上,执行完以后是直线, rebase可以随时终止, 但是他会修改原来的git历史
rebase 基本操作 git rebase <分支名> && git rebase --continue && git rebase --abort
** 不要对master进行rebase,且适合做rebase操作的分支都是本地分支,没有执行过推送远程版本库的分支**