算是 personal tech debt 吧,趁周末有时间,把这部分训练一下.这部分是纯粹基础的内容,但对于日常工作,目前来说是够了的,可能和我本身就是 Junior 的职位有关.
使用基础包括以下两个部分:
Source Tree 与 Git 连接
Git commit/pull/push/merge/fetch/branch
整个流程配合一个简单的 Sample Project.
Source Tree 与 Git 连接
下载及安装 Source Tree
这一步请自行完成.至于为什么要用 Source Tree,而不用 git 命令行工具,这个是个人选择,如果用命令行,可以略过本文,因为本文的重点是在如何用 Source Tree 使用 Git.
下一步之前,你需要有一个 Git 账户.
连接 Git 和 Source Tree.
打开安装好的 Source Tree,在右上角⚙️里添加自己的 Git 账号即可,https 和 ssh 方式都可以,如果你对 ssh 方式不熟悉,可以先使用 https,用账号密码的方式来处理.将来有需要了,可以进一步了解 ssh 方式.
使用 Source Tree 进行第一次 Commit
拥有一个 project
有一个项目,或者 repo,是进行提交的前提.本着简单的角度出发,可以在 Github 的自己的主页建立一个名字叫做 demo 的 project/repo,然后打开这个 repo,点击绿色按钮 clone or download,就可以得到 https 的 repo 地址,复制这个地址.
连接 reop 到 Source Tree
在 Source Tree 小窗选择 new-clone from url,填入 url 后,选择 https 方式,即可连接完毕.这几步比较简单,如果出现问题,请自行搜索一下解决方案.
初次 commit
当你刚才添加 repo 到 Source Tree 之后,其实你做了几件事.
添加 repo 给 Source Tree 管理
在本地建立了一个 repo
本地的 repo 与远程 repo 之间建立了关联
意义:本地和远程的仓库,就像是公司电脑和家里办公的电脑.两台电脑一般来说,希望保持文件一致性(假设你一直工作在一个项目,而不是家里与公司工作内容不同).但是,这种同步性,并不是自动的,这里就会出现各种各样的问题,以及后续操作的复杂性.这一点先要交代一下,不然后面的工作比较难的理解.
我们假设本地的仓库叫做 demo_local,远程的叫做 demo_remote,两个仓库都针对一个项目 project.这里可能会出现若干种状态,只提出来,不要管解决,先给自己一个现实印象.假设当前两个仓库是保持一致的,文件内容完全统一.然后我们有可能做出改动,从而导致两个仓库内容不同:
我们修改了 demo_local;
我们修改了 demo_remote;修改 demo_remote 可以通过很多种方式达到,比如 Github 网页或者其他人在你的项目提交了内容;
之后的内容,就会在这种不同的基础上,提一下我们的解决办法.但在此之前,逻辑上我们得提出目的:有不同,我们需要做什么?比如:
我们修改了 demo_local,我们希望远程也更新这部分修改;
修改了 demo_remote,我们希望本地也能与远程保持一致;
对,这就是我们的目的,到这里,可能比较能理解,操作其实比较容易的.
先说最基本的,我们要改一下本地的内容.
你可以随意在 demo 文件夹增加一个文件,比如说 test.java,然后会发现 source tree 中出现了这种改变,此时我们可以 commit,并选中 push change immediately to ... 这样,第一个 commit 就完成了,同时,远程也同步了这次 commit.
commit & push
刚才进行的两个操作就是:先本地提交,再上传更新到远程.
如果你不选择 push... 选项,那就是只有本地提交,可以之后再 push,分开进行.如果是这样,Source Tree 会用标记 1 提示你,你有一个本地 commit 没有提交到远程.
简单的部分结束了,接下来的部分,得自己通过项目感受一下
接下来的内容,是理解一下 Source Tree 的每个按钮.我没有按照项目顺序来说这部分.如果希望 step by step tutorial,可以搜寻其他的文档,有很多.这里只说每个按钮的意义和作用分别是什么.至于他们怎么和 demo 关联,请自己尝试项目后,再来看下面的内容是什么意思.
下面的按钮,并未按照 Source Tree 界面的顺序来.可能每个人心里都有一个 "不懂"-"懂" 的顺序,从而有希望优先理解的顺序.
Fetch 按钮
从远程获取内容,比如其他人,或者你自己用其他工具 / 电脑提交了更新,本地的 repo 不知道,需要 fetch 才行;
Fetch 并不专门针对某一个分支,而是会将所有的分支更新都拉回来.
Pull 按钮
将从远程拉取的更新,并入到本地;比如其他更新在远程已经有了,但本地没有同步,先 Fetch 后,pull 就会真正并入,Fetch 相当于 change,pull 相当于 apply change;
Push 按钮
在本地的更新,commit,如果不与 remote 同步,会保持在本地,同时 push 按钮会出现本地更新 commit 的次数,如果需要与远程同步,就用 push.
Branch 按钮
新建分支,或者删除现有分支
Merge 按钮
当希望将远程的其他分支并入当前分支,比如 master 更新了,希望将本地 branch1 中并入 master 的改动,那么就需要 merge.
merge 需要选择对象.比如 master 做了两个 commit 改动,G1 和 G2,只希望并入 G1,那么就选择 G1 的 master 节点,并入当前 branch1,同时处理冲突.
Merge 的意思,是将别的分支的内容,合并到当前分支,这里需要注意,合并的意思是:我知道 master 修改了,我已经将改动的部分拉回来看了,有冲突,我选择了希望保留的部分,也保留了自己想要的却和 master 不一样的部分.处理完冲突后,merge 完成,完成的内容并不是以 master 为准的.graph 会出现分支合并的形状,注意这里表示的是动作,而不是内容.我做出了合并的动作,但合并的内容还是 branch1 自己决定的.
冲突处理
冲突出现后,比如希望 merge master 的内容,点了 merge 后,出现了冲突,处理的顺序是,首先在文件中处理,哪些更新需要保留,那些需要修改;
修改完成后,重新 commit 因此,就会完成合并动作.
Pull request
这个和 Merge 就不是一个意思了,Pull request 是指将当前 branch1 的内容,提交至 master,也就是分支的工作,合并入 master 主体工作,代表着分支工作的完成,因此,预期是分支在此之后就不会再存在了,所以,流程是不同的.
Pull request 发出后,首先也是要处理冲突,选择好要处理的部分,确认提交后,就可以完成 merge 了.
这里的 merge 一旦完成,两个分支 master 和 branch1 就会保持一致了,这个和 merge 完全不同,这里的意思是:我做出了要求合并入 master 的动作,合并的内容能否通过由 master 冲突处理决定,一旦处理完成,branch1 的内容也会和处理的结果保持一致.
理论上来说,完成了 pull request 之后,分支就可以不要了,但如果想保留,其实不删除的话,还是可以继续更新的,就如同是刚刚从 master 建的分支一样.
其实,看过不少 git 的教程,但其实最真实的感受就是:你得感觉得到需求在哪里,才能理解那些设置的原因是什么.同时你得理解逻辑过程,才能理解每个操作可能出现的问题和后果.
此篇稍微记录一下对于 Git 技术债还款的第一部分.给自己点个赞
来源: http://www.jianshu.com/p/2aec4f8739d2