Git 本地仓库总结:
- 一次“变化”最多会经历三种状态,分别是未暂存、已暂存和已提交,而“变化”处在这三种状态时所处的物理位置也是不同的,分别是工作区(workspace),暂存区(index) 和仓库(repository),三种状态之间的状态计算分别是使用
git add .
(若撤销则执行git reset
) 和git commit -m ""
指令。git init
会初始化所有状态。 - Git 内部维护的核心数据结构是一个由每一次的“提交”作为结点的有向无环图,每一次的“提交”都被称作是一个“版本”。
- Git 中,是类似于“指针”概念的被称作“分支”的术语来操纵 DAG 上的每一个结点的,包括移动分支到某次提交、新增分支、删除分支等等所有操作。每个 DAG 都一定至少拥有一个分支
master
,使用git checkout
命令可以从当前分支跳转到指定的分支,而使用git checkout -b
命令后,会在当前分支head
上开辟一个新的分支,而使用git branch -b
命令则可删除指定分支。我们可以用git reset --hard
命令来将分支移动到某个特定的提交上。 - 一条铁令:在进行分支切换跳转之前,一定要先 commit 当前分支上的代码,除非你真的不想要在当前分支上你新写好的代码。
- 分支之间能够进行合并,使用
git merge
可以将指定的分支合并到当前分支上,创建一个新的合并版本结点。若合并中产生了冲突,Git 会终止此次合并操作,并将告诉你冲突所发生的具体位置,以便你前去修改成某个确定的结果来解决冲突。无冲突是成功合并的必要条件。 git-log
命令,全称是git log --pretty=oneline --all --graph --abbrev-commit
(使用别名(alias) 的方式),会显示是当前 Git 内部核心数据结构的视图,然而它并不会显示所有的版本结点,它只会显示所有分支之前的路径上的结点。这就意味着如果你从一个较新的版本回退到了旧的版本,可能git-log
并不会显示那些新的版本,但这不代表那些新的版本就彻底消失了。如果你还记得新版本的版本号,你同样可以通过git reset --hard
命令来将分支移动到新版本上。使用git reflog
命令可以查看所有 Git 命令的使用日志,这样就算你忘记了新版本的版本号,也可以通过日知分析的方法来得到。- 实际开发过程中会遵循一定的规范,下图所示的就是某一次开发的 Git 版本视图。
- master(生产)分支
- 主分支,又称线上分支,是中小规模项目作为线上运行的应用对应的分支;
- develop(开发)分支
- 一般作为开发部门的主要开发分支,阶段开发完成后需要合并到 master 分支准备上线;
- featur/xxx 分支
- 一般是同期并行开发而不同期上线时创建的分支,分支上的研发任务完成后合并到 develop 分支;
- hotfix/xxx 分支
- 一般作为线上 bug 修复使用,修复完成后需要合并到 master, develop 和 test 分支上;
- 其它分支
- 如 test 分支(用于代码测试)和 pre 分支(预上线)等。
- master(生产)分支
Git 远程仓库总结
- Git 是个完全分布式的应用。本地需要访问远程的仓库时,首先需要进行账号认证。生成 ssh 公钥后,将公钥信息复制到 Github 中的 ssh-agent 中即可完成认证。
- 先确保已经使用
git init
创建了本地仓库。使用git remote add origin <远端名称><仓库路径>
命令即可添加远程仓库,远端名称就是服务器域名(标识符是origin
),仓库路径就是 URI。使用git remote -v
可查看所关联的远程仓库的详细信息。 - 使用
git push [--set-upstream] [远端名称 [本地分支名] [:远端分支名]]
来推送本地内容至远端。--set-upstream
参数表示推送到远端的同时建立起该本地分支和远端分支的绑定关系,这样下次就只用敲git push
即可。可使用git branch -vv
命令来查看这种关联关系。 - 使用
git fetch [remote name] [branch name]
命令可以将远端仓库中指定分支下的更新全部抓取至本地,但不会进行合并。使用git pull [remote name] [branch name]
命令的效果等同于git fetch + git merge
,而若产生冲突,则解决冲突的办法与在本地仓库中时解决冲突的办法类似。 - 此外,如果已经有一个远端仓库了,我们可以直接使用
git clone <仓库路径>[本地路径]
命令克隆到本地。