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 push
和git 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 组中。