Git应用笔记
常用指令:
创建git的版本库
指令 | 注释 |
---|
git clone < url > | git clone http://git@xxxxx/xxx/xxx/xxx.git 克隆之后已经完成初始化,不需要再git init |
git init | 初始化 |
查看
指令 | 注释 |
---|
git status | 查看状态 |
git diff | 查看差异 |
git log | 查看每次commit及备注 |
git blame < flile > | 列表方式查看指定文件log |
本地工作区 ↔ 暂存区之间的修改和提交
指令 | 注释 |
---|
git add . | 所有改动添加到暂存区 |
git add < file > | 指定跟踪文件添加到暂存区 |
git commit -m “message” | 提交(存到本地数据库中,数据库都是经过提交的有索引;暂存区没有索引) |
git commit --amend | 修改上次的提交 |
git reset --hard HEAD | 全部撤销(本地工作区内未提交的文件修改) |
分支指令 | 注释 |
---|
git branch | 显示所有分支(本地) |
git branch < NEW branch> | 创建新分支 |
git branch -d < branch > | 删除本地分支 |
git checkout < branch > | 切换到分支 |
git merge < branch> | 合并< branch> 到当前分支 |
git rebase < branch> | 衍合< branch> 到当前分支 (衍合又称变基) |
注:合并与衍合的区别需要重点理解一下,合并比较好理解,就是把一个分支纳入进来,两个分支变成一个,类似或运算;
变基则是矢量变化,是把某个分支上所有的“修改内容”(历次commit),“移植”到另一个分支(的最后commit)上。在目标分支(新基)的基础上,将变基分支“历代的修改内容”重演一遍,然后在变基分支(注意不是目标分支)得到一个新的节点。然后通常还需要(检出到目标分支去)将这个已经变基的分支合并进来。
例如将experiment变基后合并到master(experiment是变基分支,master是目标分支):
$ git checkout experiment
$ git rebase master
$ git checkout master
$ git merge experiment
就上面这个例子而言(这也是大多数变基操作的使用场景),合并与变基的结果是一样的,不一样的是过程。只有log不一样,变基可以使得log看起来好像变基的分支没有存在过一样(实际明明是并行开发过程,log上看起来却是串行的,本质是因为分支的工作在主干上经过了快速重演)。
变基的禁忌场景:如果这个分支上你不是唯一的开发者,别人有可能基于你的提交做了其他开发,就不要进行变基。
因为变基操作会让你的提交变成过程矢量,然后在另一个新基础上重演,最终得到一串新初始节点+过程矢量的节点。这使得你的分支上的每一个节点的commit数据都可能发生了变化。
标签 指令 | 注释 |
---|
git tag | 显示所有本地标签 |
git tag < NEW tag> | 给最新的commit(提交)打上一个标签 |
git tag -d < tagname > | 删除本地标签 |
git checkout < tag > | 切换到标签 |
本地↔远程之间
指令 | 注释 |
---|
git remote -v | 查看信息 |
git remote add < remote > < url > | 添加远程版本库 |
git remote fetch < remote > | 下载代码 |
git pull < remote > < branch > | 下载代码+合并 |
例如:git pull origin master | master可替换为别的分支名或标签名 |
git push < remote > < branch > | 上传代码+合并 |
例如:git push origin master | master可替换为别的分支名或标签名 |
例如:git push --set-upstream origin master | 全部暂存区都上传到origin仓库的master分支 |
git push --tags | 全部标签上传 |