giteveryday

giteveryday

命名

giteveryday - Everyday Git 的一组有用的最小命令

概要

每天 Git 有20个命令或者如此

描述

Git 用户可以大致分为四类,用于描述日常 Git 的一小部分有用命令。

  • 个人开发者(独立)命令对于任何进行提交的人都是必不可少的,即使对于单独工作的人也是如此。

个人开发者(独立)

独立的个人开发人员不会与其他人交换补丁,并使用以下命令单独在单个资源库中工作。

  • git-init [1]创建一个新的存储库。

例子

使用 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)

  • 在当前目录下添加所有内容。

创建主题分支并进行开发。

$ git checkout -b alsa-audio (1) $ edit/compile/test $ git checkout -- 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 checkout master (8) $ git merge alsa-audio (9) $ git log --since='3 days ago' (10) $ git log v2.43.. curses/ (11)

  • 创建一个新的主题分支。

个人开发者(参与者)

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

  • git-clone [1] 从上游迁移到本地存储库。

例子

克隆上游并开始工作。Feed 更改为上游。

$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6 $ cd my2.6 $ git checkout -b mine master (1) $ edit/compile/test; git commit -a -s (2) $ git format-patch master (3) $ git send-email --to="person <email@example.com>" 00*.patch (4) $ git checkout 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)

  • mine从主人结帐一个新的分支。

推入另一个存储库。

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 checkout master mothership$ git merge satellite/master (5)

  • 母机在您的主目录下有一个 frotz 存储库; 从它克隆到在卫星机器上启动存储库。

分支出一个特定的标签。

$ git checkout -b 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)

  • 创建一个基于众所周知的(但有点落后的)标签的私人分支。

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

集成

作为集体项目集成者的一个相当中心的人接收其他人所做的更改,审核并整合他们,并将结果发布给其他人使用,除了参与者需要的命令之外,还使用这些命令。

这部分内容也可供那些git request-pull对 GitHub(www.github.com)作出响应或请求将其他人的工作整合到其历史中的人使用。储存库的一个子区域中尉将扮演参与者和集成者的角色。

  • git-am [1] 应用从您的贡献者电子邮件发送的补丁。

例子

典型并集成的 Git day。

$ 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 checkout -b topic/one master $ git am -3 -i -s ./+to-apply (4) $ compile/test $ git checkout -b hold/linus && git am -3 -i -s ./+hold-linus (5) $ git checkout topic/one && git rebase master (6) $ git checkout pu && git reset --hard next (7) $ git merge topic/one topic/two && git merge hold/linus (8) $ git checkout 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 pu (11) do git show-branch ko/$branch $branch (12) done $ git push --follow-tags ko (13)

  • 看看你中间部分做了些什么,如果有的话。

在这个例子中,ko简写指向 Git 维护者在 kernel.org 的仓库,看起来像这样:

(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/pu push = refs/heads/maint

存储库管理

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

  • git-daemon [1] 允许匿名从版本库下载。

更新 hook howto 有一个管理共享中央存储库的好例子。

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

  • 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 的开发人员提供 push/pull 的访问权限。

例如那些使用: $ 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

  • 登录 shell 设置为 / usr / bin / git-shell ,它不允许任何内容git pushgit pull。用户需要 ssh 访问机器。

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

  • 将开发人员放入同一个 git 组中。