关于版本控制:初学者的Git:权威实用指南

Git for beginners: The definitive practical guide

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

所以我需要的是一个初学者的Git实用指南。"初学者"被定义为知道如何处理编译器,在某种程度上理解makefile是什么,并且接触了源代码管理而没有很好地理解它。

"实际"是指此人不想详细了解Git在后台所做的工作,甚至不关心(或不知道)它的分布情况。你的答案可能暗示了可能性,但试着瞄准那些想要在"服务器"上保存"主"存储库(备份并安全)的初学者,并将他们的本地存储库仅仅视为"客户机"资源。

所以:

安装/设置

  • 如何安装Git
  • 如何设置Git?试着介绍Linux、Windows、Mac,想想"客户机/服务器"的思维方式。
    • 在Windows上使用msysgit安装git服务器
  • 如何创建新的项目/存储库?
  • 如何将其配置为忽略实际上不属于代码库的文件(.obj、.user等)?

使用代码

  • 如何获得最新的代码?
  • 如何签出代码?
  • 如何提交更改?
  • 如何查看未提交的内容或当前代码库的状态?
  • 你如何销毁不需要的承诺?
  • 如何比较文件的两个修订版,或当前文件和以前的修订版?
  • 如何查看文件修订的历史记录?
  • 如何处理二进制文件(例如,Visio文档或编译器环境)?
  • 如何合并"同时"更改的文件?
  • 如何撤消(恢复或重置)提交?

标记、分支、发布、基线

  • 如何为一组特定的文件"标记"标签或"发布"一组特定的修订,以便以后始终可以提取这些修订?
  • 你怎么拉一个特别的"释放"?
  • 你是怎么分支的?
  • 如何合并分支?
  • 如何解决冲突并完成合并?
  • 如何将一个分支的部分合并到另一个分支?
  • 什么是再平衡?
  • 如何跟踪远程分支?
  • 如何在远程存储库上创建分支?
  • 如何删除远程存储库上的分支?
  • Git工作流示例

其他

  • 描述并链接到一个好的GUI、IDE插件等,使Git成为一个非命令行资源,但请列出它的局限性以及它的优点。
    • msysgit-跨平台,包含在git中
    • Gitk-跨平台历史查看器,包含在Git中
    • Gitnub-Mac OS X
    • Gitx-Mac OS X历史查看器
    • SmartGit-跨平台、商业、测试版
    • 用于Linux的TIG控制台GUI
    • 适用于Windows、Linux的QGit-GUI
    • Git扩展-Windows软件包,包括友好的GUI
  • 初学者应该知道的其他常见任务吗?
    • Git状态告诉你你刚刚做了什么,你拥有什么分支,以及其他有用的信息。
  • 如何有效地使用设置为源代码管理源的Subversion存储库?

其他Git初学者参考资料

  • GIT指南
  • 吉特书
  • Git魔术
  • 绞刑架
  • 吉特布指南
  • Git教程
  • 程序-Scott Chacon的书
  • Git-SVN速成课程
  • 从下到上的Git
  • 准备就绪
  • GITRIF.ORG
  • Git视觉作弊表

深入研究Git

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

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


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

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

这不同于"集中式"版本控制系统(如Subversion),其中"存储库"位于远程服务器上,您可以将该服务器checkout放入"工作副本"目录中。使用Git,您的工作副本就是存储库。

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

例如,

1
2
cd ~/code/project001/
git init

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

要创建新项目,请运行git init,并附加一个参数(要创建的目录的名称):

1
2
3
git init project002

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

要检查当前路径是否在Git存储库中,只需运行git status-如果它不是存储库,它将报告"致命:不是Git存储库"

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

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

如果出于任何原因,您希望"去Git"一个存储库(您希望停止使用Git跟踪该项目)。只需在存储库的基础级别删除.git目录即可。

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

警告:这将销毁所有修订历史、所有标签以及Git所做的一切。它不会触摸"当前"文件(您当前可以看到的文件),但以前的更改、删除的文件等将无法恢复!


Git的GUI吉特桂

在git中,从命令行运行git gui,Windows MSysgit安装程序将其添加到"开始"菜单。好的。

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

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

它不是最漂亮的应用程序,但它几乎可以在所有平台上工作(基于tcl/tk)好的。

屏幕截图好的。吉特克

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

与Git图形用户界面配合得很好。好的。吉特布

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

看起来很漂亮,适合Mac OS X。你可以搜索存储库。Gitnub最大的标准是以线性方式(一次只显示一个分支)显示历史-它不可视化分支和合并,这对Git很重要,尽管这是一个有计划的改进。好的。

下载链接、更改日志和屏幕截图Git存储库好的。吉特克斯

打算成为"用于OS X的Gitk克隆"。好的。

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

它比git-gui/gitk更好地集成到OS X中,并且速度快且稳定,即使拥有非常大的存储库。好的。

最初的Git存储库Pieter最近没有更新(撰写时超过一年)。在Brotherbard/Gitx上有一个更为活跃的分支,它添加了"侧边栏、获取、拉、推、添加远程、合并、Cherry Pick、重新平衡、克隆、克隆到"好的。

下载截图Git存储库Brotherbard Fork Laullon Fork好的。斯科特吉特

从主页:好的。

SmartGit is a front-end for the
distributed version control system Git
and runs on Windows, Mac OS X and
Linux. SmartGit is intended for
developers who prefer a graphical user
interface over a command line client,
to be even more productive with Git —
the most powerful DVCS today.

Ok.

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

下载好的。陆龟

适用于Windows用户的Tortoissesvn Git版本。好的。

It is porting TortoiseSVN to TortoiseGit The latest release 1.2.1.0 This release can complete regular task, such commit, show log, diff two version, create branch and tag, Create patch and so on. See ReleaseNotes for detail. Welcome to contribute this project.

Ok.

下载好的。QGIT

QGit is a git GUI viewer built on
Qt/C++.

Ok.

With qgit you will be able to browse
revisions history, view patch content
and changed files, graphically
following different development
branches.

Ok.

下载好的。GITG

gitg is a git repository viewer
targeting gtk+/GNOME. One of its main
objectives is to provide a more
unified user experience for git
frontends across multiple desktops. It
does this not be writing a
cross-platform application, but by
close collaboration with similar
clients for other operating systems
(like GitX for OS X).

Ok.

特征

  • 浏览修订历史记录。
  • 处理大型存储库(在1秒内加载Linux存储库,17000多个修订版)。
  • 提交更改。
  • 阶段性/非阶段性个体驼背。
  • 恢复变化。
  • 显示修订中更改的彩色差异。
  • 浏览树以查找给定的修订。
  • 导出给定修订的树的部分。
  • 提供命令(如"git log")可以理解的任何refspec来构建历史。
  • 在历史视图中显示和切换分支。

下载:版本或源好的。吉特盒

Gitbox is a Mac OS X graphical
interface for Git version control
system. In a single window you see
branches, history and working
directory status.

Ok.

Everyday operations are easy: stage
and unstage changes with a checkbox.
Commit, pull, merge and push with a
single click. Double-click a change to
show a diff with FileMerge.app.

Ok.

下载好的。吉提

Gity网站没有太多信息,但从屏幕截图上看,它似乎是一个功能丰富的开源OSXGitGUI。好的。

下载或来源好的。MELD

Meld is a visual diff and merge tool.
You can compare two or three files and
edit them in place (diffs update
dynamically). You can compare two or
three folders and launch file
comparisons. You can browse and view a
working copy from popular version
control systems such such as CVS,
Subversion, Bazaar-ng and Mercurial
[and Git].

Ok.

下载好的。卡塔纳

史蒂夫德科特为OSX制作的吉特吉他。好的。

At a glance, see which remote branches
have changes to pull and local repos
have changes to push. The git ops of
add, commit, push, pull, tag and reset
are supported as well as visual diffs
and visual browsing of project hieracy
that highlights local changes and additions.

Ok.

一个存储库免费,超过25美元。好的。

下载好的。萌芽(以前叫gitmac)

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

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

下载网站好的。塔楼

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

下载网站好的。埃吉特

EGit is an Eclipse Team provider for the Git version control system.
Git is a distributed SCM, which means every developer has a full copy
of all history of every revision of the code, making queries against
the history very fast and versatile.

Ok.

The EGit project is implementing Eclipse tooling on top of the JGit
Java implementation of Git.

Ok.

下载网站好的。Git扩展

开放源码的Windows-安装所有你需要与Git在一个单一的软件包,易于使用。好的。

Git Extensions is a toolkit to make working with Git on Windows more intuitive. The shell extension will intergrate in Windows Explorer and presents a context menu on files and directories. There is also a Visual Studio plugin to use git from Visual Studio.

Ok.

下载好的。

很大程度上要感谢DBR对GitGUI的详细描述。好的。源岩

SourceTree是Git、Mercurial和SVN的免费Mac客户端。由Atlassian构建,BitBucket背后的人,它似乎与任何VC系统都能很好地工作,这允许您掌握一个用于所有项目的单一工具,但是它们是版本控制的。特色包装,免费。好的。

Expert-Ready & Feature-packed for both novice and advanced users:

Ok.

Review outgoing and incoming changesets.
Cherry-pick between branches.
Patch handling, rebase, stash / shelve and much more.

Ok.

下载网站好的。好啊。


好吧,尽管你要求我们不要"简单地"链接到其他资源,但是当已经存在一个社区增长(和增长)的资源,这是非常愚蠢的,这是非常好的:Git社区书。说真的,一个问题中的这20多个问题将是非常简洁和一致的。Git社区手册以HTML和PDF两种形式提供,并以清晰、格式良好和同行评审的答案回答您的许多问题,其格式允许您直接跳到手头的问题上。

唉,如果我的帖子真的让你不安,我会删除它。就这么说吧。


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

让Git忽略不希望跟踪的文件的功能非常有用。

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

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

GitIgnore(5)手册页上的好例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ 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以匹配应/不应忽略哪些文件的首选项。

1
git add .gitignore

当你完成后承诺。

2)仅忽略存储库的副本:

在您的工作副本中添加/编辑文件$git_dir/info/exclude,并使用您喜欢的模式。

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

你完了!

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

系统的全局忽略模式可以放在一个名为"随心所欲"的文件中。

我个人叫~/.gitglobalignore

然后,我可以通过以下行编辑我的~/.gitconfig文件来让Git知道此文件:

1
core.excludesfile = ~/.gitglobalignore

你完了!

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


如何"标记"一组特定的修订

如何为一组特定的文件"标记"标签或"发布"一组特定的修订,以便以后始终可以提取这些修订?

使用git tag命令。

要简单地"标记"当前版本,只需运行..

1
2
3
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):

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

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

1
2
3
4
$ git tag -d thetagname
Deleted tag 'thetagname'
$ git tag
[no output]

要标记特定的(以前的)提交,只需……

1
git tag [tag name] [revision SHA1 hash]

例如:

1
git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b

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

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

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

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

有关更多信息,请参见Git标签(1)手册页


Git的工作流示例。

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

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

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

该工作流已经非常流行,可以生成一个实现该工作流的项目:git流

一个简单的工作流程的很好的例子,在这个工作流程中,您在开发中进行了所有的更改,并且只有当代码处于生产状态时才将其推到master:

simple workflow

现在让我们假设您想要开发一个新特性,或者重构一个模块。您可以创建一个新的分支,我们称之为"功能"分支,这需要一些时间,并且可能会破坏一些代码。一旦您的特性"足够稳定",并且想要将它"靠近"生产,您就可以将特性分支合并到开发中。当合并后所有的bug都被整理出来,并且您的代码通过了所有的测试,那么您就可以将更改推到master中。

在整个过程中,您会发现一个可怕的安全漏洞,必须立即修复。您可以有一个称为修补程序的分支,它可以比正常的"开发"分支更快地将更改推回到生产中。

这里有一个关于这个功能/修补程序/开发/生产工作流程的例子(在博客文章中有很好的解释,我重复一遍,博客文章以比我更详细和更好的方式解释了整个过程。

Git workflow example


这是一份PJ Hyett的帖子,因为它已经不可用了:

Git Isn't Hard

Nov 23, 2008

When we tell people why they should
use Git over Subversion, the go-to
line is,"Git does Subversion better
than Subversion, but it does a lot
more than that."

The"lot more" is comprised of a bunch
of stuff that makes Git really shine,
but it can be pretty overwhelming for
those coming from other SCM’s like
Subversion.

That said, there’s nothing stopping
you from using Git just like you use
Subversion while you’re making the
transition.

Assuming you’ve installed the
necessary software and have a remote
repository somewhere, this is how you
would grab the code and push your
changes back with Subversion:

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

And how would you do it in Git:

$ git clone [email protected]:pjhyett/foo.git
# make your changes
$ git commit -a -m"my first commit"
$ git push

One more command to make it happen in
Git. That extra command has large
implications, but for the purposes of
this post, that’s all we’re talking
about, one extra command.

See, it really isn’t that hard.

Update: I’d be remiss to not also mention that the equivalent of
updating your local copy in Subversion
compared to Git is svn update and
git pull, respectively. Only one
command in both cases.


如何安装Git在Windows上:

安装MysgGIT

有几种下载:

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

通过包管理器

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

1
apt-get install git-core

或在Mac OS X上,通过MacPorts:

1
sudo port install git-core+bash_completion+doc

……或芬克:

1
fink install git

或自制:

1
brew install git

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

1
yum install git

在cygwin中,可以在"devel"部分下找到git包。

源代码(Mac OS X/Linux/BSD/etc)

在MacOSX中,如果安装了开发人员工具,就可以非常容易地从源代码编译Git。从http://git-scm.com/下载最新版本的git作为.tar.bz.tar.gz,并将其解压缩(双击finder)。

在linux/bsd/etc上,应该差不多。例如,在debian(和ubuntu)中,您需要通过apt安装build-essential包。

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

1
./configure && make && sudo make install

这将把git安装到默认位置(/usr/local-所以git将在/usr/local/bin/git中)

它会提示您输入密码(对于sudo),这样它就可以写入/usr/local/目录,该目录只能由"根"用户访问,所以需要sudo!

如果要将其安装在单独的位置(因此Git的文件不会与其他工具混合),请使用--prefix和configure命令:

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

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

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

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

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

This script updates my local clone of the git repo (localy at ~/work/track/git), and then configures, installs (at /usr/local/git-git describe) and updates the /usr/local/git symlink.

This way, I can have /usr/local/git/bin in my PATH and I'm always using the latest version.

The latest version of this script also installs the man pages. You need to tweak your MANPATH to include the /usr/local/git/share/man directory.


Git复位

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

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

您可以使用head^作为上一次提交的快捷方式,而不是散列。

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


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

这里描述了如何设置一个普通的存储库——但是您如何设置一个团队存储库,每个人都可以从中拉出来,从中推到中?

使用共享的NFS文件系统

假设您的团队已经有了一个可供使用的共享组成员身份。

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

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

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

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

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

使用SSH

在目标服务器上设置用户帐户。无论您使用的是没有密码的帐户、有密码的帐户,还是使用authorized_keys,都取决于您所需的安全级别。有关更多信息,请参阅通过ssh配置git。

如果所有开发人员都使用相同的帐户访问这个共享存储库,那么您不需要像上面那样使用--shared选项。

以与上面相同的方式初始化存储库之后,您将执行如下初始推送:

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

看到上面的相似之处了吗?此外,唯一可能发生的事情是ssh在帐户有密码的情况下请求密码。如果在没有密码的帐户上得到这个提示,ssh服务器可能已经禁用了PermitEmptyPasswords

克隆现在看起来像这样:

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


git status是你的朋友,经常使用。有助于回答以下问题:

  • 那个命令只是做了什么?
  • 我在哪家分店?
  • 我将要做出什么改变,我是否忘记了什么?
  • 上一次我在这个项目上工作的时候(几天,几周,或者几个月前),我是在做什么?

svn status所说的不同,git status即使在大型项目上也会立即运行。我经常在学习Git时发现它让人安心,经常使用它,以确保我对所发生的事情的心理模型是准确的。现在我主要是用它来提醒自己自从上次承诺以来我已经改变了什么。

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


你是怎么分支的?

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

要创建新的分支,请使用

1
git branch <branch-name>

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

1
git branch

如果要切换到其他分支,可以使用

1
git checkout <branch-name>

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

1
git checkout -b <branch-name>

要删除分支,请使用

1
git branch -d <branch-name>

要使用当前分支的更改创建分支,请执行以下操作:

1
2
git stash
git stash branch <branch-name>


提交更改

一旦你编辑了一个文件,你需要提交你的更改到git。当您执行这个命令时,它将请求一个提交消息——这只是一个简单的文本,告诉每个人您所做的更改。

1
$ git commit source/main.c

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

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

将提交所有更改的文件(但不是新文件,这些文件需要用git add添加到索引中)。如果您只想提交某些文件,那么您将需要先使用git add将它们放置起来,然后在不使用-a标志的情况下提交。

提交只会更改本地存储库,而不是远程存储库。如果要将提交发送到远程存储库,则需要执行推送。

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

对于来自cvs或svn的人来说,这是一个变化,因为提交到中央存储库现在需要两个步骤。


获取最新代码

1
2
3
4
5
6
7
$ 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

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


这本免费的书绝对是我的最爱,特别是对于初学者。


你需要的只是魔法。保证或你的钱回来!


如何合并分支?

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

然后使用

1
git merge master

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

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

1
git diff

要查看待定的冲突,您必须解决。


我还发现git的内部结构非常有用。它由Scott Chacon(Git社区手册的维护者和pro-Git的作者)编写。我喜欢Git的内部结构,它首先关注概念,然后关注命令,因为它是大约100个小页面,所以很快就可以理解。


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

1
git log -- filename


如何跟踪远程分支

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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


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


如何比较文件的两个修订版,或当前文件和以前的修订版?

比较命令是git diff

要比较文件的两个修订:

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

这将使commit1与commit2不同;如果您更改订单,那么文件将以另一种方式不同,这可能不是您所期望的……

要将当前暂存文件与存储库进行比较,请执行以下操作:

1
$ git diff --staged <file_name>

要将当前未分页的文件与存储库进行比较,请执行以下操作:

1
$ git diff <file_name>

为什么还有另一种方法?网络上确实有一些很好的指南,比如最适合开始的Git指南。它有很好的链接,包括一个人可以贡献的Git图书(在Git Hub上托管),这对于这个集体任务来说是完美的。

在StackOverflow上,我真的更喜欢看你最喜欢的技巧!

我最近才发现,我的是git stash,这里解释说,这使你能够保存你目前的工作,并转到另一个部门去。

编辑:与上一篇文章一样,如果您真的喜欢将StackOverlow格式与文章作为wiki,我将删除此答案。


控制台UI-TIG安装:

1
apt-get install tig

用法

在git repo中,键入"tig"以查看交互式日志,在任何日志中单击"enter"以查看有关该日志的详细信息。h获取帮助,其中列出了基本功能。

琐事

"tig"是向后的"git"。


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

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

1
2
3
4
5
6
7
8
9
10
# 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


我开始学习正式的Git教程。我认为这对初学者来说已经足够实用了(根据你的定义,我以前还是初学者!我几乎不懂makefiles,我只玩过一点apache subversion,等等)。


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

在分支名称之前,使用:执行远程推入操作。

1
git push origin :mybranchname

作为origin您的远程和mybranchname将要删除的分支的名称

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


推拉式更改

简单来说,只需执行git pushgit pull。更改被合并,如果有冲突,Git会通知您,您可以手动解决。

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

git push --tags推标签。


签出代码

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

1
git clone [email protected]:/dir/to/repo

无论您最初从何处克隆,默认情况下"git pull"将从何处提取。


吉蒂:http://macedreavor.com/gity


警告:好的guis/frontends,您可能还想查看qgit,它是一个跨平台(linux/win32)的Git存储库查看器,也可以用作最常见的Git操作的高级前端,实际上,它可以通过所谓的"自定义操作"轻松增强,以便用户提供自定义操作。


什么是再平衡?

从《Git-Travis Swicegood实用指南》一书中获得的重新平衡解释

Chapter III

16 . Rewriting History by Rebasing

Rebasing commits is the one concept in
Git that has no counterpart inside the
traditional version control world.
Using git rebase, you can rewrite the
history of a repository in a variety
of ways. It is one of the most
powerful commands in Git, which makes
it one of the most dangerous.

rebase takes a series of commits
(normally a branch) and replays them
on top of another commit (normally the
last commit in another branch). The
parent commit changes so all the
commit IDs are recalculated. This can
cause problems for other developers
who have your code because the IDs
don’t match up.

There’s a simple rule of thumb
with git rebase: use it as much as you
want on local commits. Once you’ve
shared changes with another developer,
the headache is generally not worth
the trouble.


认真地在Windows上使用msysgit的stack overflow post安装git服务器中添加tim答案中的链接。

它完美地告诉我如何在带有msysgit的Windows上安装Git,这是一篇非常详细的文章。


资源:一定要看看斯科特·查孔的电视节目,尤其是Railsconf的谈话。

Github很棒,还有一些有用的指南。


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


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

不要惊慌

如果我做了一些承诺,然后我做了一些可怕的事情,比如可能是一个平衡,现在一些事情,甚至所有的事情似乎都失去了?(Rebase似乎是第一次吸引大多数人的,所以我集中精力。虽然git rebase --abort有很大帮助,但有时您会发现,在交互式重新平衡过程中,编辑失败,让重新平衡完成,现在您想取回旧的东西。还有像filter-branch这样的东西……)

一个关键的Git原则是,它从不实际删除您所提交的任何内容。"什么,从来没有?"不,永远不要!"什么,从不?哦,几乎不可能!")如果你没有运行git gc,它仍然在里面。可能需要一些挖掘才能找到你以前的工作,但是如果你早些时候做了一些成功的git commit,那么,即使是你从一个悲惨的Rebase错误中明显破坏的一系列承诺仍然存在,通常至少持续一个月(从技术上讲,直到"reflogs"到期)。

必须记住,每个分支名称都有标签或指向一个"提交ID"。这些是有趣的数字,比如7cc5272。您所做的许多事情,比如向分支添加一个新的提交,使分支名称指向一个新的、不同的提交ID。每个提交ID都有一个指向以前某个提交ID的链接,这就是真正构成一个充满提交的"分支"的原因。

REBASE条目讨论"重写历史",像git filter-branch这样的命令也"重写历史",但它们不是通过破坏以前的历史,而是通过添加新的历史来实现的。一旦新的历史记录就位,Git将"移动标签",使其看起来像历史已经改变。如果你在你的fix-nasty-bug分支机构,做一个git rebase并设法破坏事物,那么标签fix-nasty-bug现在指的是破坏,但原始版本仍然存在。Rebase特别制作了一个临时(非移动,非分支)标签,拼写为ORIG_HEAD,可以让您找到它们。filter-branch命令还保存了所有原始名称。在某些情况下,可能没有明显的名称,但始终可以找到提交。如果必要的话,找一个"Git Guru"并解释你做了什么导致了残骸。

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

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

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

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

1
git branch recover-my-stuff ORIG_HEAD

又回来了!事实上,现在你的坏的Rebase和你最初的工作都在你的git repo中"永远"(或者至少,直到你删除了分支名称,让几个月过去,然后它们被垃圾收集)。您可以将尽可能多的名称添加到任意多个恢复的提交中。(分支名称实际上是免费的,除了把你的git branch输出搞得乱七八糟之外,当然它们还阻止了提交被垃圾收集。如果您喜欢的话,也可以在特定的提交ID上放置标记。)


关于与冲突合并的非常好的帖子-Gitguys:与冲突合并-冲突和解决方案

这个博客真的很棒——说明性强、示例清晰、易懂。绝对值得一看。