Git 是 分布式版本管理工具。因为这里在开发后台时候使用,所以写在后台开发相关的分类下。
1. 简介
Git 是最先进的分布式版本管理工具。具体用起来就像下图这样。可以看到,对于每一个版本,都会有修改的具体说明,这样一来,方便我们进行版本控制、切换等。
2. 使用
安装完成就可以使用了。
这里我在 windows 下使用 git。其实最好还是在 linux 下来用。
word 文件作为二进制的文件,不能被 Git 跟踪。
2.1 建立版本库
git init // 初始化 版本库 命令
在相应的目录下,使用 git init 命令。可以看到在对应的目录下生成了 一个 .git 隐藏文件,这里面写的就是文件版本管理控制的相关信息,不能被篡改(所以才是隐藏的)。
2.2 添加文件到版本库
git add [FileName1]
git add [FileName2] // 添加 多个文件
git commit -m "[Description]" // 提交。 -m 后面是本次提交 的 说明
这里,建立一个 txt 文件,写入 两行 文字,然后add 和 commit
2.3 版本回退
这里修改一哈 test.txt 文件,在第二行最后加入 BEST,然后 使用 git status 命令查看仓库状态。可以看到,当前 test.txt 被修改,但是还没有提交。
如果我们要看 改了 什么内容,使用 git diff 命令。可以看到,红色哪一行代表的是更改之前版本,绿色是更改之后的,所以是在那一句后面 加了 BEST。
之后进行提交。
之后查看一下 status ,可以看到 working tree clean.
再提交一个新的版本。
这时候看一下历史版本,使用
git log // --pretty=oneline
这时候可以看到我们一共提交了3个版本的文档,对应的有 ID(使用哈希加密算法算出来的一大串数字,为了在分布式工作时候不会产生冲突)、备注等。现在我们想要把版本回退到 "append REEDIT" 的版本。
Git 用 HEAD 表示当前的版本,上一个版本就是 HEAD^,依次类推,HEAD~100
git reset --hard HEAD^ // 回退到上一个版本
这时候还是可以到第三个版本的。只需要找到第三个版本的 ID 号即可。
git reflog // 记录每一次命令
3. 相关知识
3.1 工作区和暂存区
使用 git add 命令就是把 工作区 添加到 暂存区;
使用 git commit 命令就是把 暂存区所有的文件添加到当前分支。
仍然是之前的多次 add , 一次 commit 的关系。
3.2 管理修改
这里要明白一个概念就是说 Git 是管理的修改信息,而不是直接管理文件的。所以如果执行 修改1--> add 1 -->修改2-->commit,这个时候可以看到只是保存了 修改1 对应的内容。
3.3 撤销修改
git checkout -- [FILENAME] // 用 版本库 里 的版本 替换 工作区 的版本。
这里有两种情况:
一种是 没有 add到 暂存区,这时候撤销就是 回到 .git 版本库中的版本
一种是 没有 commit 之前又 进行了修改,这时候撤销就是 回到 暂存区 的状态。 ( 暂存区也是版本库中的)
总之就是 回到 git commit 或者 git add 的 最近一次有记录的版本。
git reset HEAD test.txt // 可以把 暂存区 的 test.txt 退回到 工作区
之前说的是版本回退用 git reset HEAD --hard 命令。 这里也可以 进行回退工作。
git rm [FILENAME] 用来删除 .git 版本库中的文件
这里的情景是你手动在文件目录中删除了 test.txt 文件,然后可以查看 status 看到其文件被删除,但是这个时候在版本库中还是有 这个文件的,为了做到对应,用 git rm 命令删除版本库中的文件。
4. 远程仓库
4.1 关联远程仓库
这一部分是最常用的了。
这里用本地仓库来关联 github 上面的远程仓库。
首先申请一个 github 的账号,然后 新建一个 repository。
这里本地关联线上仓库需要 SSH key 用于安全验证,向 github 证明是你自己进行上传。所以需要首先配置一下 SSH key 相关。在本地 配置一个 SSH key,然后在 github 的账号设置里面把 本地的 SSH key 公钥写进去。
windows 下 shift+右键 打开 git bash. 然后 ssh-keygen -t rsa -C "[EmailAddr]" 就生成了 SSH keys. 在 Windows 下就是 c/users/username/.ssh 目录下 就会有 SSH keys 配置文件。id_rsa 是私钥,id_rsa.pub是公钥。
然后进行关联。这里 git remote add [RemoteRepName] [RemoteAddr]。默认用了 origin ,一般看到这个 origin 都知道是远程仓库。
然后可以 push 一哈。push 命令就是把本地仓库的指定分支都 push 到线上仓库。可以看到这里的 git push origin master 把本地 master 分支 push 到 origin.
可以看到线上的 Github 已经有了
4.2 分支
分支就好像是在 master 之前跑的一点的一个进度。如果你在开发工程,自己写的代码还没有确定是万无一失的,就需要一个分支,先存下来,而这个分支不会影响 master 中的代码。
我们看一下具体的例子。
在线上建立一个 名为 gitskills 仓库。然后 git clone 下来。
创建一个 dev 分支
git branch dev // 创建
git checkout dev // 切换
然后 git branch 查看分支。带 * 的是当前分支
然后更改 readme.md,之后提交更改。
之后切换到 master 分支,发现在 dev 分支里面做的更改,已经看不到了。说明 dev 分支和 master 分支是独立的。
现在合并分支,可以看到,dev 分支被合并到 master 分支,里面的更改是可见的了。
git merge [BranchName] #合并分支到当前分支。
分支合并之后,删除之前的分支,世界又清净整洁了。
解决冲突
建立一个 feature1 分支,然后在该分支下 编辑 readme.md 之后提交;然后在 master 分支下也编辑 提交。两次编辑的内容不同。这时候 merge 就会产生 conflict
这时候查看 文件。看到了不同的地方,然后手动 更改。
之后再提交,可以看到 conf 解决了,合并成功了。可以删除 feature1 分支了。
git log --graph 可以查看分支合并图
no-ff 模式合并
直接用 merge 都是普通合并模式,采用 fast-foward 方式合并。如果加参数 --no-ff 则是 recursive 方式合并。
这种合并方式要提交一个新的 commit ,所以要加一个 -m 参数。
no-ff 和普通合并的区别在于,no-ff 方式可以保留分支历史。
分支策略
一张图说明分支策略。即 master 只用来做新版本发布,开发都在 dev,每个人又有自己的分支。
5. 常用操作
git push # 自然要求是有 remote 仓库的。 这个时候不用指定分支,直接是之前 clone 的分支
git commit 操作之后会自动生成一个版本序列号。然后 git push 把本地仓库的版本序列号同步到远程仓库
git clone # 将远程仓库 clone 下来
这个操作会自动和被克隆的仓库 remote 连接。
git fetch
首先要了解 FETCH_HEAD:是一个版本链接文件,记录在 .git/ 目录下,记录着 目前已经从远程仓库取下来的分支的末端版本(即取的时候的最新版本)。
而 git fetch 命令就是 更新远程仓库中包含分支的最新版本号,记录到本地FETCH_HEAD文件中(即将本地版本和远程最新版本对应起来。)
git pull
其实 git pull 相当于一个复合命令。
首先,基于本地的 FETCH_HEAD 记录,比对本地的 FETCH_HEAD 记录与远程仓库的版本号,然后 git fetch 获取当前指向分支的后续版本数据,然后利用 git merge 将其与本地的当前分支合并。
总之,就是把当前分支的最新的版本从远程仓库拉下来,与本地仓库的版本来 merge 一哈。