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

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

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

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

所以:

安装/设置

  • 如何安装Git
  • 你如何设置Git? 尝试涵盖Linux,Windows,Mac,认为“客户/服务器”的思想。
    • 在Windows上使用Msysgit安装GIT服务器
  • 你如何创build一个新的项目/存储库?
  • 你如何configuration它忽略不是代码的真正的一部分的文件(.obj,.user等)?

使用代码

  • 你如何得到最新的代码?
  • 你如何检查代码?
  • 你如何做出改变?
  • 您如何看待未提交的内容或当前代码库的状态?
  • 你如何销毁不需要的提交?
  • 如何比较文件的两个版本,或者你当前的文件和以前的版本?
  • 你如何看待修改文件的历史?
  • 你如何处理二进制文件(如visio文档,或编译环境)?
  • 如何合并在“同一时间”更改的文件?
  • 你如何撤销(恢复或重置)提交?

标记,分支,发布,基线

  • 你如何为一组特定的文件“标记”或“释放”一组特定的修订版本,以便以后随时可以修改这些修订版本?
  • 你如何拉一个特定的“释放”?
  • 你如何分支?
  • 你如何合并分支机构?
  • 你如何解决冲突并完成合并?
  • 你如何将一个分支的部分合并到另一个分支?
  • 什么是rebasing?
  • 如何跟踪远程分支机构?
  • 我如何在远程存储库上创build分支?
  • 如何删除远程存储库上的分支?
  • Git工作stream的例子

其他

  • 描述并链接到一个良好的GUI,IDE插件等,使Git成为一个非命令行资源,但是请列出它的限制和好处。
    • msysgit – 包含在Git中的跨平台
    • gitk – 包含在Git中的跨平台历史查看器
    • gitnub – Mac OS X
    • gitx – Mac OS X历史logging查看器
    • smartgit – 跨平台,商业,testing版
    • tig – 用于Linux的控制台GUI
    • qgit – 用于Windows,Linux的GUI
    • Git扩展包 – Windows版包含友好的GUI
  • 初学者应该知道的其他常见任务?
    • Git状态告诉你你刚刚做了什么,你有什么分支,以及其他有用的信息
  • 如何有效地使用Subversion版本库作为我的源代码控制源?

其他Git初学者的参考

  • Git指南
  • Git书
  • Git魔术
  • gitcasts
  • GitHub指南
  • Git教程
  • Progit – Scott Chacon的书
  • Git – SVN崩溃课程
  • Git从下往上
  • 准备好了
  • gitref.org
  • Git visual cheatsheet

深入Git

  • 从概念上理解Git
  • Git为计算机科学家 (和另一个版本 )

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

你如何创build一个新的项目/存储库?

一个git仓库就是一个包含一个特殊的.git目录的目录。

这与“集中”版本控制系统(如subversion)不同,远程服务器上托pipe着一个“存储库”,您将checkout入“工作副本”目录。 用git,你的工作副本就是仓库。

只需在包含你想要跟踪的文件的目录下运行git init即可。

例如,

 cd ~/code/project001/ git init 

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

要创build一个新项目,使用额外的参数(要创build的目录的名称)运行git init

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

要检查当前的当前path是否在git仓库中,只需运行git status – 如果它不是仓库,它会报告“致命的:不是git仓库”

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

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

如果因为某种原因你想“删除”一个版本库(你希望停止使用git来跟踪这个项目)。 只需删除存储库基本级别的.git目录即可。

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

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

git的GUI


Git GUI

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

Git的GUI可以做你需要做的大部分git。 包括阶段更改,configurationgit和存储库,推送更改,创build/检出/删除分支,合并,以及其他许多事情。

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

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

截图 | 一个截屏


GitK

还包括与混帐。 它是一个git历史logging查看器,可以让您可视化存储库的历史logging(包括分支,创build时间和合并时间)。 您可以查看和search提交。

和git-gui一起很好。


Gitnub

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

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

下载链接,更改日志和截图 | git存储库


GitX

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

它可以可视化非线性分支历史logging,执行提交,查看和search提交,还有其他一些很好的function,如能够“快速查看”任何修订中的任何文件(按下文件列表视图中的空间),导出任何文件(通过拖放)。

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

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

下载 | 截图 | git repository | 兄弟叉 | 洛朗叉


SmartGit

从主页:

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

你可以从他们的网站下载。

下载


TortoiseGit

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

它将TortoiseSVN移植到TortoiseGit最新版本1.2.1.0该版本可以完成常规任务,例如提交,显示日志,差异二版本,创build分支和标记,创build补丁等。 有关详细信息,请参阅发行注记 欢迎来贡献这个项目。

下载


QGit

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

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

下载


gitg

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

特征

  • 浏览修订历史。
  • 处理大型版本库(加载linux版本库,17000+版本,1秒以内)。
  • 提交更改。
  • 阶段/不活跃的个人大片。
  • 还原更改。
  • 显示修订中变化的彩色差异。
  • 浏览指定版本的树。
  • 导出给定修订的树的部分。
  • 提供诸如“git log”之类的命令可以理解的任何refspec来构build历史logging。
  • 在历史视图中显示和切换分支。

下载: 发布或来源


Gitbox

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

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

下载


Gity

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

下载或来源


合并

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

下载


武士刀

Steve Dekorte的OSX Git GUI。

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

免费1个仓库,更多$ 25。

下载


萌芽(原GitMac)

重点在于使Git易于使用。 具有原生cocoa(类似于Mac的)UI,快速存储库浏览,克隆,推/拉,分支/合并,视觉差异,远程分支,易于访问terminal等等。

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

下载 | 网站


适用于Mac OSX的function丰富的Git GUI。 30天免费试用,单用户授权$ 59USD。

下载 | 网站


例如:It

EGit是Git版本控制系统的Eclipse Team提供者。 Git是一个分布式的SCM,这意味着每个开发者都拥有代码的所有修订历史的全部副本,使得对历史的查询非常快速和多样化。

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

下载 | 网站


Git扩展

开源的Windows – 将您需要的所有东西安装在一个包中,易于使用。

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

下载

非常感谢dbr对git gui的东西的阐述。


SourceTree

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

新手和高级用户的专家就绪和function包装:

查看传出和传入的变更集。 在分支之间挑选樱桃。 修补程序处理,rebase,藏匿/搁置等等。

下载 | 网站


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

唉,如果我的post真的让你失望,那么我会删除它。 只是这样说。

如何configuration它忽略文件:

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

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

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

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

你如何为一组特定的文件“标记”或“释放”一组特定的修订版本,以便以后随时可以修改这些修订版本?

使用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创build一个“轻量级”标签(基本上是对特定版本的引用)。 “正确的”方法是使用-a标志。 这将启动您的编辑器,要求标记消息(与要求提交消息相同,也可以使用-m标记在命令行上提供标记消息)。 使用带注释的标签创build一个具有自己的ID,date,标签(作者)和可选的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的工作stream示例。

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

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

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

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

一个简单的工作stream程的简单说明,您可以在其中进行所有更改,并且只有在代码处于生产状态时才推送主人。

简单的流程

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

在这个过程中,你会发现一个可怕的安全漏洞,必须马上修复。 你可以有一个叫做修补程序的分支,这个修改比普通的“开发”分支更快地进入生产。

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

Git工作流程示例

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

Git不难

2008年11月23日

当我们告诉人们为什么他们应该使用Git而不是Subversion的时候,最后一句话是:“Git比Subversion更好地实现Subversion,但是它的function远不止于此。”

“更多”是由一堆让Git真正发光的东西组成的,但对于那些来自其他SCM如Subversion的人来说,这可能是相当不可思议的。

也就是说,在你进行转换的时候,就像你使用Subversion一样,没有什么能够阻止你使用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中发生。 这个额外的命令有很大的影响,但为了这篇文章的目的,这就是我们所说的一个额外的命令。

看,这真的不是那么难。

更新:我会不遗余力地提到,与Git相比,在Subversion中更新本地副本的function分别是svn updategit pull 。 两种情况下只有一个命令。

如何安装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 ,或者也可以从源代码安装

通过包pipe理器

使用你的本地软件包pipe理器来安装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中,可以在“devel”部分findGit包

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

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

在Linux / BSD /等。 它应该是相同的。 例如,在Debian(和Ubuntu)中,你需要通过apt安装build-essential包。

然后在terminal, cd到你提取的文件(运行cd ~/Downloads/git*/应该工作),然后运行..

 ./configure && make && sudo make install 

这会将Git安装到默认位置( /usr/local – 所以git将位于/usr/local/bin/git

它会提示你input你的密码(对于sudo ),这样可以写入/usr/local/目录,只能由“root”用户访问,所以sudo是必需的!

如果你将它安装在不同的地方(所以Git的文件不能与其他工具混合使用),请使用--prefix和configure命令:

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

这将把git安装到/usr/local/bin/gitpath/bin/git – 所以你不必每次都input,你应该把/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在~/work/track/git ),然后configuration,安装(在/usr/local/gitgit describe )并更新/usr/local/git符号链接。

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

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

Git重置

说你拉,把它合并到你的代码,并决定你不喜欢它。 使用git-log或者tig,并且find你想要回到的地方(可能是你在pull / merge之前的最后一个提交)的散列值,然后执行:

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

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

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

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

这里描述了如何build立一个正常的仓库,但是你如何build立一个团队仓库,每个人都可以从这个仓库中推送和推送?

使用共享的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取决于您所需的安全级别。 看看通过SSHconfigurationGit了解更多信息。

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

以上述相同的方式启动存储库之后,可以像这样进行初始化:

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

看到与上面的相似? 唯一可能发生的情况是SSH要求input密码,如果该帐户有密码的话。 如果您在没有密码的情况下在帐户上收到此提示,则SSH服务器可能已禁用了PermitEmptyPasswords

克隆现在看起来像这样:

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

git status是你的朋友,经常使用它。 很好回答这样的问题:

  • 这个命令做了什么?
  • 我在什么分支?
  • 我要做什么改变,我忘了什么?
  • 上次我在做这个项目(几天,几周,或者几个月前)的时候,我是不是在做些什么?

svn status不同的是,即使在大型项目中, git status也会立即运行。 我经常发现,学习git经常使用它会让人放心,以确保我的心理模型是准确的。 现在我主要是用它来提醒自己,自从我上次提交以来我已经改变了什么。

显然,如果你的.gitignoreconfiguration合理的话,它会更有用。

提交更改

一旦你编辑了一个文件,你需要将你的修改提交到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的人来说,这是一个改变,因为提交到中央存储库现在需要两个步骤。

你如何分支?

git仓库中的默认分支叫做master

创build一个新的分支使用

 git branch <branch-name> 

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

 git branch 

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

 git checkout <branch-name> 

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

 git checkout -b <branch-name> 

要删除分支,请使用

 git branch -d <branch-name> 

使用当前分支的更改创build分支,请执行此操作

 git stash git stash branch <branch-name> 

获取最新的代码

 $ 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 

That pretty much covers every case for getting the latest copy of the code from the remote repository.

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

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

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).

然后使用

 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.

I've also found Git Internals to be very useful. It is written by Scott Chacon (author of Pro Git, and maintainer of the Git Community Book). What I like about Git Internals is it focuses on the concepts first and then the commands , and being that it is ~100 small pages it is quickly digestible.

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

 git log -- filename 

How to track remote branches

Assuming there is a remote repository that you cloned your local repository from and also assuming that there is a branch named 'some_branch' on that remote repository, here is how to track it locally:

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

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

How do you compare two revisions of a file, or your current file and a previous revision?

Compare command is git diff .

To compare 2 revisions of a file:

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

That diffs commit1 against commit2; if you change order then files are diffed the other way round, which may not be what you expect…

To compare current staged file against the repository:

 $ git diff --staged <file_name> 

To compare current unstaged file against the repository:

 $ git diff <file_name> 

Why yet another howto? There are really good ones on the net, like the git guide which is perfect to begin. It has good links including the git book to which one can contribute (hosted on git hub) and which is perfect for this collective task.

On stackoverflow, I would really prefer to see your favorite tricks !

Mine, which I discovered only lately, is git stash , explained here , which enables you to save your current job and go to another branch

EDIT: as the previous post, if you really prefer stackoverlow format with posts as a wiki I will delete this answer

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 

I got started with the official Git tutorial . I think it's practical enough for beginners (I was, and still am, a beginner, by your definition! I barely grasp makefiles, I've only played a bit with Apache Subversion, etc.).

How do I delete a branch on a remote repository?

Perform a push in your remote using : before the name of the branch

 git push origin :mybranchname 

being origin the name of your remote and mybranchname the name of the branch about to be deleted

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

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 .

Checking Out Code

First go to an empty dir, use "git init" to make it a repository, then clone the remote repo into your own.

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

Wherever you initially clone from is where "git pull" will pull from by default.