git 学习笔记
分布式版本控制系统
客户端并不只是提取最新版本的文件快照,而是把代码仓库完整地镜像下来。
git的一些常用指令
- git diff // 比较工作目录中当前文件和暂存区域快照的差异,即修改后还没有暂存起来的变化内容
- git diff --staged // 暂存起来的文件和上次提交时快照之间的差异
- git status
- git commit // 提交到暂存区
- git commit --amend // 修改最后一次的提交
- git commit -a // =git add + git commit
- git rm // 移除文件
- git log // 查看提交历史
- git remote // 查看当前的远程库
- git fetch // 从远程仓库中拉取本地仓库没有的数据,并不自动合并到当前工作分支
- git pull // 将远端分支自动合并到本地仓库中当前的分支
git分支
在git中提交,会保存一个提交(commit)对象,该对象包含一个指向缓存内容快照的指针,包含本次提交的作者等相关的附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则由多个祖先。
git中的分支,其实本质上仅仅是个指向commit对象的可变指针。git会使用master作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的master分支,它在每次提交时都会自动向前移动。
创建一个新的分支: git branch [branchName]
创建了一个新的分支后不会自动切换到这个分支中,需要执行: git checkout [branchName]
也可以将创建新分支和切换到新分支合并成一条指令完成: git checkout -b [branchName]
分支的新建与合并
现在要将hotfix的内容合并到master上来,需要执行:
git checkout master
git merge hotfix
合并时会出现Fast forward的提示,由于当前master分支所在的提交对象是要并入的hotfix分支的直接上游,git只需把master分支指针直接右移。这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进。
合并后,可以将hotfix分支删除: git branch -d hotfix
如果现在要将iss53合并到master分支上:
需要执行:
git checkout master
git merge iss53
由于当前master分支所指向的提交对象(C4)并不是iss53分支的直接祖先,git会用两个分支的末端(C4和C5)以及他们的共同祖先(C2)进行一次简单的三方合并计算。
遇到冲突时的分支合并
如果在不同的分支中都修改了同一个文件的同一个部分,git就会无法干净地把两者合在一起。git作了合并,但没有提交,它会停下来等你解决冲突。要看哪些文件在合并的时候发生冲突,可以用git status来查阅。
任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。
可以将里面的内容进行人工修改。在解决所有文件里所有冲突后,运行git add将把它们标记为已解决状态。然后可以用git commit来完成合并提交。
分支的管理
git branch // 给出当前所有分支的清单,分支名字前的*表示当前所在的分支。
若要查看各个分支最后一个提交对象的信息,运行git branch -v。
要从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用--merge和--no-merged选项。