0%

Hello_Git

img

仓库初始化

  • 创建仓库 :在工作目录生成.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过来,完成之后再进行开发。这样就是尽量保持在昨晚之后的最新的代码上进行开发,以减少产生冲突的可能性。

Reference

-------- 本文结束 感谢阅读 --------