原文链接: Everyday GIT With 20 Commands Or So 翻译: 伯乐在线 - cjpan
译文链接: http://blog.jobbole.com/54184/ (下文在原译文基础上有修正补充)
原文(英)最后更新时间:Last updated 2013-02-15 15:53:17 UTC
这些命令分四种类型:①不需要和其他开发者协作的独立开发者,会经常用到 git init
、git show branch
、git commit
等命令;②需要和其他人协作的开发者,会常用到 git clone
、git push
、git pull
、git format patch
;③在项目中负责接收其他开发者发来更新的核心开发者,会常用到 git am
、git pull
、git format patch
、git revert
、git push
;④ 代码仓库管理员常用 git daemon
、git shell
……
对于任何想做提交的人来说,甚至对于某位单独工作的人来说,【个人开发者(单独开发)】部分命令都是必不可少的。如果你和别人一起工作,你也会需要【个人开发者(参与者)】部分列出的命令。
除了上述的部分,担当【集成人员】角色的人需要知道更多命令。【代码库管理】命令帮助系统管理员负责管理,以及向git代码库提交内容。
个人开发者(单独开发)Individual Developer (Standalone)
单独的个人开发者不会与他人交换修补程序,只用到下列命令,独自在单独的代码库上工作:
- git-init(1) 创建新代码库。to create a new repository.
- git-show-branch(1) 查看你在哪里。to see where you are.
- git-log(1) 查看发生过什么。to see what happened.
- git-checkout(1)和git-branch(1) 切换分支。to switch branches.
- git-add(1) 管理索引文件。to manage the index file.
- git-diff(1)和git-status(1) 查看你正在做什么。to see what you are in the middle of doing.
- git-commit(1) 将推进当前分支。to advance the current branch.
- git-reset(1)和git-checkout(1) (带路径名参数)放弃(撤销)修改。to undo changes.
- git-merge(1) 合并本地分支。to merge between local branches.
- git-rebase(1) 维护主题分支。to maintain topic branches.
- git-tag(1) 给已知点打标签。to mark known point.
实例 Examples
用Tar包作为一个新代码库的起始点
Use a tarball as a starting point for a new repository.
- 添加现目录下的所有文件。
- 打一个轻量的无注释的标签。
创建一个主题分支并开发
Create a topic branch and develop.
- 创建(create)一个主题分支。
- 还原(revert)你在
curses/ux_audio_oss.c
文件里搞砸了的修改。 - 如果你添加一个新文件,你需要告诉git;之后,如果你使用
git commit -a
, 删除和修改就会被(git)捕获。 - 查看你正在提交什么修改。
- 提交所有的你已测试文件,包括你的签名。
- 撤回最后一次提交,保留工作区(working tree)内容。
- 查看自从上一个不成熟提交后的修改。
- 沿用原先写过的(注释)信息,重做在之前步骤中撤销了的提交。
- 切换到主干(master)分支。
- 合并一个主题分支到主分支。
- 回顾提交记录;其他限制输出的形式也可以合并包含(combined and include):
--max-count=10
(显示10个提交),--until=2005-12-10
等。 - 只查看从
v2.43
标签开始以来影响到curses/
目录的修改。
个人开发者(参与开发)Individual Developer (Participant)
作为一个团体项目里的参与角色,开发人员需要学习如何与他人沟通,除了那些单独开发者需要掌握的命令以外,还要使用这些命令。
- git-clone(1) 从上游代码库填充你的本地代码库。
from the upstream to prime your local repository. - git-pull(1)和git-fetch(1) 从“origin”得到最新的上游代码库。
from “origin” to keep up-to-date with the upstream. - git-push(1) 共享代码库,如果你采用cvs风格的代码库工作流的话。
to shared repository, if you adopt CVS style shared repository workflow. - git-format-patch(1) 准备e-mail提交,如果你使用Linux内核风格的公共论坛工作流的话。
to prepare e-mail submission, if you adopt Linux kernel-style public forum workflow.
实例 Examples
复制上游代码库并在其上工作,提交修改到上游代码库。
Clone the upstream and work on it. Feed changes to upstream.
- 按需重复。(repeat as needed)
- 从你的分支中提取补丁文件,用于电子邮件提交。
git pull
命令默认从“origin
”里取得内容并合并到当前的分支中去。- 在
pull
之后,立即查看在上游仓库中自上次检出之后提交的修改(日志),仅查看关注的部分。 - 从一个指定代码库的一个指定分支获取内容并合并。
- 撤销(revert)
pull
操作。 - 从撤销的
pull
操作中回收残存的对象。(代码库清理) - 不时地,从
origin
中获取官方的标签,并保存于.git/refs/tags/
。
推送到另一个代码库
Push into another repository.
mothership
机器的home
目录下有一个frotz
代码库;复制它(clone from it)以在satellite
机器上开始一个代码库。- 复制(
clone
)操作默认设定这些配置变量。它安排git pull
去抓取并保存mothership
机器上的分支到本地的remotes/origin/*
跟踪分支。 - 安排
git push
去推送本地的主(master
)分支到mothership
机器的remotes/satellite/master
分支 push
操作会在mothership
机器的remotes/satellite/master
的远程跟踪分支上存储我们的工作。你可以用此作为一个备份方法。- 在
mothership
机器上,将satellite
机器上已完成的工作合并到master
分支中。
分支的特定标签
Branch off of a specific tag.
- 创建一个私有分支,基于熟知(但稍许过时的)标签。
- 在还没有正式“合并(merging)”的情况下,向前移植
private2.6.14
分支所有的修改到master
分支上。
集成人员 Integrator
在一个团队项目中担任集成者的是一名相当重要的人员,他/她接收其他人的修改,评审并集成然后发布最终结果供其他人使用;除了参与者需要的那些命令之外,还需要使用以下这些命令。
- git-am(1) 采用你的贡献者邮寄过来的补丁文件。
to apply patches e-mailed in from your contributors.* git-pull(1) 从你的可信任的助手处合并内容。
to merge from your trusted lieutenants. - git-format-patch(1) 准备并向你的贡献者发送建议选项。
to prepare and send suggested alternative to contributors. git-revert(1) 撤销不好的提交。
to undo botched commits. git-push(1) 发布最新的内容。
to publish the bleeding edge.
实例 Examples
我典型的GIT一天
My typical GIT day.
- 查看我正在做什么,如果有的话。
- 查看我拥有的主题分支,并考虑它们的完成度。
- 读邮件,保存合适的,并且保存那些尚未完成的。
- 采用它们,交互式地,带着我的签名。
- 按需创建主题分支,还是由我签名采用。
- 为内部的还未合并到主分支,也没有作为稳定分支的一部分公开的主题分支重定基线。
- 从接下来开始,每次都重置pu。
- 合并仍然在料理中的主题分支
- 向后移植(backport)极其重要的修正。
- 创建一个签名的标签。
- 确保我不会意外将主分支回滚到我已经推出来的内容。简写的
ko
指向我在kernel.org上已有的代码库里,看起来像这样:123456789$ cat .git/remotes/koURL: kernel.org:/pub/scm/git/git.gitPull: master:refs/tags/ko-masterPull: next:refs/tags/ko-nextPull: maint:refs/tags/ko-maintPush: masterPush: nextPush: +puPush: maint
在从git show-branch
的输出里,主分支(master
)应该包含ko-master
所有的内容,并且next
应该包含ko-next
所有的内容。
12. 推送最新内容
13. 推送标签
代码库管理 Repository Administration
代码库管理员使用下列工具来设置及维护开发者对代码库的访问。
- git-daemon(1) 允许匿名者从代码库下载。
to allow anonymous download from repository.* git-shell(1) 可以被用作为限制登录shell,用于共享中央代码库的用户。
can be used as a restricted login shell for shared central repository users.
update hook howto 有一个很好的管理共享中央代码库的实例。
实例 Examples
我们假设下面的内容均在/etc/services目录下
We assume the following in /etc/services
从inetd中运行git-daemon来服务于/pub/scm
Run git-daemon to serve /pub/scm from inetd.
实际的配置应该在1行里。
从xinetd运行git-daemon来服务于/pub/scm
Run git-daemon to serve /pub/scm from xinetd.
检查xinetd(8)
文档并设置,这个文档来自于Fedora系统。其他也许会不一样。
授予开发者只推/拉访问操作权限
Give push/pull only access to developers.
- 登录
shell
被设置到/usr/bin/git-shell
, 不允许git push
和git pull
以外的任何操作。用户需要获得一个访问此机器的ssh
权限。 - 在许多发布版本中,
/etc/shells
需要列出作为一个登录shell
所使用的程序。
CVS风格的共享代码库
CVS-style shared repository.
- 把开发者置于同一
git
组中。 - 将共享代码库配为组可写。
- 使用 Documentation/howto/ 中Carl的
update-hook
实例作为分支策略控制。 - alice和cindy可以推送到主分支(master),只有bob可以推送进
doc-update
。david是发布经理,并且是唯一可以创建并推送版本标签的人。
支持dumb协议传送的HTTP服务器
HTTP server to support dumb protocol transfer.
- 确保你的
info/refs
和objects/info/packs
是最新的。 - 上传到由你的ISP托管的公共HTTP服务器。