Git初学者:权威实用指南

好吧,在看到本文作者:PJ Hyett之后,我决定跳到最后,选择git

所以我需要的是Git的初学者0指南。“初学者”被定义为知道如何处理编译器的人,在某种程度上理解Makefile是什么,并且在没有很好理解的情况下接触了源代码控制。

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

所以:

安装/设置

使用代码

标记、分支、发布、基线

其他

其他Git初学者参考

深入研究Git

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

741479 次浏览

好吧,尽管你要求我们不要“简单地”链接到其他资源,但当已经存在一个社区成长(和成长)的资源非常好时,这是非常愚蠢的:Git社区手册。说真的,一个问题中的这20多个问题将是任何东西,但简洁和一致。Git社区手册既可以用超文本标记语言也可以用PDF格式提供,它用清晰、格式良好和同行评审的答案回答了你的许多问题,并且格式允许你直接跳到手头的问题上。

唉,如果我的帖子真的让你心烦意乱,那我就删除它。直说吧。

为什么又是一个howto?网络上有非常好的,比如git指南,这是完美的开始。它有很好的链接,包括可以贡献的git book(托管在git hub上),这非常适合这个集体任务。

在stackoverflow上,我真的很想看看你最喜欢的把戏!

我的,我最近才发现的,是git stash,解释这里,它使您能够保存当前的工作并转到另一个分支机构

编辑:与上一篇文章一样,如果您真的更喜欢将帖子作为wiki的stackoverlow格式,我会删除这个答案

提交更改

编辑文件后,您需要将更改提交到git。当您执行此命令时,它会要求提交消息-这只是一段简单的文本,告诉每个人您更改了什么。

$ git commit source/main.c

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

$ 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的人来说,这是一个变化,因为提交到中央存储库现在需要两个步骤。

gitMagic就是你所需要的。保证或你的钱回来!

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

让git忽略您不希望它跟踪的文件的能力非常有用。

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

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

忽略(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/排除

例如:我的工作副本是~/src/project ect1,所以我会编辑~/s rc/project 1/. g it/info/排除

你完蛋了!

3)忽略在所有情况下,在您的系统上:

您的系统的全局忽略模式可以放入一个名为任何您想要的文件中。

我个人叫~//全球对齐列表

然后,我可以通过使用以下行编辑我的~/. gitconfig配置文档文件来让git知道这个文件:

core.excludesfile = ~/.gitglobalignore

你完蛋了!

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

git status是你的朋友,经常使用它。适合回答以下问题:

  • 这个命令刚刚做了什么?
  • 我在哪个分支?
  • 我即将做出哪些改变,我是否忘记了什么?
  • 上次我在这个项目上工作时(几天,几周,或者几个月前),我是在做什么吗?

svn status不同,git status即使在大型项目上也几乎立即运行。在学习git时,我经常发现经常使用它可以让我放心,以确保我对正在发生的事情的心理模型是准确的。现在我主要只是用它来提醒自己自上次提交以来我改变了什么。

显然,如果您的. gitignore配置合理,它会更有用。

如何创建一个新的项目/仓库?

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 .gitHEAD         config       hooks/       objects/branches/    description  info/        refs/

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

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

警告:这将破坏所有修订历史记录,所有您的标签,一切 git已经完成。它不会触及“当前”文件(您当前可以看到的文件),但以前的更改、删除的文件等将无法恢复!

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

您如何“标记”“标记”或“释放”一组特定文件的特定版本,以便以后始终可以提取该版本?

使用git tag命令。

要简单地“标记”当前版本,您只需运行…

git tag -a thetagnamegit tag -a 0.1git 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 -lthetagname

要删除标记,您可以使用-d标志:

$ git tag -d thetagnameDeleted 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 -n1mytagwithmsg    This is a tag, with message

有关详细信息,请参阅git-tag(1)手册页面

控制台UI-Tig

安装:

apt-get install tig

用法

在git repo中,键入“tig”以查看交互式日志,在任何日志上点击“enter”以查看有关它的更多信息。h寻求帮助,其中列出了基本功能。

琐事

“Tig”是“Git”。

git的GUI


gitgui

包括git-从命令行运行git gui,Windowsmsysgit安装程序将其添加到开始菜单。

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

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

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

截图|一个截屏


GitK

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

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


Gitnub

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

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

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


GitX

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

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

它比git-gui/gitk更好地集成到OS X中,即使在非常大的存储库中也能快速稳定。

最初的git存储库pieter最近没有更新(在撰写本文时超过一年)。brotherbard/gitx提供了一个更积极维护的分支-它添加了“侧边栏、获取、拉取、推送、添加远程、合并、樱桃选择、重新定位、克隆、克隆到”

下载地址|截图|git仓库|brotherbard叉|劳伦叉


SmartGit

从主页:

SmartGit是一个前端分布式版本管理系统Git并在Windows、Mac OS X和Linux。SmartGit用于喜欢图形用户的开发人员命令行客户端上的接口,使用Git更有效率-今天最强大的DVCS。

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

下载


TortoiseGit

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

它正在将TortoiseSVN移植到TortoiseGit最新版本1.2.1.0该版本可以完成常规任务,例如提交、显示日志、diff两个版本、创建分支和标签、创建补丁等。详情请参阅发行说明。欢迎贡献这个项目。

下载


QGit

QGit是一个git GUI查看器,基于C++

使用qgit,您将能够浏览修订历史,查看补丁内容并以图形方式更改文件随着不同的发展分支。

下载


gitg

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

功能

  • 浏览修订历史。
  • 处理大型存储库(加载linux存储库,17000+版本,不到1秒)。
  • 提交更改。
  • 舞台/取消舞台个人大块头。
  • 恢复更改。
  • 显示修订中更改的彩色差异。
  • 为给定的修订浏览树。
  • 导出给定修订的树的部分。
  • 提供诸如“git log”之类的命令可以理解的任何refspec来构建历史记录。
  • 在历史视图中显示和切换分支。

下载:发布来源


Gitbox

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

日常操作很容易:阶段并使用复选框取消执行更改。提交、拉取、合并和推送单击。双击更改为显示与FileMerge.app.的差异

下载


Gity

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

下载地址来源


Meld

Meld是一个可视化的差异和合并工具。您可以比较两个或三个文件和在原地编辑它们(差异更新动态)。您可以比较两个或三个文件夹和启动文件比较。您可以浏览和查看流行版本的工作副本控制系统,如CVS、颠覆、集市和水银[和git].

下载


武士刀

Steve Dekorte的OSX Git GUIfor。

一目了然,查看哪些远程分支有改变拉和本地回购有更改要推送。的git ops添加、提交、推送、拉取、标记和重置支持以及视觉差异和项目层级的视觉浏览显示本地更改和添加。

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

下载


Sprout(以前的GitMac)

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

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

下载地址|网站


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

下载地址|网站


EGit

EGit是Git版本管理系统的Eclipse Team提供程序。Git是一个分布式SCM,这意味着每个开发人员都有一个完整的副本代码每次修订的所有历史,对历史非常快速和多才多艺。

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

下载地址|网站


Git扩展

适用于Windows的开源-将使用Git所需的一切安装在一个包中,易于使用。

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

下载

非常感谢dbr详细介绍了git gui的内容。


源代码树

SourceTree是Git、Mercurial和SVN的免费 Mac客户端。由BitBucket背后的人艾特莱森构建,它似乎与任何VC系统一起工作,它允许您掌握用于所有项目的单一工具,但它们是版本控制的。功能丰富,免费。

适合新手和高级用户的专家就绪和功能丰富:

查看传出和传入的更改集。树枝间的樱桃采摘。补丁处理,rebase,藏匿/搁置等等。

下载地址|网站


资源库:一定要检查Scott Chacon的Gitcast尤其是铁路公司的谈话

github很棒,也有一些有用的指南

推拉更改

以一种简化的方式,只需执行git pushgit pull。更改被合并,如果有冲突,git会让您知道,您可以手动解决它。

当您第一次推送到远程存储库时,您需要执行git push origin master(master是master分支)。从那时起,您只需执行git push

使用git push --tags推送标签。

如何安装Git

在Windows上:

安装msysgit

有几个下载:

  • Git:除非您特别需要下面的其他选项之一,否则请使用此选项。
  • 使用场景PortableGit:如果您想在PC上运行Git而不在该PC上安装(例如从USB驱动器运行Git),请使用此选项
  • msysgit:如果您想开发Git本身,请使用它。如果您只想将Git用于源代码,但不想编辑git的源代码,则不需要它。

这还安装了一个Cygwin bash shell,因此您可以在更好的shell中使用git(比cmd.exe),并且还包括git-gui(可通过git gui命令或Start > All Programs > Git菜单访问)

macosx

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

通过包管理器

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

apt-get install git-core

或者在Mac OS X上,通过MacPorts

sudo port install git-core+bash_completion+doc

…或fink:

fink install git

…或自制

brew install git

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

yum install git

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

来源(Mac OS X/Linux /BSD/etc.)

在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/gitpathmakesudo make install

这将把git二进制文件安装到/usr/local/bin/gitpath/bin/git中-所以你不必每次都输入它,你应该通过将以下行添加到你的~/.profile中来添加到你的$PATH中:

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

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

脚本x-g it-更新到最新版本自动化了很多:

此脚本更新我的git repo的本地克隆(localy at~/work/track/git),然后配置、安装(at/usr/local/git-git describe)并更新/usr/local/git符号链接。

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

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

重置代码

假设你做了一个拉取,将其合并到你的代码中,并决定你不喜欢它。使用git-log或tig,并找到你想返回的任何地方的哈希(可能是拉/合并之前的最后一次提交)复制哈希,然后执行:

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

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

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

签出代码

首先转到一个空目录,使用“git init”使其成为存储库,然后将远程存储库克隆到您自己的存储库中。

git clone user@host.com:/dir/to/repo

无论你最初从哪里克隆,默认情况下,“git拉取”都会从哪里拉取。

WRT良好的GUI/前端,您可能还想查看qgit,它是Git的跨平台(Linux /Win32)存储库查看器,也可以用作最常见Git操作的高级前端,实际上它可以通过所谓的“自定义操作”轻松增强,以便用户可以提供自定义操作。

我从官方的git教程开始。我认为它对初学者来说已经足够实用了(根据你的定义,我曾经是,现在仍然是初学者!我几乎没有掌握makefile,我只玩过一点Apache Subversion等)。

你如何分支?

git存储库中的默认分支称为master

创建一个新的分支

git branch <branch-name>

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

git branch

如果您想切换到另一个分支,您可以使用

git checkout <branch-name>

创建一个新分支并在一个步骤中切换到它

git checkout -b <branch-name>

要删除分支,请使用

git branch -d <branch-name>

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

git stashgit stash branch <branch-name>

如何合并分支?

如果您想合并一个分支(例如masterrelease),请确保您当前的分支是您想要合并到的目标分支(使用git branchgit status查看您当前的分支)。

然后使用

git merge master

(其中master是要与当前分支合并的分支的名称)。

如果有任何冲突,您可以使用

git diff

查看您必须解决的未决冲突。

我发现这篇文章对我的入门非常有用。我仍然需要阅读这本书和其他资源,但这篇文章对我很有帮助,正如标题所说,“从概念上理解git”。我还建议参加RubyLearning提供的Git&GitHub课程。

获取最新代码

$ git pull <remote> <branch> # fetches the code and merges it into# your working directory$ git fetch <remote> <branch> # fetches the code but does not merge# it into your working directory
$ git pull --tag <remote> <branch> # same as above but fetch tags as well$ git fetch --tag <remote> <branch> # you get the idea

这几乎涵盖了从远程存储库获取最新代码副本的所有情况。

在Stack Overflow帖子在Windows上使用Msysgit设置Git Server中认真添加在Windows上使用Msysgit设置Git Server503986">蒂姆的回答中的链接。

它完美地告诉我如何使用msysgit在Windows上设置Git,这是一篇非常详细的文章。

如何跟踪远程分支

假设有一个您克隆本地存储库的远程存储库,并假设该远程存储库上有一个名为“some_branch”的分支,以下是如何在本地跟踪它:

# list remote branchesgit branch -r
# start tracking one remote branchgit branch --track some_branch origin/some_branch
# change to the branch locallygit checkout some_branch
# make changes and commit them locally....
# push your changes to the remote repository:git push

如何在远程存储库上创建分支?

假设您已经从某个远程存储库克隆了远程存储库。

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

我还发现gitinternals非常有用。它是由Scott Chacon(Pro Git的作者,Git社区书籍的维护者)编写的。我喜欢Git Internals的是它首先关注概念,然后是命令,因为它只有大约100个小页面,所以很快就可以消化。

了解Git如何工作的真正好的论文是Git寓言。非常推荐!

如何比较文件的两个版本,或者您当前的文件和以前的版本?

比较命令是git diff

要比较文件的两个版本:

$ git diff <commit1> <commit2> <file_name>

这会使提交1与提交2不同;如果您更改顺序,则文件会相反,这可能不是您期望的……

要将当前暂存文件与存储库进行比较:

$ git diff --staged <file_name>

要将当前未暂存文件与存储库进行比较:

$ git diff <file_name>

您如何查看文件的修订历史?

git log -- filename

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

Git并不难

2008年11月23日

当我们告诉人们为什么使用Git over Subversion,首选项上一篇:“Git做Subversion更好比Subversion多,但它做了很多不止于此”

“更多”是由一组让Git真正闪耀的东西,但它可以是相当压倒性的那些来自其他SCM的人颠覆。

没有什么能阻止你使用Git就像你使用颠覆,当你做过渡。

假设您安装了必要的软件,并有一个遥控器存储库某处,这就是你如何会抓取代码并推动您的使用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。那个额外的命令有很大的含义,但为了这篇文章,这就是我们所说的关于,一个额外的命令。

看,其实没那么难。

更新时间:我不小心也没有提到相当于在Subversion中更新您的本地副本与Git相比是svn updategit pull,只有一个两种情况下的命令。

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

这里描述了如何设置正常存储库——但是如何设置每个人都可以从和推送的团队存储库呢?

使用共享NFS文件系统

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

mkdir /your/share/folder/project.gitcd /your/share/folder/project.gitnewgrp yourteamgroup # if necessarygit init --bare --shared

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

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

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

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

使用SSH

在目标服务器上设置一个用户帐户。您是使用没有密码的帐户、有密码的帐户还是使用authorized_keys实际上取决于您所需的安全级别。请查看通过SSH配置Git以获取更多信息。

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

以与上述相同的方式导入存储库后,您可以像这样执行初始推送:

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

看到与上面的相似之处了吗?唯一可能发生的是SSH如果帐户有密码,则询问密码。如果您在没有密码的帐户上收到此提示,则SSH服务器可能已禁用PermitEmptyPasswords

克隆现在看起来像这样:

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

progit免费书绝对是我的最爱,尤其是对于初学者。

使用GIT的工作流示例。

Git非常灵活,可以很好地适应任何工作流,但不强制执行特定的工作流可能会产生负面影响,使您很难理解除了线性“备份”工作流之外,您还可以使用git做什么,以及分支有多有用。

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

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

工作流已经变得足够流行,可以创建一个实现此工作流的项目:git-flow

一个简单的工作流程的不错的例证,你可以在开发中进行所有更改,并且只有在代码处于生产状态时才推送到master:

简单的工作流程

现在,假设你想开发一个新功能,或重构一个模块。你可以创建一个新分支,我们可以称之为“功能”分支,这需要一些时间并且可能会破坏一些代码。一旦你的功能“足够稳定”并希望将其“更接近”生产环境,你就将你的功能分支合并到开发中。当合并后所有的错误都被整理出来并且你的代码通过所有测试时,你就可以将你的更改推送到master。

在整个过程中,你会发现一个糟糕的安全bug,必须立即修复。你可以有一个名为hotfix的分支,它可以比正常的“开发”分支更快地将更改推送回生产环境。

在这里,你有一个关于这个功能/热修复补丁/开发/生产工作流程的说明(在博客文章中解释得很好,我重复一遍,博客文章比我更详细地解释了整个过程。

Git工作流示例

如何删除远程存储库上的分支?

在分支名称之前使用:在远程中执行推送

git push origin :mybranchname

origin是远程的名称,mybranchname是即将删除的分支的名称

http://help.github.com/remotes/

什么是rebase?

重新定位的解释取自本书Git实用指南-Travis Swicegood

第三

16.通过重新定位重写历史

重写提交是一个概念内部没有对应物的Git传统版本控制世界。使用git rebase,您可以重写各种存储库的历史当然。这是最Git中强大的命令,这使得最危险的事情之一

rebase接受一系列提交(通常是一个分支)并重播它们在另一个提交之上(通常是最后一次提交到另一个分支)。父提交更改,因此所有重新计算提交ID。这可以给其他开发者带来麻烦谁有你的代码,因为ID不匹配。

有一个简单的经验法则使用git rebase:尽可能多地使用它想要本地提交。一旦你与其他开发人员共享更改,头痛一般不值得麻烦了

还有一个项目我真的认为应该在这个列表中,可能对初学者非常有用:

别慌

如果我做了一些提交,然后我做了一些可怕的事情,比如rebase,现在一些东西——甚至所有东西——似乎都丢失了,该怎么办?(Rebase似乎是第一次吸引大多数人的东西,所以我专注于它。虽然git rebase --abort很有帮助,但有时你会发现你在交互式rebase期间编辑拙劣,例如,让rebase完成,现在你想把旧的东西拿回来。然后是像filter-branch这样的事情……)

一个关键的git原则是它永远不会删除你提交的任何东西。(“什么,从来没有?”“不,从来没有!”“什么,从未?”“嗯,几乎从来没有!”)如果你没有运行过git gc它还在里面。可能需要一些挖掘才能找到你以前的工作,但是如果你之前做了一些成功的git commit,那么,例如,即使你从一个悲惨的rebase错误中明显破坏的一系列提交仍然存在,通常至少一个月(技术上,直到“reflgs”到期)。

重要的是要记住,每个分支名称都标记或指向一个“提交ID”。这些是像7cc5272这样有趣的数字。你做的许多事情,比如向分支添加新的提交,使分支名称指向一个新的、不同的提交ID。每个提交ID都有一个指向以前一些提交ID的链接,这实际上构成了一个充满提交的“分支”。

rebase条目谈到“重写历史”,像git filter-branch这样的命令也“重写历史”,但它们不是通过销毁以前的历史,而是通过添加新历史来实现的。一旦新历史就位,git将“移动标签”,这样它的看起来像历史就改变了。如果你在你的fix-nasty-bug分支上,做了git rebase并设法破坏了东西,标签fix-nasty-bug现在指的是残骸,但原始版本仍然存在。Rebase特别制作了一个临时(非移动,非分支)标签,拼写为ORIG_HEAD,可以让你找到它们。filter-branch命令也保存了所有原始名称。在某些情况下,可能没有明显的名称,但总能找到提交。如果有必要,给自己找一个“git大师”,并解释你做了什么导致了残骸。

(命令git reflog show也可以帮助查找提交ID。)

如果你已经找到了你认为是你以前的部分或全部工作,请尝试:

git log <commit-ID>   # ORIG_HEAD after a bad rebase, for instancegit show <commit-ID>  # or some long SHA1 value you can still see in a window

如果它看起来正确或有用,请为其命名:

git branch recover-my-stuff ORIG_HEAD

一切又回来了!事实上,现在你糟糕的rebase和原始工作都“永远”在你的git repo中(或者至少,直到你删除分支名称,让几个月过去,然后它们被垃圾收集)。你可以将任意数量的名称放入任意数量的恢复提交中。(分支名称实际上是免费的,除了弄乱你的git branch输出,当然它们也可以防止提交被垃圾收集。如果你喜欢,你也可以在特定的提交ID上贴上标签。)

关于合并冲突的非常好的帖子-合并与冲突-冲突与解决

这个博客真的很棒——说明性强,例子清晰,可以理解。绝对值得一看。