Git
Git 属于分散型版本管理系统,是为版本管理而设计的软件
Subversion 集中型版本管理系统

集中型将所有数据集中存放在服务器当中,有便于管理的优点。但是一旦开发者所处的环境不能连接服务器,就无法获取最新的源代码,开发也就几乎无法进行
Git 分散型版本管理系统
GitHub 将仓库 Fork 给了每一个用户。Fork 就是将 GitHub 的某个特定仓库复制到
自己的账户下。Fork 出的仓库与原仓库是两个不同的仓库
只要脑中掌握了多个仓库并存的概念,学习分散型并不是什么难事

如图所示,分散型拥有多个仓库,相对而言稍显复杂。不过,由于本地的开发环境中就有仓库,所以开发者不必连接远程仓库就可以进行开发
安装Git
初始设置
设置姓名和邮箱地址
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email@example.com"
会在“~/.gitconfig”中以如下形式输出设置文件
[user]
name = Firstname Lastname
email = your_email@example.com
提高命令输出的可读性
将 color.ui 设置为 auto 可以让命令的输出拥有更高的可读性
git config --global color.ui auto
“~/.gitconfig”中会增加下面一行。
[color]
ui = auto
注册GitHub
设置 SSH Key
GitHub 上连接已有仓库时的认证,是通过使用了 SSH 的公开密钥认证方式进行的。现在让我们来创建公开密钥认证所需的 SSH Key,并将其添加至 GitHub
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key
(/Users/your_user_directory/.ssh/id_rsa): 按回车键
Enter passphrase (empty for no passphrase): 输入密码
Enter same passphrase again: 再次输入密码
输入密码后会出现以下结果
Your identification has been saved in /Users/your_user_directory/.ssh/id_rsa.
Your public key has been saved in /Users/your_user_directory/.ssh/id_rsa.pub.
The key fingerprint is:
fingerprint值 your_email@example.com
The key's randomart image is:
+--[ RSA 2048]----+
| .+ + |
| = o O . |
id_rsa 文件是私有密钥,id_rsa.pub 是公开密钥。
添加公开密钥
在 GitHub 中添加公开密钥,今后就可以用私有密钥进行认证了
点击右上角的账户设定按钮(Account Settings),选择 SSH Keys 菜单。点击 Add SSH Key 之后,会出现如图 3.2 的输入框

Key 部分请粘贴 id_rsa.pub
文件里的内容。id_rsa.pub
的内容可以用如下方法查看

$ cat ~/.ssh/id_rsa.pub
ssh-rsa 公开密钥的内容 your_email@example.com
验证
添加成功之后,创建账户时所用的邮箱会接到一封提示“公共密钥添加完成”的邮件,完成以上设置后,就可以用手中的私人密钥与 GitHub 进行认证和通信了
$ ssh -T git@github.com
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is fingerprint值 .
Are you sure you want to continue connecting (yes/no)? 输入yes

实际操作
创建仓库
- Repository name 输入仓库的名称
- Description 仓库的说明 不是必需项
- Public、Private
- README 如果想向 GitHub 添加手中已有的 Git 仓库,建议不要勾选,直接手动 push
- Add .gitignore 不需要在Git仓库中进行版本管理的文件记录
连接仓库
https://github.com/用户名/Hello-Word
一般会在这个文件中标明本仓库所包含的软件的概要、使用流程、许可协议等信息。如果使用Markdown 语法进行描述,还可以添加标记,提高可读性
公开代码
- clone 已有仓库
git clone git@github.com:hirocastest/Hello-World.git
- 编写代码
- 提交
git add .
git commit -m '提交信息'
git push
git log
学习Git
基本操作
git int——初始化仓库
git init命令的目录下就会生成 .git 目录。这个 .git 目录里存储着管理当前目录内容所需的仓库数据
$ mkdir git-tutorial
$ cd git-tutorial
$ git init
我们将这个目录的内容称为“附属于该仓库的工作树”。
文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件
的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前
的快照,在工作树中打开。开发者可以通过这种方式获取以往的文件
git status——查看仓库的状态
git add——向暂存区中添加文件
git commit——保存仓库的历史记录
- 中止提交:如果在编辑器启动后想中止提交,请将提交信息留空并直接关闭编
辑器,随后提交就会被中止
git log——查看提交日志
- 只显示提交信息的第一行
$ git log --pretty=short
- 只显示指定目录、文件的日志
$ git log README.md
- 显示文件的改动
$ git log -p
比如,执行下面的命令,就可以只查看 README.md 文件的提交日
志以及提交前后的差别
$ git log -p README.md
git diff——查看更改前后的差别
- 查看工作树和暂存区的差别
“+”号标出的是新添加的行,被删除的行则用“-”号标出
git diff
- 查看工作树和最新提交的差别
好习惯:在执行 git commit命令之前先执行git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。这里的 HEAD 是指向当前分支中最新一次提交的指针
$ git diff HEAD
分支的操作
灵活运用分支,可以让多人同时高效地进行并行开发
从 master 分支创建 feature - A 分支和 fix - B 分支,每个分支中都拥有自己的最新代码。master 分支是 Git 默认创建的分支,因此基本上所有开发都是以这个分支为中心进行的

不同分支中,可以同时进行完全不同的作业,等该分支的作业完成之后再与 master 分支合并。比如 feature-A 分支的作业结束后与 master合并

git branch——显示分支一览表
$ git branch
git checkout -b——创建、切换分支
$ git checkout -b feature-A
$ git branch feature-A
$ git checkout feature-A
//说明当前分支切换到了feature-A下了
$ git branch
* feature-A
master
-
切换到 feature - A 分支并进行提交
$ git add README.md $ git commit -m "Add feature-A" [feature-A 8a6c8b9] Add feature-A 1 file changed, 2 insertions(+)
-
切换到 master 分支
eature-A 分支的更改不会影响到master 分支,这正是在开发中创建分支的优点.只要创建多个分支,就可以在不互相影响的情况下同时进行多个功能的开发。
bash $ git checkout master
-
切换回上一个分支
"-”(连字符)代替分支名,就可以切换至上一个分支。当然,将“-”替换成 feature-A 同样可以切换到 feature-A 分支
bash $ git checkout -
特性分支
顾名思义,是集中实现单一特性(主题),除此之外不进行任何作业的分支
之前我们创建了 feature-A 分支,这一分支主要实现 feature-A,除feature-A 的实现之外不进行任何作业。即便在开发过程中发现了 BUG,也需要再创建新的分支,在新分支中进行修正
主干分支
主干分支是刚才我们讲解的特性分支的原点,同时也是合并的终点。通常人们会用 master 分支作为主干分支
git merge——合并分支
假设 feature-A 已经实现完毕,想要将它合并到主干分支 master 中
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff feature-A
git log -- graph——以图表形式查看分支
git log --graph命令也可以用图表形式输出提交日志,非常直观
更改提交的操作
git reset——回溯历史版本
为了让各位熟悉对历史版本的操作,我们先回溯历史版本,创建一个名为 fix-B 的特性分支

1. 回溯到创建 feature - A 分支前
要让仓库的 HEAD、暂存区、当前工作树回溯到指定状态,需要用到 git rest --hard命令
$ git reset --hard fd0cbf0d4a25f747230694d95cac1be72d33441d
我们已经成功回溯到特性分支(feature-A)创建之前的状态
2. 创建 fix - B 分支
在 README.md 文件中添加一行文字
$ git checkout -b fix-B
$ git add README.md
$ git commit -m "Fix B"
3. 主干分支合并 feature-A 分支的修改后,又合并了 fix-B 的修改

4. 推进至 feature - A 分支合并后的状态
git log命令只能查看以当前状态为终点的历史日志
即便开发者错误执行了 Git 操作,基本也都可以利用 git reflog命令恢复到原先的状态,
消除冲突
git merge --no-ff fix-B
系统告诉我们 README.md 文件发生了冲突(Conflict)。系统在合并 README.md 文件时,feature-A 分支更改的部分与本次想要合并的 fix-B 分支更改的部分发生了冲突
查看冲突部分并将其解决
在编辑器中将其改成想要的样子
提交解决后的结果
冲突解决后,执行 git add命令与 git commit命令。
git commit -- amend——修改提交信息
在合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,不妨提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一个历史记录。这是个会经常用到的技巧
推送至远程仓库
远程仓库顾名思义,是与我们本地仓库相对独立的另一个仓库
为防止与其他仓库混淆,仓库名请与本地仓库保持一致
- git remote add——添加远程仓库
Git 会自动将远程仓库的名称设置为 origin(标识符)
git remote add origin git@XXXXXX
- git push——推送至远程仓库
如果想将当前分支下本地仓库中的内容推送给远程仓库,需要用到git push命令。现在假定我们在 master 分支下进行操作,像这样执行 git push命令,当前分支的内容就会被推送给远程仓库origin 的 master分支
git push -u origin master
除了 master 分支之外,远程仓库也可以创建其他分支
我们在本地仓库中创建 feature-D 分支,并将它以同名形式 push 至远程仓库
$ git checkout -b feature-D
Switched to a new branch 'feature-D'
我们在本地仓库中创建了 feature-D 分支,现在将它 push 给远程仓库并保持分支名称不
$ git push -u origin feature-D
网友评论