Git 初学者:权威的实用指南

好的,在看到PJ Hyett 的这篇文章之后,我决定跳到最后,选择Git

因此,我需要的是 Git 的初学者实用指南。 “初学者” 被定义为知道如何处理其编译器,在某种程度上了解Makefile是什么,并且在不十分了解它的情况下接触了源代码控制的人。

“实用” 被定义为该人员不想深入了解 Git 在后台执行的操作,甚至不关心(或知道)它的分发。您的答案可能暗示了这种可能性,但请尝试针对希望将 “主” 存储库保留在已备份且安全的 “服务器” 上的初学者,并将其本地存储库视为 “客户端” 资源。

所以:

安装 / 设置

使用代码

标记,分支,发布,基准

其他

其他 Git 初学者参考

钻研 Git

我将不时浏览这些条目并对其进行 “整理”,以使它们具有一致的外观 / 感觉,并且可以轻松地扫描列表 - 随意遵循简单的 “标题 - 简要说明 - 指令列表 - 陷阱和额外信息” 模板。我还将链接到上面项目符号列表中的条目,因此以后可以轻松找到它们。

答案

您如何创建一个新的项目 / 存储库?

git 存储库只是一个包含特殊.git目录的目录。

这与 “集中式” 版本控制系统(如 Subversion)不同,在 “集中式” 版本控制系统中,“存储库” 托管在远程服务器上,您可以将其checkout到 “工作副本” 目录中。使用 git,您的工作副本就是存储库。

只需在包含您要跟踪的文件的目录中运行git init

例如,

cd ~/code/project001/
git init

这将在当前目录中创建一个.git (隐藏)文件夹。

要创建新项目,请使用附加参数(要创建的目录的名称)运行git init

git init project002

(This is equivalent to: mkdir project002 && cd project002 && git init)

要检查当前当前路径是否在 git 存储库中,只需运行git status如果它不是存储库,它将报告 “严重:不是 git 存储库”

您还可以列出.git目录,并检查它是否包含类似于以下内容的文件 / 目录:

$ ls .git
HEAD         config       hooks/       objects/
branches/    description  info/        refs/

如果出于某种原因您希望 “解散” 存储库(您希望停止使用 git 跟踪该项目)。只需在存储库的基础级别上删除.git目录。

cd ~/code/project001/
rm -rf .git/

注意:这将销毁所有修订历史记录, 所有标签以及 git 所做的所有事情。它不会触摸 “当前” 文件(您当前可以看到的文件),但是以前的更改,已删除的文件等将无法恢复!

git 的 GUI


Git GUI

包含在 git 中 - 从命令行运行git gui ,Windows msysgit安装程序将其添加到 “开始” 菜单中。

Git GUI 可以完成 git 所需的大部分工作。包括阶段更改,配置 git 和存储库,推送更改,创建 / 签出 / 删除分支,合并以及许多其他功能。

我最喜欢的功能之一是右键单击菜单中的 “stage line” 和 “stage hunk” 快捷方式,使用它们可以提交文件的特定部分。您可以通过git add -i实现相同的功能,但我发现它更易于使用。

它不是最漂亮的应用程序,但是它几乎可以在所有平台上运行(基于 Tcl / Tk)

屏幕截图 截屏


吉特

也包含在 git 中。它是一个 git 历史记录查看器,可让您可视化存储库的历史记录(包括分支,在创建和合并时)。您可以查看和搜索提交。

与 git-gui 配合得很好。


吉特努布

Mac OS X 应用程序。主要等效于git log ,但与github集成了一些功能(例如 “网络视图”)。

外观漂亮,适合 Mac OSX。您可以搜索存储库。 Gitnub 的最大批评是,它以线性方式(一次单个分支)显示历史 - 它没有可视化分支和合并,这对 git 可能很重要,尽管这是计划中的改进。

下载链接,更改日志和屏幕截图 | git 仓库


GitX

打算成为 “OS X 的 gitk 克隆”。

它可以可视化非线性分支历史记录,执行提交,查看和搜索提交,并且还具有其他一些不错的功能,例如能够 “快速查找” 任何修订版中的任何文件(在文件列表视图中按空格),导出任何文件。 (通过拖放)。

git-gui / gitk ,它与 OS X 的集成要好得多,并且即使在存储库非常大的情况下,它也快速稳定。

原始的 git 信息库最近未更新(在撰写本文时已超过一年)。在brotherbard / gitx 上可以找到维护更积极的分支 - 它添加了 “侧边栏,获取,拉取,推送,添加远程,合并,cherry-pick,变基,克隆,克隆到”

资料下载 屏幕截图 git 仓库 | 兄弟叉 | 劳伦叉


SmartGit

从首页:

SmartGit 是分布式版本控制系统 Git 的前端,可在 Windows,Mac OS X 和 Linux 上运行。 SmartGit 适用于那些喜欢图形用户界面而不是命令行客户端的开发人员,以利用 Git(当今功能最强大的 DVCS)提高生产力。

您可以从他们的网站下载它。

下载


龟龟

Windows 用户的 TortoiseSVN Git 版本。

它将 TortoiseSVN 移植到 TortoiseGit 最新版本 1.2.1.0。此版本可以完成常规任务,例如提交,显示日志,差异两个版本,创建分支和标记,创建补丁等。请参见发布记录的细节。欢迎为这个项目做贡献。

下载


QGit

QGit 是基于 Qt / C ++ 的 git GUI 查看器。

使用 qgit,您将能够以图形方式遵循不同的开发分支来浏览修订历史记录,查看补丁内容和更改的文件。

下载


gitg

gitg 是针对 gtk + / GNOME 的 git 存储库查看器。其主要目标之一是为跨多个桌面的 git 前端提供更统一的用户体验。它不是在编写跨平台应用程序,而是与其他操作系统(例如 OS X 的 GitX)的类似客户端紧密协作。

特征

  • 浏览修订历史记录。
  • 处理大型存储库(在 1 秒内加载 linux 存储库,17000 多个修订版)。
  • 提交更改。
  • 舞台 / 不舞台个人大块头。
  • 还原更改。
  • 显示修订更改的彩色差异。
  • 浏览树中的给定修订版。
  • 导出给定修订版的树的一部分。
  • 提供诸如 ``git log'' 之类的命令可以理解的任何 refspec 来建立历史记录。
  • 在历史记录视图中显示并在分支之间切换。

下载: 版本


彩盒

Gitbox 是用于 Git 版本控制系统的 Mac OS X 图形界面。在一个窗口中,您可以看到分支,历史记录和工作目录状态。

日常操作很容易:通过复选框进行和不进行阶段更改。只需单击即可提交,拉动,合并和推动。双击更改以显示与 FileMerge.app 的差异。

下载


吉蒂

Gity 网站没有太多信息,但是从那里的屏幕截图来看,它似乎是功能丰富的开源 OS X git gui。

下载来源


融化

Meld 是视觉差异和合并工具。您可以比较两个或三个文件并在适当位置进行编辑(差异会动态更新)。您可以比较两个或三个文件夹并启动文件比较。您可以从流行的版本控制系统(例如 CVS,Subversion,Bazaar-ng 和 Mercurial [ 和 Git ])中浏览和查看工作副本。

资料下载


片假名

Steve Dekorte 的 OSX 版 Git GUI。

一目了然,看看哪些远程分支有更改要拉,而本地存储库有更改要推。支持 add,commit,push,pull,tag 和 reset 的 git ops,以及项目差异的可视化差异和可视浏览,突出显示了本地更改和添加。

1 个存储库免费,25 美元以上。

下载


新芽(以前是 GitMac)

致力于使 Git 易于使用。具有本机可可(类似于 Mac)的 UI,快速的存储库浏览,克隆,推 / 拉,分支 / 合并,可视化差异,远程分支,易于访问终端等。

通过使最常用的 Git 操作直观且易于执行,Sprout(以前称为 GitMac)使 Git 变得用户友好。与大多数 Git 工作流程兼容,Sprout 非常适合设计师和开发人员,团队协作以及高级用户和新手使用。

资料下载 网站


Mac OSX 的功能丰富的 Git GUI。 30 天免费试用,单用户许可证 $ 59USD。

资料下载 网站


EGit

EGit 是 Git 版本控制系统的 Eclipse Team 提供程序。 Git 是一个分布式 SCM,这意味着每个开发人员都拥有该代码每个修订版本的所有历史记录的完整副本,从而使对历史记录的查询非常快速且通用。

EGit 项目正在 Git 的 JGit Java 实现之上实现 Eclipse 工具。

资料下载 网站


Git 扩展

Windows 开源 - 在单个软件包中安装使用 Git 所需的所有内容,易于使用。

Git Extensions 是一个工具包,可以使在 Windows 上使用 Git 更加直观。该外壳扩展将在 Windows 资源管理器中整合在一起,并在文件和目录上显示一个上下文菜单。还有一个 Visual Studio 插件可以使用 Visual Studio 中的 git。

下载

非常感谢dbr精心制作 git gui 的东西。


源树

SourceTree 是 Git,Mercurial 和 SVN 的免费 Mac 客户端。它由 AtBussian(BitBucket 背后的人)构建,似乎可以与任何 VC 系统同样出色地工作,该系统可以让您掌握用于所有项目的单个工具,但是它们受版本控制。功能丰富且免费。

专为新手和高级用户准备的专家级功能包:

查看传出和传入变更集。分支之间的樱桃采摘。补丁处理,变基,隐藏 / 搁置等。

资料下载 网站


好吧,尽管您实际上要求我们不要 “简单地” 链接到其他资源,但是当已经存在一个确实不错的社区增长(并且正在增长)的资源时,这是非常愚蠢的: Git 社区书 。认真地讲,一个问题中的 20 多个问题将变得简洁而一致。 Git 社区书籍既有 HTML 格式,也有 PDF 格式,并以清晰,格式正确且经过同行评审的答案以及可以让您直接跳到您所遇到的问题的格式来回答您的许多问题。

las,如果我的帖子真的让您不高兴,那么我将其删除。只是这样说。

如何配置它以忽略文件:

git 忽略您不希望其跟踪的文件的功能非常有用。

要忽略一个文件或一组文件,请提供一个模式。 git 的模式语法相当简单,但是功能强大。它适用于下面将提到的所有三个不同文件。

  • 空行不忽略任何文件,通常用作分隔符。
  • 开头的行用作注释。
  • 前缀是可选的,将否定模式。匹配的所有否定模式将覆盖优先级较低的模式。
  • 支持高级表达式和通配符
    • 例如:模式: *。[oa]将忽略存储库中所有以. o 或. a 结尾的文件(对象和归档文件)
  • 如果某个模式的目录以斜杠结尾,则 git 只匹配该目录及其下的路径。这从匹配中排除常规文件和符号链接。
  • 前导斜杠将匹配该路径名中的所有文件。
    • 例如:模式/*.c将匹配文件foo.c,但不匹配bar / awesome.c

gitignore(5)手册页中的好例子:

$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
#       Documentation/gitignore.html
#       file.o
#       lib.a
#       src/internal.o
[...]
$ cat .git/info/exclude
  # ignore objects and archives, anywhere in the tree.
  *.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
[...]

通常,有三种不同的方法可以忽略未跟踪的文件。

1)忽略存储库的所有用户:

将一个名为.gitignore的文件添加到您的工作副本的根目录中。

编辑.gitignore以匹配您应该 / 不应忽略的文件的首选项。

git add .gitignore

完成后再提交。

2)只忽略您的存储库副本:

使用您的首选模式在工作副本中添加 / 编辑文件$ GIT_DIR / info / exclude

例如:我的工作副本是〜/ src / project1,所以我要编辑〜/ src / project1 / .git / info / exclude

你完成了!

3)在任何情况下,请忽略您的系统:

您系统的全局忽略模式可以放在一个您想要的文件中。

我的个人称为〜/ .gitglobalignore

然后,我可以通过以下行编辑〜/ .gitconfig文件来让 git 知道该文件:

core.excludesfile = ~/.gitglobalignore

你完成了!

我发现gitignore手册页是获取更多信息的最佳资源。

您如何 “标记” 一组特定的修订

您如何为一组特定的文件 “标记”,“标记” 或 “发布” 一组特定的修订版本,以便您以后可以随时将其拉出?

使用git tag命令。

要简单地 “标记” 当前修订,就可以运行。

git tag -a thetagname
git tag -a 0.1
git tag -a 2.6.1-rc1 -m 'Released on 01/02/03'

要列出当前标签,只需运行不带参数的git tag-l (小写 L):

$ git tag -a thetagname # and enter a message, or use -m 'My tag annotation'
$ git tag -l
thetagname

要删除标签,请使用-d标志:

$ git tag -d thetagname 
Deleted tag 'thetagname'
$ git tag
[no output]

要标记特定(先前)的提交,只需执行..

git tag [tag name] [revision SHA1 hash]

例如:

git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b

注意:默认情况下,git 创建一个 “轻量级” 标签(基本上是对特定版本的引用)。 “正确” 的方法是使用-a标志。这将启动您的编辑器,要求您提供标记消息(与要求提交消息相同,您也可以在命令行上使用-m标志来提供标记消息)。使用带注释的标记会创建一个具有自己的 ID,日期,标记(作者)和可选的 GPG 签名的对象(使用-s标记)。 有关此的更多信息,请参阅这篇文章

git tag mytagwithmsg -a -m 'This is a tag, with message'

要列出带有注释的标签,请使用-n1标志显示每个标签消息的第一行( -n245显示每个注释的前 245 行,依此类推):

$ git tag -l -n1
mytagwithmsg    This is a tag, with message

有关更多信息,请参见git-tag(1)手册页

GIT 的工作流程示例。

Git 非常灵活,可以很好地适应任何工作流程,但是不执行特定的工作流程可能会带来负面影响,使您难以理解除了线性 “备份” 工作流程以外,您可以用 git 做些什么,例如分支的有用程度。

这篇博客很好地解释了一个非常简单但有效的工作流程,使用 git 可以很容易地对其进行设置。

引用博客文章:我们认为 origin / master 是 HEAD 源代码始终反映生产就绪状态的主要分支:

工作流已经变得非常流行,以至于创建了一个实现该工作流的项目: git-flow

一个简单的工作流程的很好的说明,您可以在开发中进行所有更改,并且仅在代码处于生产状态时才推动掌握:

简单的工作流程

现在,假设您要使用新功能或重构模块。您可以创建一个新分支,我们称之为 “功能” 分支,这将花费一些时间,并且可能会破坏一些代码。一旦您的功能 “足够稳定” 并想将其 “更紧密地” 投入生产,就可以将功能分支合并到开发中。当合并后所有的错误都已解决,并且您的代码通过了所有测试之后,您将所做的更改推送到了 master 中。

在所有这些过程中,您会发现一个严重的安全错误,必须立即修复。您可能有一个叫做 hotfix 的分支,该分支进行的更改比正常的 “develop” 分支更快地将其推回到生产环境中。

在这里,您可以说明此功能 / 修补程序 / 开发 / 生产工作流程的外观(在博客文章中对此进行了很好的解释,我重复一遍,该博客文章比我更详细地解释了整个过程,并且比我做得更好。 。

Git工作流程示例

这是 PJ Hyett 的帖子的副本,因为它不再可用:

Git 并不难

2008 年 11 月 23 日

当我们告诉人们为什么他们应该在 Subversion 上使用 Git 时,转到的行是:“Git 比 Subversion 做得更好,但它做得更多。”

“很多” 由使 Git 真正发光的一堆东西组成,但是对于来自其他 SCM(例如 Subversion)的那些人来说可能是不堪重负。

就是说,没有什么可以阻止您使用 Git 的,就像您在进行过渡时使用 Subversion 一样。

假设您已经安装了必要的软件并且在某个地方有一个远程存储库,这就是您如何获取代码并将更改推回 Subversion 的方式:

$ svn checkout svn://foo.googlecode.com/svn/trunk foo
# make your changes
$ svn commit -m "my first commit"

以及如何在 Git 中做到这一点:

$ git clone git@github.com:pjhyett/foo.git
# make your changes
$ git commit -a -m "my first commit"
$ git push

另一个使它在 Git 中实现的命令。这个额外的命令具有很大的含义,但是出于本文的目的,这就是我们正在讨论的一个额外的命令。

瞧,真的不那么难。

更新:我也不会忘记,与 Git 相比,在 Subversion 中更新本地副本的等效方式分别是svn updategit pull 。在两种情况下都只有一个命令。

如何安装 Git

在 Windows 上:

安装msysgit

有几个下载:

  • Git:除非特别需要以下其他选项之一,否则请使用此选项。
  • PortableGit:如果要在 PC 上运行 Git 而不在该 PC 上安装(例如,从 USB 驱动器运行 Git),请使用此选项
  • msysGit:如果您想自己开发 Git,请使用它。如果你只是想使用 Git 的为你的源代码,但不希望编辑Git 的源代码,你不需要这个。

这还会安装 Cygwin bash 外壳程序,因此您可以在更好的外壳程序(而不是 cmd.exe)中使用git ,还包括 git-gui(可通过git gui命令或 “ Start > All Programs > Git菜单访问)

Mac OS X

使用git-osx-installer ,或者您也可以从源代码安装

通过包管理器

使用您的本机软件包管理器安装git 。例如,在 Debian(或 Ubuntu)上:

apt-get install git-core

或在 Mac OS X 上,通过MacPorts

sudo port install git-core+bash_completion+doc

… 或芬克:

fink install git

… 或自制软件

brew install git

在基于 Red Hat 的发行版上,例如 Fedora:

yum install git

在 Cygwin 中,可以在 “开发” 部分下找到 Git 软件包

从源(Mac OS X / Linux / BSD / 等)

在 Mac OS X 中,如果安装了开发人员工具,则可以非常轻松地从源代码编译 Git。从http://git-scm.com/下载最新版本的 Git 作为.tar.bz.tar.gz并解压缩(在 Finder 中双击)

在 Linux / BSD / etc。应该差不多。例如,在 Debian(和 Ubuntu)中,您需要通过apt安装build-essential软件包。

然后在终端中, cd到您提取文件的位置(运行cd ~/Downloads/git*/应该可以),然后运行。

./configure && make && sudo make install

这会将 Git 安装到默认位置( /usr/local - git将在/usr/local/bin/git

它将提示您输入密码(对于sudo ),这样它可以写入/usr/local/目录,该目录只能由 “root” 用户访问,因此需要 sudo!

如果您要将其安装在单独的位置(因此 Git 的文件不会与其他工具混在一起),请在配置命令中使用--prefix

./configure --prefix=/usr/local/gitpath
make
sudo make install

这会将git二进制文件安装到/usr/local/bin/gitpath/bin/git - 因此您不必每次都键入该二进制文件,您应该通过在~/.profile添加以下行来将其添加到$PATH ~/.profile

export PATH="${PATH}:/usr/local/bin/gitpath/bin/"

如果您没有 sudo 访问权限,则可以使用--prefix=/Users/myusername/bin并安装到主目录中。记住将~/bin/添加到$PATH

脚本x-git-update-to-latest-version自动执行许多操作:

该脚本更新了我的 git repo 本地副本(本地语言位于~/work/track/git ),然后进行配置,安装(在/usr/local/git - git describe )并更新了/usr/local/git符号链接。

这样,我可以将/usr/local/git/bin放在PATH并且始终使用最新版本。

此脚本的最新版本也将安装手册页。您需要调整MANPATH以包含/usr/local/git/share/man目录。

Git 重置

假设您提出了要求,将其合并到您的代码中,然后决定您不喜欢它。使用 git-log 或 tig,找到要返回的哈希(可能是上拉 / 合并之前的最后一次提交),然后复制哈希,然后执行以下操作:

# Revert to a previous commit by hash:
git-reset --hard <hash>

您可以使用HEAD ^作为上一次提交的快捷方式,而不是使用哈希。

# Revert to previous commit:
git-reset --hard HEAD^

您如何设置共享团队存储库?

这里介绍了如何设置普通存储库 - 但是如何设置每个人都可以从中拉进来的团队存储库?

使用共享的 NFS 文件系统

例如,假设您的团队已经拥有可以使用的共享组成员身份。

mkdir /your/share/folder/project.git
cd /your/share/folder/project.git
newgrp yourteamgroup # if necessary
git init --bare --shared

要开始使用此存储库,最简单的操作是从已经使用过的本地存储库开始:

cd your/local/workspace/project
git remote add origin /your/share/folder/project.git
git push origin master

现在其他人可以克隆它并开始工作:

cd your/local/workspace
git clone /your/share/folder/project.git

使用 SSH

在目标服务器上设置一个用户帐户。使用无密码帐户,带密码帐户还是使用authorized_keys确实取决于所需的安全级别。有关更多信息,请参见通过 SSH 配置 Git

如果所有开发人员都使用同一帐户访问此共享存储库,则无需使用上述--shared选项。

按照与上述相同的方式初始化存储库后,您可以像下面这样进行初始推送:

cd your/local/workspace/project
git remote add origin user@server:/path/to/project.git
git push origin master

看到与上面相似吗?除此之外,唯一可能发生的事情就是如果帐户具有密码,SSH 会要求输入密码。如果您在没有密码的帐户上收到此提示,则 SSH 服务器可能已禁用PermitEmptyPasswords

现在克隆如下所示:

cd your/local/workspace
git clone user@server:/path/to/project.git