Git
English ▾ 主题 ▾ 最新版本 ▾ giteveryday 最后更新于 2.43.0

名称

giteveryday - 日常 Git 的实用最小命令集

概要

大约 20 个命令的日常 Git

描述

为了描述此处日常 Git 的一小部分实用命令,可以将 Git 用户大致分为四类。

独立开发人员(独立)

独立的个人开发人员不与他人交换补丁,并且独自在一个仓库中工作,使用以下命令。

示例

使用 tarball 作为新仓库的起点。
$ tar zxf frotz.tar.gz
$ cd frotz
$ git init
$ git add . (1)
$ git commit -m "import of frotz source tree."
$ git tag v2.43 (2)
  1. 添加当前目录下的所有内容。

  2. 创建一个轻量级、未注释的标签。

创建主题分支并开发。
$ git switch -c alsa-audio (1)
$ edit/compile/test
$ git restore curses/ux_audio_oss.c (2)
$ git add curses/ux_audio_alsa.c (3)
$ edit/compile/test
$ git diff HEAD (4)
$ git commit -a -s (5)
$ edit/compile/test
$ git diff HEAD^ (6)
$ git commit -a --amend (7)
$ git switch master (8)
$ git merge alsa-audio (9)
$ git log --since='3 days ago' (10)
$ git log v2.43.. curses/ (11)
  1. 创建一个新的主题分支。

  2. 撤消您在 curses/ux_audio_oss.c 中的错误更改。

  3. 如果您添加了新文件,则需要告诉 Git;如果您稍后执行 git commit -a,则会捕获删除和修改。

  4. 查看您要提交的更改。

  5. 提交所有经过测试的更改,并附上您的签名。

  6. 查看您所有更改,包括先前的提交。

  7. 修改先前的提交,添加所有新的更改,并使用原始消息。

  8. 切换到 master 分支。

  9. 将主题分支合并到您的 master 分支。

  10. 查看提交日志;其他限制输出的形式可以组合使用,包括 -10(显示最多 10 个提交),--until=2005-12-10 等。

  11. 仅查看自 v2.43 标签以来修改了 curses/ 目录中内容的更改。

独立开发人员(参与者)

作为小组项目参与者工作的开发人员需要学习如何与他人沟通,并使用这些命令以及独立开发人员所需的命令。

  • git-clone[1] 从上游克隆以初始化您的本地仓库。

  • git-pull[1]git-fetch[1] 从“origin”获取以保持与上游同步。

  • git-push[1] 推送到共享仓库,如果您采用 CVS 样式的共享仓库工作流程。

  • git-format-patch[1] 准备电子邮件提交,如果您采用 Linux 内核样式的公共论坛工作流程。

  • git-send-email[1] 发送您的电子邮件提交,避免被您的邮件客户端损坏。

  • git-request-pull[1] 创建更改摘要,以便您的上游拉取。

示例

克隆上游并进行操作。将更改反馈到上游。
$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
$ cd my2.6
$ git switch -c mine master (1)
$ edit/compile/test; git commit -a -s (2)
$ git format-patch master (3)
$ git send-email --to="person <[email protected]>" 00*.patch (4)
$ git switch master (5)
$ git pull (6)
$ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 (7)
$ git ls-remote --heads http://git.kernel.org/.../jgarzik/libata-dev.git (8)
$ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL (9)
$ git reset --hard ORIG_HEAD (10)
$ git gc (11)
  1. 从 master 分支检出新分支 mine

  2. 根据需要重复。

  3. 提取分支相对于 master 的补丁,

  4. 并通过电子邮件发送。

  5. 返回到 master,准备查看新内容

  6. git pull 默认从 origin 获取并合并到当前分支。

  7. 在拉取后立即查看自上次检查以来上游所做的更改,仅在我们感兴趣的区域。

  8. 检查外部仓库中的分支名称(如果未知)。

  9. 从特定仓库中的特定分支 ALL 获取并将其合并。

  10. 撤消拉取。

  11. 垃圾回收拉取后剩余的对象。

推送到另一个仓库。
satellite$ git clone mothership:frotz frotz (1)
satellite$ cd frotz
satellite$ git config --get-regexp '^(remote|branch)\.' (2)
remote.origin.url mothership:frotz
remote.origin.fetch refs/heads/*:refs/remotes/origin/*
branch.master.remote origin
branch.master.merge refs/heads/master
satellite$ git config remote.origin.push \
	   +refs/heads/*:refs/remotes/satellite/* (3)
satellite$ edit/compile/test/commit
satellite$ git push origin (4)

mothership$ cd frotz
mothership$ git switch master
mothership$ git merge satellite/master (5)
  1. 母机在您的主目录下有一个 frotz 仓库;从中克隆以在卫星机上启动一个仓库。

  2. 克隆默认设置这些配置变量。它安排 git pull 获取并将母机的分支存储到本地 remotes/origin/* 远程跟踪分支。

  3. 安排 git push 将所有本地分支推送到母机上的相应分支。

  4. 推送将把我们所有的工作储存在母机上的 remotes/satellite/* 远程跟踪分支上。您可以将其用作备份方法。同样,您可以假装母机“从您那里获取”(当访问单向时很有用)。

  5. 在母机上,将卫星机上完成的工作合并到 master 分支。

从特定标签分支。
$ git switch -c private2.6.14 v2.6.14 (1)
$ edit/compile/test; git commit -a
$ git checkout master
$ git cherry-pick v2.6.14..private2.6.14 (2)
  1. 基于众所周知(但有点滞后)的标签创建私有分支。

  2. private2.6.14 分支中的所有更改前向移植到 master 分支,而无需正式“合并”。或者长命令
    git format-patch -k -m --stdout v2.6.14..private2.6.14 | git am -3 -k

另一种参与者提交机制是使用 git request-pull 或拉取请求机制(例如在 GitHub (www.github.com) 上使用)以通知您的上游您的贡献。

集成者

在小组项目中充当集成者的相当核心的人员会接收其他人做出的更改,审查和集成它们,并发布结果供其他人使用,除了参与者所需的命令外,还会使用这些命令。

此部分也可以用于那些响应 GitHub (www.github.com) 上的 git request-pull 或拉取请求以将其他人工作集成到其历史记录中的人员。仓库的子区域中尉将同时充当参与者和集成者。

示例

典型的集成者的一天。
$ git status (1)
$ git branch --no-merged master (2)
$ mailx (3)
& s 2 3 4 5 ./+to-apply
& s 7 8 ./+hold-linus
& q
$ git switch -c topic/one master
$ git am -3 -i -s ./+to-apply (4)
$ compile/test
$ git switch -c hold/linus && git am -3 -i -s ./+hold-linus (5)
$ git switch topic/one && git rebase master (6)
$ git switch -C seen next (7)
$ git merge topic/one topic/two && git merge hold/linus (8)
$ git switch maint
$ git cherry-pick master~4 (9)
$ compile/test
$ git tag -s -m "GIT 0.99.9x" v0.99.9x (10)
$ git fetch ko && for branch in master maint next seen (11)
    do
	git show-branch ko/$branch $branch (12)
    done
$ git push --follow-tags ko (13)
  1. 查看您正在进行的操作(如果有)。

  2. 查看哪些分支尚未合并到 master。对于任何其他集成分支(例如 maintnextseen)也是如此。

  3. 阅读邮件,保存适用的邮件,并保存尚未准备好的邮件(还有其他邮件阅读器可用)。

  4. 应用它们,以交互方式,并附上您的签名。

  5. 根据需要创建主题分支并应用,同样附上签名。

  6. 重新整理尚未合并到 master 或作为稳定分支一部分公开的内部主题分支。

  7. 每次从 next 重新启动 seen

  8. 以及捆绑仍在开发中的主题分支。

  9. 回退关键修复。

  10. 创建一个带签名的标签。

  11. 确保 master 未意外回退到已推送内容之外。

  12. git show-branch 的输出中,master 应该包含 ko/master 中的所有内容,而 next 应该包含 ko/next 中的所有内容,依此类推。

  13. 推送最新版本,以及指向已推送历史记录的新标签。

在此示例中,ko 简写指向 kernel.org 上 Git 维护者的仓库,如下所示

(in .git/config)
[remote "ko"]
	url = kernel.org:/pub/scm/git/git.git
	fetch = refs/heads/*:refs/remotes/ko/*
	push = refs/heads/master
	push = refs/heads/next
	push = +refs/heads/seen
	push = refs/heads/maint

仓库管理

仓库管理员使用以下工具设置和维护开发人员对仓库的访问。

  • git-daemon[1] 允许匿名下载仓库。

  • git-shell[1] 可用作共享中央仓库用户的受限登录 Shell

  • git-http-backend[1] 提供了 Git-over-HTTP(“智能 http”)的服务器端实现,允许执行获取和推送服务。

  • gitweb[1] 为 Git 仓库提供了一个 Web 前端,可以使用 git-instaweb[1] 脚本进行设置。

update hook 使用指南 提供了一个管理共享中心仓库的良好示例。

此外,还有许多其他广泛部署的托管、浏览和审查解决方案,例如

  • gitolite、gerrit 代码审查、cgit 等。

示例

我们假设在 /etc/services 中有以下内容
$ grep 9418 /etc/services
git		9418/tcp		# Git Version Control System
运行 git-daemon 从 inetd 提供 /pub/scm 服务。
$ grep git /etc/inetd.conf
git	stream	tcp	nowait	nobody \
  /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm

实际的配置行应在一行上。

运行 git-daemon 从 xinetd 提供 /pub/scm 服务。
$ cat /etc/xinetd.d/git-daemon
# default: off
# description: The Git server offers access to Git repositories
service git
{
	disable = no
	type            = UNLISTED
	port            = 9418
	socket_type     = stream
	wait            = no
	user            = nobody
	server          = /usr/bin/git-daemon
	server_args     = --inetd --export-all --base-path=/pub/scm
	log_on_failure  += USERID
}

请查看您的 xinetd(8) 文档和设置,此示例来自 Fedora 系统。其他系统可能有所不同。

使用 git-over-ssh 为开发者提供推送/拉取权限。

例如,使用以下命令的用户:$ git push/pull ssh://host.xz/pub/scm/project

$ grep git /etc/passwd (1)
alice:x:1000:1000::/home/alice:/usr/bin/git-shell
bob:x:1001:1001::/home/bob:/usr/bin/git-shell
cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell
david:x:1003:1003::/home/david:/usr/bin/git-shell
$ grep git /etc/shells (2)
/usr/bin/git-shell
  1. 登录 Shell 设置为 /usr/bin/git-shell,它不允许执行除 git pushgit pull 之外的任何操作。用户需要对机器具有 SSH 访问权限。

  2. 在许多发行版中,/etc/shells 需要列出用作登录 Shell 的内容。

CVS 样式的共享仓库。
$ grep git /etc/group (1)
git:x:9418:alice,bob,cindy,david
$ cd /home/devo.git
$ ls -l (2)
  lrwxrwxrwx   1 david git    17 Dec  4 22:40 HEAD -> refs/heads/master
  drwxrwsr-x   2 david git  4096 Dec  4 22:40 branches
  -rw-rw-r--   1 david git    84 Dec  4 22:40 config
  -rw-rw-r--   1 david git    58 Dec  4 22:40 description
  drwxrwsr-x   2 david git  4096 Dec  4 22:40 hooks
  -rw-rw-r--   1 david git 37504 Dec  4 22:40 index
  drwxrwsr-x   2 david git  4096 Dec  4 22:40 info
  drwxrwsr-x   4 david git  4096 Dec  4 22:40 objects
  drwxrwsr-x   4 david git  4096 Nov  7 14:58 refs
  drwxrwsr-x   2 david git  4096 Dec  4 22:40 remotes
$ ls -l hooks/update (3)
  -r-xr-xr-x   1 david git  3536 Dec  4 22:40 update
$ cat info/allowed-users (4)
refs/heads/master	alice\|cindy
refs/heads/doc-update	bob
refs/tags/v[0-9]*	david
  1. 将开发者放入同一个 git 组。

  2. 并使共享仓库可由该组写入。

  3. 使用 Carl 在 Documentation/howto/ 中提供的 update-hook 示例来控制分支策略。

  4. alice 和 cindy 可以推送至 master 分支,只有 bob 可以推送至 doc-update 分支。david 是发布经理,是唯一可以创建和推送版本标签的人。

GIT

git[1] 套件的一部分

scroll-to-top