diamond

###Git学习笔记###

####简介####

常见的版本管理系统 1.分布式 Git 2.集中式 CVS、SVN、VSS

分布式的优点

  • 安全性高
  • 对网络没有严格的要求
  • 强大的分支管理

####版本库####

#####基本操作#####

  • 创建版本库 git init
  • 添加文件到版本库,可以反复多次添加 git add
  • 提交修改到版本库 git commit
  • 查看工作区状态和文件是否被修改 git status
  • 查看文件修改内容 git diff

#####版本回退#####

  • HEAD指向当前的版本,在各个版本间切换可以使用命令 git reset --hard commit_id
  • 切换前,可以用git log查看提交历史,确定要回退的版本
  • 重返未来版本时,可以用git reflog查看历史指令,确定要回到哪个未来的版本

#####工作区和暂存区##### 与SVN等不同,Git有一个重要的暂存区的概念

  • 工作区:工作目录
  • 版本库:工作区的隐藏目录.git 版本库中存储了很多东西,最重要的称为暂存区(Stage),包含Git自动创建的第一个分支master,以及指向master的指针HEAD

把大象装到冰箱分三步,文件添加到版本库时候分两步

  1. 将文件修改添加到暂存区,git add
  2. 暂存区所有内容提交到当前分支,git commit

#####手贱改错了怎么办#####

  1. 手贱,改乱了工作区某个文件内容,想直接丢弃工作区的修改git checkout -- file,作用是将工作区的内容替换为版本库的内容
  2. 极其手贱,并添加到暂存区,想丢弃修改,首先git reset HEAD file,回到步骤1,再继续操作
  3. 奇贱无比,已经提交了不合理的修改,参考版本回退的内容

#####远程仓库##### 远程仓库的添加

  • 要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
  • 关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改; 本地工作完全不需要考虑远程库的存在,没有联网可以干活 有网络的时候,再把本地提交推送一下就完成了同步。

远程仓库的克隆: 要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

####分支管理####

######分支命令###### 查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git checkout -b <name> 合并某分支到当前分支:git merge <name> 删除分支:git branch -d <name>

  • 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。用git log --graph命令可以看到分支合并图 分支使用策略: 在实际开发中,我们应该按照几个基本原则进行分支管理:

  • 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

  • 那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

  • 你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

Git分支十分强大,在团队开发中应该充分应用。合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; 当手头工作没有完成时,先把工作现场git stash一下,相当于游戏存档,然后去修复bug,修复后,再git stash pop,回到工作现场。

开发一个新feature,最好新建一个分支; 如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

多人协作时

  • 查看远程库信息,使用git remote -v
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突