tutorial - version control with git pdf




初学者Git:明确的实践指南 (20)

好的,在PJ Hyett看到这篇文章后 ,我决定跳到最后,然后和Git一起去。

所以我需要的是一个初学者对Git的实用指南。 “初学者”被定义为知道如何处理他们的编译器的人,在某种程度上理解Makefile是什么,并且已经触及源代码控制而不能很好地理解它。

“实用”被定义为这个人不想详细了解Git在后台做什么,甚至不关心(或知道)它是否分发。 你的答案可能会暗示可能性,但是试图针对那些希望将“主”存储库保存在一个备份和安全的“服务器”上的初学者,并将其本地存储库视为“客户”资源。

所以:

安装/设置

使用代码

标记,分支,发布,基线

其他

其他Git初学者的参考

深入Git

我会不时地浏览这些条目并“整理”它们,以便它们具有一致的外观/感觉,并且很容易扫描列表 - 随意遵循简单的“标题 - 简要解释 - 指令列表 - 陷阱和额外信息“模板。 我还会链接到上面的项目符号列表中的条目,以便以后很容易找到它们。


Git重置

假设你拉一下,把它合并到你的代码中,然后决定你不喜欢它。 使用git-log或tig,并找到想要返回的任何位置(可能是您在提交/合并之前的最后一次提交)的哈希值,然后执行以下操作:

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

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

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

git的图形用户界面

Git GUI

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

Git GUI可以完成你需要用git做的大部分工作。 包括阶段更改,配置git和存储库,推送更改,创建/检出/删除分支,合并和许多其他事情。

我最喜欢的功能之一是右键单击菜单中的“舞台线”和“舞台大块”快捷方式,它允许您提交文件的特定部分。 你可以通过git add -i来实现,但是我觉得它更易于使用。

它不是最漂亮的应用程序,但它几乎适用于所有平台(基于Tcl / Tk)

Screenshots | 一个截屏

GitK

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

与git-gui很好地结合在一起。

Gitnub

Mac OS X应用程序。 主要是相当于git log ,但与github有一些整合(如“网络视图”)。

看起来很漂亮,适合Mac OS X.您可以搜索存储库。 对Gitnub最大的批评是它以线性方式显示历史(一次只有一个分支) - 它没有形象化分支和合并,这对于git来说很重要,虽然这是一个有计划的改进。

Gitnub | github

GitX

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

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

它比git-gui / gitk更好地集成到OS X中,并且即使对于特大的存储库也是快速和稳定的。

最初的git存储库pieter最近没有更新(写作时间超过一年)。 在brotherbard/gitx提供了一个更加主动的维护分支 - 它增加了“侧边栏,抓取,拉取,推送,添加远程,合并,樱桃挑选,重定位,克隆,克隆”

Download | Screenshots | git repository | brotherbard/gitx | 洛朗叉

SmartGit

来自主页:

SmartGit是分布式版本控制系统Git的前端,可在Windows,Mac OS X和Linux上运行。 SmartGit适用于那些喜欢通过命令行客户端进行图形用户界面的开发人员,使用Git(当今最强大的DVCS)更加高效。

你可以从SmartGit下载它。

Download

TortoiseGit

适用于Windows用户的TortoiseSVN Git版本。

它将TortoiseSVN移植到TortoiseGit最新版本1.2.1.0该版本可以完成常规任务,例如commit,show log,diff two版本,创建分支和标记,创建修补程序等。 有关详细信息,请参阅ReleaseNotes 。 欢迎来贡献这个项目。

Download

QGit

QGit是一个基于Qt / C ++构建的git GUI查看器。

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

Download

gitg

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

特征

  • 浏览修订历史。
  • 处理大型版本库(加载linux版本库,17000+版本,1秒以内)。
  • 提交更改。
  • 阶段/不定期的个人大片。
  • 恢复更改。
  • 显示修订版本变化的彩色差异。
  • 为给定的修订浏览树。
  • 导出给定修订的树的部分。
  • 提供任何类似'git log'的命令可以理解的构建历史的refspec。
  • 在历史视图中显示并在分支之间切换。

下载: releasessource

Gitbox

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

日常操作非常简单:使用复选框进行阶段和不停顿的更改。 通过单击即可提交,拉取,合并和推送。 双击更改以使用FileMerge.app显示差异。

Gitbox

Gity

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

Downloadsource

Meld

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

Downloads

Katana

Steve Dekorte的OSX Git GUI。

匆匆一瞥,看看哪些远程分支有变动拉和本地回购有推动变化。 支持添加,提交,推送,拉取,标记和重置的git操作,以及突出显示本地更改和添加的项目hieracy的可视化差异和可视化浏览。

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

Katana

Sprout(以前称为GitMac)

专注于使Git易于使用。 具有原生Cocoa(类似mac)UI,快速存储库浏览,克隆,推/拉,分支/合并,视觉差异,远程分支,易于访问终端等。

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

下载 | 网站

Tower

适用于Mac OSX的功能丰富的Git GUI。 30天免费试用,单用户授权59美元。

Download | Tower

EGit

EGit是Git版本控制系统的Eclipse Team提供者。 Git是一个分布式SCM,这意味着每个开发人员都可以完整复制代码的每个修订版本的所有历史记录,从而快速且多功能地查询历史记录。

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

Download | EGit

Git扩展

适用于Windows的开放源代码 - 将您需要使用Git的所有内容安装在一个软件包中,易于使用。

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

Download

非常感谢dbr对git gui的解释。

SourceTree

SourceTree是Git,Mercurial和SVN的免费 Mac客户端。 由Bitlassucket后面的人Atlassian构建,似乎与任何VC系统都可以很好地协同工作,这使得您可以掌握一个单一的工具与您的所有项目一起使用,但是它们是版本控制的。 功能丰富,免费。

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

查看传出和传入的变更集。 樱桃采摘分支机构之间。 修补程序处理,改版,存储/搁置等等。

Download | SourceTree


Console UI - Tig

安装:

apt-get install tig

用法

While inside a git repo, type 'tig', to view an interactive log, hit 'enter' on any log to see more information about it. h for help, which lists the basic functionality.

琐事

"Tig" is "Git" backwards.


How can I create a branch on a remote repository?

Assuming that you have cloned your remote repository from some single remote repository.

# create a new branch locally
git branch name_of_branch
git checkout name_of_branch
# edit/add/remove files    
# ... 
# Commit your changes locally
git add fileName
git commit -m Message
# push changes and new branch to remote repository:
git push origin name_of_branch:name_of_branch

How do you merge branches?

If you want to merge a branch (eg master to release ), make sure your current branch is the target branch you'd like to merge into (use git branch or git status to see your current branch).

Then use

git merge master

(where master is the name of the branch you want to merge with the current branch).

If there are any conflicts, you can use

git diff

to see pending conflicts you have to resolve.


How do you see the history of revisions to a file?

git log -- filename

你如何“标记”一组特定的修订版本

如何为特定文件集“标记”“标记”或“释放”特定修订集,以便以后随时可以拉取该修订版?

使用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标志显示每条标签消息的1行( -n245显示每个注释的前245行,等等):

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

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


你如何分支?

git仓库中的默认分支称为master

创建新的分支机构使用

git branch <branch-name>

查看当前存储库类型中所有分支的列表

git branch

如果你想切换到另一个可以使用的分支

git checkout <branch-name>

创建一个新的分支并切换到一步

git checkout -b <branch-name>

要删除分支,请使用

git branch -d <branch-name>

要使用当前分支的更改创建分支,请执行

git stash
git stash branch <branch-name>

你如何建立一个共享的团队存储库?

here描述了如何建立一个正常的存储库 - 但是你如何建立一个团队存储库,每个人都可以从中拉出并推送?

使用共享的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 [email protected]:/path/to/project.git
git push origin master

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

克隆现在看起来像这样:

cd your/local/workspace
git clone [email protected]:/path/to/project.git

如何安装Git

在Windows上:

安装msysgit

有几个下载:

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

这也安装了一个Cygwin bash shell,所以你可以在更好的shell(比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:

fink install git

...或者Homebrew

brew install git

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

yum install git

在Cygwin中,可以在“devel”部分找到Git包

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

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

在Linux / BSD /等。 它应该大致相同。 例如,在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命令:

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

这会将git二进制文件安装到/usr/local/bin/gitpath/bin/git - 所以你不必每次都输入这个文件,你应该把/usr/local/bin/gitpath/bin/git添加到你的$PATH ~/.profile

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

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

脚本x-git-update-to-latest-version自动完成很多操作:

这个脚本更新我的git仓库的本地克隆(locale at〜 ~/work/track/git ),然后配置,安装(在/usr/local/git - git describe )并更新/usr/local/git符号链接。

这样,我可以在我的PATH拥有/usr/local/git/bin ,并且我总是使用最新版本。

该脚本的最新版本也安装了手册页。 你需要调整你的MANPATH来包含/usr/local/git/share/man目录。


如何将其配置为忽略文件:

让git忽略你不希望跟踪的文件是非常有用的。

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

  • 空白行忽略没有文件,它通常用作分隔符。
  • 注重#的线条充当评论。
  • !! 前缀是可选的并且将否定该模式。 匹配的任何否定模式将覆盖较低的优先模式。
  • 支持高级表达式和通配符
    • 例如:模式: *。[oa]将忽略以.o或.a结尾的所有文件(对象和归档文件)
  • 如果一个模式有一个以斜杠结尾的目录,git只会匹配这个目录和它下面的路径。 这排除了比赛中的常规文件和符号链接。
  • 前导斜杠将匹配该路径名中的所有文件。
    • 例如:pattern /*.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

然后我可以让git通过编辑我的〜/ .gitconfig文件来知道这个文件,如下所示:

core.excludesfile = ~/.gitglobalignore

你完成了!

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


提交更改

一旦你编辑了一个文件,你需要将你的修改提交到git。 当你执行这个命令时,它会要求提交一条提交信息 - 这只是一小段文字,告诉大家你已经改变了什么。

$ git commit source/main.c

将在目录./source/中提交文件main.c

$ git commit -a # the -a flag pulls in all modified files

将提交所有更改的文件(但不是新文件,那些需要使用git-add添加到索引中的文件)。 如果你只想提交某些文件,那么你将需要先使用git-add进行阶段化,然后在没有-a标志的情况下提交。

提交只会改变你的本地仓库,而不会改变远程仓库。 如果您想将提交发送到远程存储库,那么您需要进行推送。

$ git push <remote> <branch> # push new commits to the <branch> on the <remote> repository

对于来自CVS或SVN的人来说,这是一个改变,因为现在向中央资源库提交需要两个步骤。


GIT的工作流示例。

Git非常灵活并且适应任何工作流程,但是不执行特定的工作流程可能会产生负面影响,使得难以理解您可以在线性“备份”工作流程之外使用git做什么,以及例如分支有多有用。

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

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

工作流已经变得非常流行,已经做出了一个实现这个工作流的项目: git-flow

一个简单的工作流程的好例子,您可以在其中进行所有变更开发,并且只有在代码处于生产状态时才推送到主人工:

现在让我们假设您想要开发一个新功能,或者重构一个模块。 你可以创建一个新的分支,我们可以称之为“特征”分支,这需要一些时间并且可能会破坏一些代码。 一旦你的功能“足够稳定”并且想要将它“移近”生产,就可以将你的功能分支合并到开发中。 当所有错误在合并之后被分类出来,并且你的代码通过了所有的测试后,你会将你的改变推送到master中。

在所有这些过程中,你会发现一个可怕的安全漏洞,必须马上修复。 你可以有一个叫做hotfixes的分支,这个分支比普通的“开发”分支更快地将其推回到生产环境中。

在这里,您可以看到这个功能/修补程序/开发/生产工作流程的样子(在博客文章中有详细解释,我重复一遍,博客文章详细解释了整个过程,比我做得更好。


Git Magic is all you'll ever need. Guaranteed or your money back!


Push and pull changes

In an simplified way, just do git push and git pull . Changes are merged and if there's a conflict git will let you know and you can resolve it manually.

When you first push to a remote repository you need to do a git push origin master (master being the master branch). From then on you just do the git push .

Push tags with git push --tags .


A real good paper for understanding how Git works is The Git Parable . Very recommended!



The Pro Git free book is definitely my favorite, especially for beginners.


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

Git不难

2008年11月23日

当我们告诉人们为什么他们应该使用Git而不是Subversion时,这个指导意义在于:“Git比Subversion更好地实现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 [email protected]:pjhyett/foo.git
# make your changes
$ git commit -a -m "my first commit"
$ git push

还有一个命令可以让它在Git中发生。 这个额外的命令有很大的影响,但为了这篇文章的目的,这就是我们正在谈论的一个额外命令。

看,它真的不那么难。

更新:我不想提及,与Subversion相比,在Subversion中更新本地副本相当于分别是svn updategit pull 。 在这两种情况下只有一个命令。


那么,尽管你问我们不是“简单地”链接到其他资源,但是当已经存在一个真正相当不错的社区成长(并且不断增长)的资源时,这是非常愚蠢的: Git Community Book 。 严重的是,这个问题中的这20多个问题将会是简洁而一致的。 Git Community Book既可以HTML和PDF格式提供,也可以以清晰,格式良好并经过同行评审的答案和格式回答您的许多问题,让您可以直接跳到您的问题。

唉,如果我的帖子真的让你感到不安,那么我会删除它。 只是这样说。





version-control