Git 学习

Git分支与远程操作

作者 Joan 发布时间 June 7, 2017

Git 基础

特点

Git是目前最流行的版本管理系统。Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的 整体是否发生变化 ,而大多数其他系统则只关心文件内容的具体差异。在保存到 Git 之前,所有数据都要使用 SHA-1 算法进行内容的校验和 checksum 计算,并将此结果作为数据的唯一标识和索引。

文件的三种状态

在 Git 内都只有三种状态:已提交 committed,已修改 modified 和已暂存 staged 。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

工作流程

  1. 在工作目录中修改某些文件。
  2. 对修改后的文件进行快照,然后保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。

(PS: 远程操作后面详细说明)

图1 git操作流程

Git分支

当使用 git commit 提交时,会创建一个提交对象,这个对象中包含了一个指向当前版本树的指针,还包含了一个指向上一个版本的指针。

图2 单次提交的数据结构

图3 多个提交对象之间的链接关系

Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。可以使用 git branch 命令创建不同的分支,也就是创建多个指针。

图4 多个分支指向提交数据的历史

Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。它是一个指向你正在工作中的本地分支的指针,使用 git checkout 命令来切换分支,也就是改变 HEAD 指针的指向。

图5 HEAD 指向当前所在的分支

我们可以在不同分支里反复切换,并进行不同的改变,然后在时机成熟时把它们合并到一起。跳转到 master 分支后,使用 git branch --no-merged 命令查看哪些分支还未合并。然后再使用 git merge 命令将当前分支与特定分支进行合并。

图6 需要合并的分支

合并的时候难免会遇到一些冲突,这个时候 Git 作了合并,但没有提交,它会停下来等你解决冲突。使用 git status 命令来查看冲突文件,并自行整合修改。

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

如上面提示所示,index.html 中出现了冲突,打开文件我们会在冲突的地方看到如下的提示。上面的代码表示当前分支中的内容,下面的代码表示分支 iss53 中的内容。解决冲突的办法无非是二者选其一或者由你亲自整合到一起。

<<<<<<< HEAD
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
  please contact us at support@github.com
</div>
>>>>>>> iss53

在解决了所有文件里的所有冲突后,运行 git add 将把它们标记为已解决状态(译注:实际上就是来一次快照保存到暂存区域。)再运行一次 git status 来确认所有冲突都已解决。最后用 git commit 来完成这次合并提交。

参考链接 :

https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5 http://www.ruanyifeng.com/blog/2014/06/git_remote.html