=== 图形界面

(((GUIs)))(((Graphical tools)))
Git 的原生环境是终端。
在那里，你可以体验到最新的功能，也只有在那里，你才能尽情发挥 Git 的全部能力。
但是对于某些任务而言，纯文本并不是最佳的选择；有时候你确实需要一个可视化的展示方式，而且有些用户更习惯那种能点击的界面。

有一点请注意，不同的界面是为不同的工作流程设计的。
一些客户端的作者为了支持某种他认为高效的工作流程，经过精心挑选，只显示了 Git 功能的一个子集。
每种工具都有其特定的目的和意义，从这个角度来看，不能说某种工具比其它的“更好”。
还有请注意，没有什么事情是图形界面客户端可以做而命令行客户端不能做的；命令行始终是你可以完全操控仓库并发挥出全部力量的地方。

==== `gitk` 和 `git-gui`

(((git commands, gitk)))(((git commands, gui)))(((gitk)))
在安装 Git 的同时，你也装好了它提供的可视化工具，`gitk` 和 `git-gui`。

`gitk` 是一个历史记录的图形化查看器。
你可以把它当作是基于 `git log` 和 `git grep` 命令的一个强大的图形操作界面。
当你需要查找过去发生的某次记录，或是可视化查看项目历史的时候，你将会用到这个工具。

使用 Gitk 的最简单方法就是从命令行打开。
只需 `cd` 到一个 Git 仓库，然后键入：

[source,console]
----
$ gitk [git log options]
----

Gitk 可以接受很多命令行选项，其中的大部分都直接传给底层的 `git log` 去执行了。
`--all` 可能是这其中最有用的一个, 它告诉 gitk 去尽可能地从 _任何_ 引用查找提交并显示，而不仅仅是从 HEAD。
Gitk 的界面看起来长这样：

.`gitk` 历史查看器。
image::images/gitk.png[`gitk` 历史查看器。]

这张图看起来就和执行 `git log --graph` 命令的输出差不多；每个点代表一次提交，线代表父子关系，而彩色的方块则用来标示一个个引用。
黄点表示 HEAD，红点表示尚未提交的本地变动。
下方的窗口用来显示当前选中的提交的具体信息；评论和补丁显示在左侧，摘要显示在右侧。
中间则是一组用来搜索历史的控件。

与之相比，`git-gui` 则主要是一个用来制作提交的工具。
打开它的最简单方法也是从命令行启动：

[source,console]
-----
$ git gui
-----

它的界面长这个样子：

.`git-gui` 提交工具。
image::images/git-gui.png[`git-gui` 提交工具。]

左侧是索引区；未暂存的修改显示在上方，已暂存的修改显示在下方。
你可以通过点击文件名左侧的图标来将该文件在暂存状态与未暂存状态之间切换，你也可以通过选中一个文件名来查看它的详情。

右侧窗口的上方以 diff 格式来显示当前选中文件发生了变动的地方。
你可以通过右击某一区块或行从而将这一区块或行放入暂存区。

右侧窗口的下方是写日志和执行操作的地方。
在文本框中键入日志然后点击“提交”就和执行 `git commit` 的效果差不多。
如果你想要修订上一次提交, 可以选中“修订”按钮，上次一提交的内容就会显示在“暂存区”。
然后你就可以简单的对修改进行暂存和取消暂存操作，更新提交日志，然后再次点击“提交”用这个新的提交来覆盖上一次提交。

`gitk` 和 `git-gui` 就是针对某种任务设计的工具的两个例子。
它们分别为了不同的目的（即查看历史和制作提交）而进行了精简，略去了用不到的功能。


==== Mac 和 Windows 上的 GitHub 客户端

(((GitHub for Mac)))(((GitHub for Windows)))
GitHub 发布了两个面向工作流程的 Git 客户端：Windows 版，和 Mac 版。
它们很好的展示了一个面向工作流程的工具应该是什么样子——专注于提升那些常用的功能及其协作的可用性，而不是实现 Git 的 _所有_ 功能.
它们看起来长这个样子：

.GitHub Mac 客户端。
image::images/github_mac.png[GitHub Mac 客户端。]

.GitHub Windows 客户端。
image::images/github_win.png[GitHub Windows 客户端。]

我们在设计的时候就努力将二者的外观和操作体验都保持一致，因此本章会把他们当做同一个产品来介绍。
我们并不会详细地介绍该工具的每一个功能（因为它们本身也有文档），但请快速了解一下“变更”窗口（你大部分时间都会花在使用该窗口上）的以下几点：

* 左侧是正在追踪的仓库的列表；通过点击左上方的 “+” 图标，你可以添加一个需要追踪的仓库（既可以是通过 clone，也可以从本地添加）。
* 中间是输入-提交区，你可以在这里输入提交日志，以及选择哪些文件需要被提交。
  （在 Windows 上，提交历史就显示在这个区域的下方；在 Mac 上，提交历史有一个单独的窗口）
* 右侧是修改查看区，它会告诉你工作目录里哪些东西被修改了（译注：修改模式），或选中的提交里包括了哪些修改（译注：历史模式）。
* 最后需要熟悉的是右上角的 “Sync” 按钮，你主要通过这个按钮来进行网络上的交互。

[NOTE]
====
你不需要注册 GitHub 账号也可以使用这些工具。
尽管它们是按照 GitHub 推荐的工作流程来设计的，并突出提升了一些 GitHub 的服务体验，但它们可以在任何 Git 仓库上工作良好，也可以通过网络连接到任意 Git 主机。
====

===== 安装

GitHub 的 Windows 客户端可以从 https://windows.github.com[] 下载，Mac 客户端可以从 https://mac.github.com[]下载。
第一次打开软件时，它会引导你进行一系列的首次使用设置，例如设置你的姓名和电子邮件，它还会智能地帮你调整一些常用的默认设置，例如凭证缓存和 CRLF 的处理方式。

它们都是“绿色软件”——如果软件打开发现有更新，下载和安装升级包都是在后台完成的。
为方便起见它们还打包了一份 Git，也就是说你一旦安装好就再也无需劳心升级的事情了。
Windows 的客户端还提供了快捷方式，可以启动装了 Posh-git 插件的 Powershell，在本章的后面一节我们会详细介绍这方面的内容。

接下来我们给它设置一些工作仓库。
客户端会显示你在 GitHub 上有权限操作的仓库的列表，你可以选择一个然后一键克隆。
如果你本地已经建立了仓库，只需要用鼠标把它从 Finder 或 Windows 资源管理器拖进 GitHub 客户端窗口，就可以把该仓库添加到左侧的仓库列表里面去了。

===== 推荐的工作流程

安装并配置好以后，你就可以使用 GitHub 客户端来执行一些常见的 Git 任务。
该工具所推荐的工作流程有时也被叫做 “GitHub 流”。
我们在 <<ch06-github#r_github_flow>> 一节中对此有详细的介绍，其要点是 (a) 你会提交到一个分支；(b) 你需要经常与远程仓库保持同步。

两个平台上的客户端在分支管理上有所不同。
在 Mac 上，创建分支的按钮在窗口的上方：

.Mac 上的“创建分支”按钮。
image::images/branch_widget_mac.png[Mac 上的“创建分支”按钮。]

在 Windows 上，你可以通过在分支切换挂件中输入新分支的名称来完成创建：

.在 Windows 上创建分支。
image::images/branch_widget_win.png[在 Windows 上创建分支。]

分支创建好以后，新建提交就变得非常简单直接了。
现在工作目录中做一些修改，然后切换到 GitHub 客户端窗口，你所做的修改就会显示在那里。
输入提交日志，选中那些需要被包含在本次提交中的文件，然后点击“提交”按钮（也可以在键盘上按 ctrl-enter 或 ⌘-enter）。

“同步”功能是你在网络上和其它仓库交互的主要途径。
push，fetch，merge，和 rebase 在 Git 内部是一连串独立的操作, 而 GitHub 客户端将这些操作都合并成了单独一个功能。
你点击同步按钮时实际上会发生如下这些操作：

. `git pull --rebase`。
  如果上述命令由于存在合并冲突而失败，则会退而执行 `git pull --no-rebase`。
. `git push`。

如果你遵循推荐的工作流程，以上就是最常用的一系列命令，因此将它们合并为一个让事情简单了很多。

===== 小结

这些工具是为其各自针对的工作流程所量身定做的。
开发者和非开发者可以轻松地在分分钟内就搭建起项目协作环境，它们还内置了其它辅助最佳实践的功能。
但是，如果你的工作流程有所不同，或者你需要在进行网络操作时有更多的控制，那么建议你考虑一下其它客户端或者使用命令行。


==== 其它图形界面

除此之外，还有许许多多其它的图形化 Git 客户端，其中既有单一功能的定制工具，也有试图提供 Git 所有功能的复杂应用。
Git 的官方网站整理了一份时下最流行的客户端的清单 http://git-scm.com/downloads/guis[]。
在 Git 的维基站点还可以看到一份更全的清单 https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Graphical_Interfaces[].
