GIT版本控制

控制系统(VCS)

中央式 VCS 的中央仓库有两个主要功能:保存版本历史、同步团队代码。而在分布式 VCS 中,保存版本历史的工作转交到了每个团队成员的本地仓库中,中央仓库就只剩下了同步团队代码这一个主要任务。它的中央仓库依然也保存了历史版本,但这份历史版本更多的是作为团队间的同步中转站。

中央式版本控制系统


GIT版本控制_第1张图片


分布式版本控制系统(DCVS)

GIT版本控制_第2张图片

优点:

大多数的操作可以在本地进行,所以速度更快,而且由于无需联网,所以即使不在公司甚至没有在联网,你也可以提交代码、查看历史,从而极大地减小了开发者的网络条件和物理位置的限制(例如,你可以在飞机上提交代码、切换分支等等); 由于可以提交到本地,所以你可以分步提交代码,把代码提交做得更细,而不是一个提交包含很多代码,难以 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版本控制_第3张图片

# 打头的是注释文件,其他的都是对忽略文件的配置。

其他:

回滚:git reset --hard e377f60e28c8b84158 

强制提交 : git push -f origin master

你可能感兴趣的:(GIT版本控制)