控制系统(VCS)
中央式 VCS 的中央仓库有两个主要功能:保存版本历史、同步团队代码。而在分布式 VCS 中,保存版本历史的工作转交到了每个团队成员的本地仓库中,中央仓库就只剩下了同步团队代码这一个主要任务。它的中央仓库依然也保存了历史版本,但这份历史版本更多的是作为团队间的同步中转站。
中央式版本控制系统
分布式版本控制系统(DCVS)
优点:
大多数的操作可以在本地进行,所以速度更快,而且由于无需联网,所以即使不在公司甚至没有在联网,你也可以提交代码、查看历史,从而极大地减小了开发者的网络条件和物理位置的限制(例如,你可以在飞机上提交代码、切换分支等等); 由于可以提交到本地,所以你可以分步提交代码,把代码提交做得更细,而不是一个提交包含很多代码,难以 review 也难以回溯。
缺点:
由于每一个机器都有完整的本地仓库,所以初次获取项目(Git 术语:clone)的时候会比较耗时;由于每个机器都有完整的本地仓库,所以本地占用的存储比中央式 VCS 要高。
Git 的最基本的工作模型
1 从 GitHub 把中央仓库 clone 到本地(使用命令: git clone)
2 把写完的代码提交(先用 git add 文件名 把文件添加到暂存区,再用 git commit 提交)
3 在这个过程中,可以使用 git status 来随时查看工作目录的状态 每个文件有 "changed / unstaged"(已修改), "staged"(已修改并暂存), "commited"(已提交) 三种状态,以及一种特殊状态 "untracked"(未跟踪)
4 提交一次或多次之后,把本地提交 push 到中央仓库(git push)
head,master,branch 的通俗化理解
HEAD 是指向当前 commit 的引用,它具有唯一性,每个仓库中只有一个 HEAD。在每次提交时它都会自动向前移动到最新的 commit 。
branch 是一类引用。HEAD 除了直接指向 commit,也可以通过指向某个 branch 来间接指向 commit。当 HEAD 指向一个 branch 时,commit 发生时,HEAD 会带着它所指向的 branch 一起移动。
master 是 Git 中的默认 branch,它和其它 branch 的区别在于:
1 新建的仓库中的第一个 commit 会被 master 自动指向;
2 在 git clone 时,会自动 checkout 出 master。
3 大多数的开发团队会规定开发以 master 为核心,所有的分支都在一定程度上围绕着 master 来开发。这个在事实上构成了 master 和其它分支在地位上的一个额外的区别。
branch 的创建、切换和删除: 创建 branch 的方式是 git branch 名称 或 git checkout -b 名称(创建后自动切换); 切换的方式是 git checkout 名称; 删除的方式是 git branch -d 名称。
PUSH的本质
push 是把当前的分支上传到远程仓库,并把这个 branch 的路径上的所有 commits 也一并上传。
push 的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用 git push origin branch_name 的格式,而不能只用 git push;或者可以通过 git config 修改 push.default 来改变 push 时的行为逻辑。
push 的时候之后上传当前分支,并不会上传 HEAD;远程仓库的 HEAD 是永远指向默认分支(即 master)的。
Merge:合并commit
merge 的含义:从两个 commit「分叉」的位置起,把目标 commit 的内容应用到当前 commit(HEAD 所指向的 commit),并生成一个新的 commit;
merge 的适用场景: 单独开发的 branch 用完了以后,合并回原先的 branch; git pull 的内部自动操作。
merge 的三种特殊情况: 冲突 原因:当前分支和目标分支修改了同一部分内容,Git 无法确定应该怎样合并;应对方法:解决冲突后手动 commit。 HEAD 领先于目标 commit:Git 什么也不做,空操作; HEAD 落后于目标 commit:fast-forward。
Feature Branching 工作流
每个新功能或者修改bug都新建一个 branch 来写;
写完以后,把branch push到中央仓库,代码分享给同事看;写的过程中,也可以分享给同事讨论。另外,借助 GitHub 等服务提供方的 Pull Request 功能,可以让代码分享变得更加方便;
分支确定可以合并后,把分支合并到 master ,并删除分支。
关于add
add . 把工作目录下所有修改的内容加入到暂存区
add 不是添加文件名,而是添加文件修改的内容,每次修改都要add
stash:临时存放工作目录的改动
git stash 你分支的工作目录的改动就被清空了,所有改动都被存了起来。
然后你就可以从你当前的工作分支切到 master 去给你的同事打包了……
打完包,切回你的分支,然后: git stash pop 你之前存储的东西就都回来了。很方便吧?
.gitignore : 排除不想被管理的文件和目录
# 打头的是注释文件,其他的都是对忽略文件的配置。
其他:
回滚:git reset --hard e377f60e28c8b84158
强制提交 : git push -f origin master