官网链接 https://git-scm.com/docs/giteveryday 文中多次提到上游,我个人的理解是你的上一级代码库。就好像SVN的服务端代码。
giteveryday — Everyday Git是Git最常用命令的最小集合
有20个命令
为方便描述,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)
$ 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)
curses/ux_audio_oss.c
。git commit -a
以后再对文件进行移除和修改操作,Git会告知你。-10
(最多显示10个提交) --until=2005-12-10
等。curses/
目录中的内容的更改或创建,自从v2.43
开始实施。作为组织项目参与者的开发人员需要了解如何与他人进行沟通,并且除了独立开发人员所需的命令外,还使用这些命令。
$ 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
的分支。master
,看看有什么新的变化。git pull
从origin
默认提取,合并到当前分支。ALL
特定的存储库中获取特定的分支并将其合并。
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)
20170913存档
1. Master主机在您的主目录下有一个frotz存储库; 从它clone代码,以在本地PC上启动一个存储库。
2. 克隆默认设置这些配置变量。安排`git pull`将母机分支机构存放到本地`remotes/origin/*`远程分支机构。
3. 安排`git push`将所有当地分支机构推到Master相应的分支代码。
4. 将我们所有的工作都push到`remotes/satellite/*` 在母机上的远程跟踪分支上。您可以将其用作备份方法。同样,你可以假装那个“你”获得的Master(当访问是单面的时候很有用)。
5. 在Master主机上,将客户开发机上完成的工作合并到主干代码。
分支特定标签。
$ 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)
1. 根据一个众所周知的的标签创建一个私人分支。(尽管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)上使用的 机制来通知您的上游您的贡献。
###合并补丁
收到别人的补丁建议,可以使用以下命令处理。
可以使用`git request-pull`在GitHub(www.github.com)上回复处理这些建议,将其合并到主干代码或建立一个参与者的分支代码库。
git-am [1]应用别人发送来的补丁。 git-pull [1]合并你信任的补丁。 git-format-patch [1]给发送补丁的人提意见。 git-revert [1]撤消不好的补丁。 git-push [1] to publish the bleeding edge. 啥意思?
例子
合并补丁的操作记录
$ 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)
1. 看看你手头正在开发哪些功能。
2. 看有哪些还没有合并的分支代码。
3. 看有没有重要的邮件。
4. 批准可以合并使用的补丁。
5. 根据需要创建主题分支并再次反馈改动。
6. 将可以合并的分支代码rebase并发布,作为稳定分支的一部分。
7. 从下次开始,每次都要重启pu。
8. and bundle topic branches still cooking.???
9. `backport`一个关键的修复。
10. 创建一个签名的标签。
11. 确保主干代码没有被不小心破坏。
12. 在`git show-branch`输出中,master应该有一切`ko/master`,`next`应该有一切`ko/next`都有,等等
13. git-push [1] to publish the bleeding edge. 啥意思?,以及指向推送新的日志标签。
在这个例子中,koGit维护者在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]允许匿名从存储库下载。
git-shell [1]可以用作 共享中央存储库用户的受限登录shell。
#20170926更新,未完待续
git-http-backend [1]提供了允许提取和推送服务的Git-over-HTTP(“Smart http”)的服务器端实现。
gitweb [1]提供了一个Web前端到Git仓库,可以使用git-instaweb [1]脚本进行设置。
更新钩子howto具有管理共享中央存储库的一个很好的例子。
此外,还有一些其他广泛部署的托管,浏览和审查解决方案,如:
gitolite,gerrit代码审查,cgit等。
例子
我们在/ etc / services中假设以下
$ grep 9418 / etc / services
git 9418 / tcp#Git版本控制系统
从inetd运行git-daemon来服务/ pub / scm。
$ grep git /etc/inetd.conf
git stream tcp nowait nobody \
/ usr / bin / git-daemon git-daemon --inetd --export-all / pub / scm
实际的配置行应该在一行。
从xinetd运行git-daemon来服务/ pub / scm。
$ cat /etc/xinetd.d/git-daemon
#default:off
#description:Git服务器提供对Git存储库的访问
服务git
{
disable =否
type = UNLISTED
port = 9418
socket_type = stream
等待=否
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)
艾丽斯:X:1000:1000 :: /家/爱丽丝:在/ usr /斌/ git的壳
鲍勃:X:1001:1001 :: /首页/鲍勃:在/ usr /斌/ git的壳
辛迪:X:1002:1002 :: /家/辛迪:在/ usr /斌/ git的壳
大卫:X:1003:1003 :: /家/大卫:在/ usr /斌/ git的壳
$ grep git / etc / shells (2)
/ usr / bin / git-shell
登录shell设置为/ usr /斌/ git的外壳,不允许任何东西,但git push和git pull。用户需要ssh访问机器。
在许多发行版中/ etc / shells需要列出什么用作登录shell。
CVS风格的共享存储库。
$ grep git / etc / group (1)
混帐:X:9418:爱丽丝,鲍勃,辛迪,大卫
$ 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分支
-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对象
drwxrwsr-x 4 david git 4096 Nov 7 14:58 refs
drwxrwsr-x 2 david git 4096 Dec 4 22:40遥控器
$ ls -l hooks / update (3)
-r-xr-xr-x 1 david git 3536 Dec 4 22:40更新
$ cat info / allowed-users (4)
refs / heads / master alice \ | cindy
refs / heads / doc-update bob
refs / tags / v [0-9] * david
将开发人员放在同一个git组中。
并使该组可共享存储库可写。
使用来自Documentation / howto /的分支策略控制的Carl的update-hook示例。
alice和cindy可以推进主,只有bob可以推入doc-update。david是发行经理,是唯一可以创建和推送版本标签的人员。
GIT
所述的部分GIT中[1]套件