仓库初始化
- 创建仓库 :在工作目录生成.git目录,包含资源元数据,通过git管理操作,创建默认master分支
git init
git init newrepo
- 配置用户信息 :–global修改用户主目录下.gitconfig,默认所有项目使用的用户信息;去掉–global则修改当前工作目录.git/config,仅作用于当前项目
git config –global user.name ‘ping’
git config –global user.email ‘ping@git.com‘
分支管理
- 创建分支:基于当前分支拷贝创建,不带参数为查看分支,参数-d为删除分支
git branch
- 切换分支:避免切换到不存在的分支,可使用“-b”创建加切换
git checkout master
git checkout -b
- 取回分支:获取更新的分支代码,对本地开发无影响
git fetch origin master
- 分支合并:基于当前分支将其它分支融合进来,对于服务器的master合并工作需要发起Merge Request交由管理人员审核
git checkout branch_1
git merge branch_2
- 冲突解决:合并分支出现歧义,通过手动人为编辑解决冲突文件后,需要重新add及commit纳入管理,而底层git也会记忆冲突解决原理,避免后续合并歧义
远程操作
- 克隆仓库:拷贝一个 Git 仓库到本地,包含远程仓库的所有分支
git clone
- 远程关联:项目拷贝默认关联远程库origin,关联之后pull和push才能相对应
git remote add origin
git remote -v 显示所有远程仓库
- 下载代码:==git pull = git fetch + git merge== 获取服务器数据并合并数据进行更新
git pull <远程主机名> <远程分支名>:<本地分支名>
- 上传代码:默认推送到==origin/master==
git push <远程主机名> <本地分支名>:<远程分支名>
基本操作
- 添加:add追踪文件纳入版本控制(添加到暂存区index)
git add
git add .
- 提交版本:commit提交内容至本地仓库(HEAD指向最后一次提交结果)
git commit -m “代码提交信息”
“-a”将所有被修改或者已删除的且已经被git管理的文档提交到仓库中,不会造成新文件被提交
git commit -am ‘change info’
- 查看状态:”-s”参数获取简单输出,查看文件提交后是否有改动
git status -s
- 比较差异:默认比较工作目录和暂存区,输出为目标在源基础上的修改
git diff
git diff –cached 查看 index 与 local repositorty 的差别
git diff HEAD 查看 workspace 和 local repository 的差别
- 回退版本:可以指定退回某一次提交的版本,HEAD表示当前版本,HEAD^个数i表示前i个版本,HEAD~i表示前i个版本
git reset [–soft | –mixed |–hard] [HEAD]
git reset HEAD
取消已缓存的内容,不会进行改动提交
- 查看日志:查看历史提交记录,参数–oneline显示简洁版本,–graph查看拓扑图,–reverse逆向输出,–author指定用户
git log
- 标签:发布版本的快照,标签比提交号方便,分轻量级的和含注解(参数-a)的标签
git tag -a v1.0
Upstream及分支理解
- upstream可以理解为分支间的通道,用于连接本地分支和远程分支,保证数据推送流通正确性
git branch –set-upstream–to=origin/remote_branch local_branch
git push -u origin branch 推送分支到服务器同时关联本地分支
- 分支类型有三类:本地分支feature(L),远程分支feature(R),指向远程分支的指针,以remotes开头即远程分支在本地的镜像feature(T)。
- 其实feature(L)和feature(R)从技术实现上根本没有任何交集,它们之间的关联全是通过feature(T)这个桥梁实现的。
- 其实在feature(L)上执行了git fetch命令后,Git会把feature(R)上的改动下载到本地更新到feature(T)分支上,如果此后不执行git merge的话,那么你的feature(L)和feature(T)就会存在差异,只有执行了git merge命令后才会把feature(T)中的内容合并到feature(L)中。
- 在simple模式下,我们feature(L)分支的upstream其实指向的就是feature(T),而feature(T)这个指针就会指向真正的远程分支feature(R)。所以如果我们的feature(L)有了改动,执行git push的话,Git会先把改动更新到feature(T)中,然后再讲feature(T)的改动推向远程的feature(R)中。
使用技巧
- 比如你是在worker1(L)分支上的开发者,做完了一天的工作,先不要提Merge Request,而是先checkout到master(L)上,pull一下,把服务器上master的代码拉下来,使本地的master(L)是最新的master代码,然后checkout回worker1(L)分支,将master(L)分支merge到worker1(L)上,这时候就有可能发生冲突了,因为可能在你下班之前,worker2分支的同事已经提交了代码并且更新了master,而你们恰巧修改了同一个文件。这时候冲突了不要紧,因为冲突是发生在你本地的,你只要在本地把冲突解决了,然后push到worker1分支上去,再提Merge Request,就不会使服务器上的master产生代码冲突了。当你早上来上班时,尽量也checkout到master(L),pull一下,再checkout回worker1(L),把master(L)分支的内容merge过来,完成之后再进行开发。这样就是尽量保持在昨晚之后的最新的代码上进行开发,以减少产生冲突的可能性。