1 Git介绍
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
1.1 Git与SVN区别
|
SVN |
GIT |
是否分布式 |
非分布式 |
分布式 |
存储方式 |
文件存储 |
元数据方式存储 |
分支 |
分支就是另一个目录 |
指针 |
全局版本号 |
有 |
无 |
内容完整性 |
优于SVN |
2 安装与配置
$ apt-get install git $ git config --global user.name “Your Name” $ git config --global user.email “[email protected]” |
3 本地仓库
Git目录下分为三个区域:
工作区(working dir):操作的目录
暂存区(stage):.git目录下,存放add内容
版本区(HEAD):.git目录下,存放各个版本个信息和内容
3.1 创建仓库
3.2 工作目录上添加文件
在工作目录上添加文件。利用git status查看修改状态
3.3 添加修改到暂存区
3.4 提交修改到版本区
用commit提交修改,-m带上提交说明。提交完后用log可以查看版本记录。
3.5 再次修改文件并提交
对文件进行修改
添加修改change1
提交修改change1
3.6 撤销修改
3.6.1 从版本区中恢复工作区
先对工作区中进行修改,再用chekout -- <file>命令,从版本区中恢复
3.6.2 从暂存区中恢复工作区
修改文件add到暂存区,再修改文件,此时可以用chekout -- <file>命令从暂存区恢复工作区
3.6.3 从版本区中恢复工作区和暂存区
命令git reset --hard <commitid>可以从版本区中指定的版本恢复工作区和暂存区。<commitid>为提交id,或者版本指针。
提交id: 可以是id的前几位,但至少4位
指针: HEAD 当前指针
HEAD^ 上一版本;HEAD^^表示上上版本,以此类推
HEAD~<N> 前几个版本
3.6.4 总结
git reset --hard <commitid> 从版本区中指定的版本恢复工作区和暂存区
git checkout -- <file> 是从最后一次的add或commit中恢复
【注】git checkout 不加--,是切换分支
3.7 删除文件
用git rm命令删除文件,再git commit提交。
3.8 分支
Git中的分支是用指针完成的,所以效率特别高
3.8.1 创建分支
git checkout -b <分支名> 创建并切换到分支
git branch 查看分支(分分支前的*表示当前分支)
3.8.2 自动合并分支
先在dev分支上做些修改
在master上合并dev
删除分支
3.8.3 合并冲突
如果两条分支都有各自的修改,那么合并操作不能自动进行。需要手动解决冲突。合并分支有merge和rebase两种方法,推荐使用rebase。
3.8.4 merge
在dev上修改readme.txt
在master分支上修改readme.txt
在master上合并dev分支,提示冲突
此时,readme.txt文件变为
修改readme.txt为
解决冲突后add, commit.
3.8.5 rebase
使用流程:
l 使用git rebase合并分支
l 修改冲突,文件修改后用git add添加
l 执行git rebase --continue继续下一个冲突解决,直到所有冲突都解决
合并前分支情况如下
执行git rebase后,会把当前分支的每个commit都取消掉,并把它们临时保存为pathch(放在.git/rebase目录中),然后把分支更新到新的origin。最后把保存的补丁应用到分支上。
最后的效果,所有的commit都在一条分支上,就像没有存在过分支一样。下图展示了rebase与merge的区别。
4 远程仓库
4.1 创建远程仓库
4.2 关联远程仓库
4.3 上传到远程仓库
格式为 git push –u <远程仓库名> <本地分支名>[:<远程分支名>]
【注】第一次上传时候需要-u参数,以后更新修改不需要-u
【注】若远程分支名与本地分支名相同,可以省略:以及后面的远程分支名
远程仓库上可以看到dev分支了。
4.4 远程冲突
因为在新建远程仓库时,已经有有修改了(README.md)。
先用fetch下载,再merge,最后push
# git fetch origin master # git log -p master origin/master # git merge origin/master # git push origin master |
4.5 Fork分支
从已存在的仓库中fork
4.6 Clone分支
命令git clone下载远程分支到本地。若不是master分支,需要添加-b <分支名>
4.7 推送到远程
先对本地仓库进行修改
用git push <远程名> <本地分支名>:<远程分支名>
在远程仓库上可以看到修改
4.8 Pull request (PR)
将Fork出来的分支修改合并到源分支上上,需要提pull request,由源分支负责人同意后合并。
在iSource页面上点击New Merge Request
填写PR信息
在源分支上点击Merge,修改自动合并
5 总结
5.1 一般流程
5.2 常用git命令
git init
把当前的目录变成可以管理的git仓库,生成隐藏.git文件。
git add <file>
把文件修改添加到暂存区去。
git rm <file>
删除XX文件
git commit -m “XX”
提交修改 –m 后面的是注释。
git status
查看仓库状态
git diff <file>
查看XX文件修改了那些内容
git log
查看版本历史
git reflog
查看历史记录的版本号id
git reset --hard <commitid>
从版本区中恢复。<commitid>可以是版本指针或者Commit ID
HEAD 当前版本
HEAD^ 上一版本。这里可以有多个^,每个表示回退一个版本
HEAD~<N> 表示回退N个版本
Commit ID 可以是Commit ID的不重复前几位(至少4位)
git checkout -- <file>
把文件在工作区的修改全部撤销。
git checkout -b <分支名>
创建并切换到分支上
git branch <分支名>
创建分支
git branch
查看当前所有的分支
git branch -d <分支名>
删除dev分支
git checkout <分支名>
切换到分支
git merge <分支名>
在当前的分支上合并分支
git stash
把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list
查看所有被隐藏的文件列表
git stash apply
恢复被隐藏的文件,但是内容不删除
git stash drop
删除文件
git stash pop
恢复文件的同时 也删除文件
git remote [-v]
查看远程库名称
-v 列出详细信息
git remote add origin <远程仓库>
关联一个远程库
git clone [-b <分支名>] <远程仓库>
从远程库中克隆。
-b <分支名>表示克隆哪个分支。若没有,则默认master
git push [-u] <远程名> [<本地分支名>][:<远程分支名>]
将本地分支推送到远程库对应的分支上
-u 第一次推送需要加这参数,以后就不需要
若省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名)
若省略本地分支名,则表示删除指定的远程分支
分支开发原则:
如果本地dev分支有修改,则需要先切换到master分支,把本地分支的修改merge回master(git merge dev),然后在master上把合并后的内容push到master上;然后再切换回本地分支,再把master的内容merge回分支,然后就继续在分支开发。
开发流程:
// 查看本地分支
git branch
// 显示本地、服务器所有分支
git branch -a
// 显示本地分支和服务器分支的映射关系
git branch -vv
// 切换分支(和创建分支就差一个-b参数)
git checkout {{branch_name}}
// 创建新分支,新分支的代码来自于当前分支
git checkout -b [分支名]
// push本地分支代码到远端服务器,如果远端服务器没有该分支,将会自动创建;
git push origin [远端分支名]
// pull远端分支代码到本地当前分支(建议使用)
git pull origin master
如果只想用git pull,可能需要建立track关系,则使用
git branch --set-upstream-to=origin/<远端branch_name> <本地branch_name>
输出结果:Branch h5_dev set up to track remote branch h5_dev from origin.
// 合并本地master分支到当前分支,比如当前处于dev分支,则把master上的代码merge到dev分支上
git merge master
// 合并远程master分支到当前分支
git merge origin/master
// 删除本地分支
git checkout {{another_branch}}
git branch -d {{local_branch_name}}
//删除远程分支
git push origin --delete {{branch_name}}
# 假设本地有两个分支: master和dev, 使用dev进行本地开发
# Step1. dev.commit
git status # 当前分支,修改的文件
git diff # 具体的修改
git commit -m "{COMMIT_MESSAGE}" . # 提交
# Step2. master.update.merge-dev
git checkout master # 切换到master分支
git pull origin master:master # 更新master
git merge dev # 合并dev分支的修改
git push origin master:master # 提交代码到远程Git库
# Step3. dev.update
git pull origin master:dev # 更新dev
git checkout dev # 切换回dev, 以便下一步的开发
常用命令:
- git config --global user.name
- git config --global color.status auto
- git config --global color.diff auto
- git remote -v// 查看远程分支的git路径
- git clone [email protected]/tv.git
- git status // 查看当前版本的状态(是否修改)
- git add xyz // 添加当前修改的文件到暂存区 or 跟踪新文件(git add .把所有修改的文件add在暂存区)
- git commit -m '{{update_msg}}'
- git rm xxx // 从当前跟踪列表移除文件,并完全删除
- git rm -cached xxx// 仅在暂存区删除,保留文件在当前目录,不再跟踪
- git mv old_name new_name// 重命名文件
- git log
- git log -n
- git log --stat
- git show b4f44fe
- git diff
代码量统计
git log --author="pWX490102" --since ==2018-01.26 --until=2018-03-24 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
强制回滚命令:
git reset --hard e1da2c37bdaf3df52b9cf105ec7a7bd83f488bc1(上一次提交的号)
从主分支拉取代码到新分支
git branch --set-upstream-to=origin/master appMarket-pyq
把远程分支拉倒本地,并建立关联关系track:
git checkout --track origin/jiangbo_dev
Branch jiangbo_dev set up to track remote branch jiangbo_dev from origin.
Switched to a new branch 'jiangbo_dev'