giteveryday

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

    概要

    每日Git有20个命令或者所以

    为了在这里描述日常Git的一小组有用命令,Git用户可以大致分为四类。

    • 命令对任何提交者都是必不可少的,即使对于单独工作的人也是如此。

    • 如果您与其他人一起工作,您还需要个人开发者(参与者)部分中列出的命令。

    • 扮演 角色的人除了上述之外还需要学习更多命令。

    • 存储库管理命令适用于负责Git存储库的维护和提供的系统管理员。

    个人开发者(独立)

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

    1. $ cd frotz
    2. $ git init
    3. $ git add . (1)
    4. $ git commit -m "import of frotz source tree."
    5. $ git tag v2.43 (2)
    1. 添加当前目录下的所有内容。

    2. 制作一个轻量级,未注释的标签。

    1. Create a topic branch and develop.
    1. $ git checkout -b alsa-audio (1)
    2. $ edit/compile/test
    3. $ git checkout -- curses/ux_audio_oss.c (2)
    4. $ git add curses/ux_audio_alsa.c (3)
    5. $ edit/compile/test
    6. $ git diff HEAD (4)
    7. $ git commit -a -s (5)
    8. $ edit/compile/test
    9. $ git diff HEAD^ (6)
    10. $ git commit -a --amend (7)
    11. $ git checkout master (8)
    12. $ git merge alsa-audio (9)
    13. $ git log --since='3 days ago' (10)
    14. $ git log v2.43.. curses/ (11)
    1. 创建一个新的主题分支。

    2. 恢复curses/ux_audio_oss.c中的拙劣变化。

    3. 你需要告诉Git你是否添加了一个新文件;如果您稍后执行git commit -a,将会删除和修改。

    4. 看看你提出了哪些改变。

    5. 如您所测试的那样,通过您的签名来承诺所有内容。

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

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

    8. 切换到主分支。

    9. 将主题分支合并到主分支中。

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

    11. 仅查看触及curses/目录中的内容的更改,因为v2.43标记。

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

    • 来自“origin”的 和 git-fetch [1] 与上游保持同步。

    • 到共享存储库,如果采用CVS样式的共享存储库工作流程。

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

    • 发送您的电子邮件提交而不会被您的MUA损坏。

    • git-request-pull [1] 创建上游拉动变化的摘要。

    1. Clone the upstream and work on it. Feed changes to upstream.
    1. $ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
    2. $ cd my2.6
    3. $ git checkout -b mine master (1)
    4. $ git format-patch master (3)
    5. $ git send-email --to="person <email@example.com>" 00*.patch (4)
    6. $ git checkout master (5)
    7. $ git pull (6)
    8. $ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 (7)
    9. $ git ls-remote --heads http://git.kernel.org/.../jgarzik/libata-dev.git (8)
    10. $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL (9)
    11. $ git reset --hard ORIG_HEAD (10)
    12. $ git gc (11)
    1. 从主人那里结帐一个新的分支mine

    2. 根据需要重复。

    3. 从你的分支中提取补丁,相对于主人,

    4. 并发送电子邮件

    5. 返回master,准备好看看有什么新东西

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

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

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

    9. 从特定存储库中获取特定分支ALL并合并它。

    10. 恢复拉力。

    11. 垃圾从恢复的拉动中收集剩余的物体。

    1. Push into another repository.
    1. motherhip机器在你的主目录下有一个frotz存储库;从中克隆以在卫星机器上启动存储库。

    2. clone默认设置这些配置变量。它安排git pull来获取和存储母舰机器的分支到本地remotes/origin/*远程跟踪分支机构。

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

    4. push将把我们所有的工作都藏在母舰机器上的remotes/satellite/*远程跟踪分支上。您可以将其用作备份方法。同样地,你可以假装母舰从你那里“取出”(当访问是单方面时很有用)。

    5. 在母舰机器上,将卫星机器上完成的工作合并到主分支机构中。

    1. $ git checkout -b private2.6.14 v2.6.14 (1)
    2. $ edit/compile/test; git commit -a
    3. $ git checkout master
    4. $ 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或pull-request以将其他人的工作整合到他们的历史中的人也可以使用此部分。存储库的子区域中尉既可以作为参与者也可以作为集成者。

    • 应用您的贡献者通过电子邮件发送的补丁。

    • git-pull [1] 从您信任的副手中合并。

    • 准备并发送建议的替代贡献者。

    • git-revert [1] 撤消拙劣的提交。

    1. A typical integrators Git day.
    1. $ git status (1)
    2. $ git branch --no-merged master (2)
    3. $ mailx (3)
    4. & s 2 3 4 5 ./+to-apply
    5. & s 7 8 ./+hold-linus
    6. & q
    7. $ git checkout -b topic/one master
    8. $ git am -3 -i -s ./+to-apply (4)
    9. $ compile/test
    10. $ git checkout -b hold/linus && git am -3 -i -s ./+hold-linus (5)
    11. $ git checkout topic/one && git rebase master (6)
    12. $ git checkout pu && git reset --hard next (7)
    13. $ git merge topic/one topic/two && git merge hold/linus (8)
    14. $ git checkout maint
    15. $ git cherry-pick master~4 (9)
    16. $ compile/test
    17. $ git tag -s -m "GIT 0.99.9x" v0.99.9x (10)
    18. $ git fetch ko && for branch in master maint next pu (11)
    19. do
    20. git show-branch ko/$branch $branch (12)
    21. done
    22. $ git push --follow-tags ko (13)
    1. 看看你在做什么,如果有的话。

    2. 看哪些分支还没有合并到master中。对于任何其他集成分支,例如, maintnextpu(潜在更新)。

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

    4. 以交互方式应用它们与您的签字。

    5. 根据需要创建主题分支并再次应用签名。

    6. rebase内部主题分支,尚未合并到主服务器或作为稳定分支的一部分公开。

    7. 每次从下一次重启pu

    8. 捆绑主题分支仍在烹饪。

    9. backport一个关键修复。

    10. 确保主人不会被意外地重绕,而不是已经被推出。

    11. git show-branch的输出中,master应该包含ko/master的所有内容,next应该具有ko/next所具有的所有内容等。

    12. 推出最前沿,以及指向推动历史的新标签。

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

    1. (in .git/config)
    2. [remote "ko"]
    3. url = kernel.org:/pub/scm/git/git.git
    4. fetch = refs/heads/*:refs/remotes/ko/*
    5. push = refs/heads/master
    6. push = refs/heads/next
    7. push = +refs/heads/pu

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

    • 允许从存储库匿名下载。

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

    • 提供了Git-over-HTTP(“Smart http”)的服务器端实现,允许提取和推送服务。

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

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

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

    • gitolite,gerrit code review,cgit等。
    1. We assume the following in /etc/services
    1. Run git-daemon to serve /pub/scm from inetd.
    1. $ grep git /etc/inetd.conf
    2. git stream tcp nowait nobody \
    3. /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm

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

    1. Run git-daemon to serve /pub/scm from xinetd.
    1. $ cat /etc/xinetd.d/git-daemon
    2. # default: off
    3. # description: The Git server offers access to Git repositories
    4. service git
    5. {
    6. disable = no
    7. type = UNLISTED
    8. port = 9418
    9. socket_type = stream
    10. wait = no
    11. user = nobody
    12. server = /usr/bin/git-daemon
    13. server_args = --inetd --export-all --base-path=/pub/scm
    14. log_on_failure += USERID
    15. }

    检查你的xinetd(8)文档和设置,这是来自Fedora系统。其他人可能会有所不同

    1. Give push/pull only access to developers using git-over-ssh.

    例如那些使用:$ git push/pull ssh://host.xz/pub/scm/project

    1. $ grep git /etc/passwd (1)
    2. alice:x:1000:1000::/home/alice:/usr/bin/git-shell
    3. bob:x:1001:1001::/home/bob:/usr/bin/git-shell
    4. cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell
    5. david:x:1003:1003::/home/david:/usr/bin/git-shell
    6. $ grep git /etc/shells (2)
    7. /usr/bin/git-shell
    1. 登录shell设置为/ usr / bin / git-shell,除了git pushgit pull之外不允许任何其他内容。用户需要ssh访问机器。

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

    1. $ grep git /etc/group (1)
    2. git:x:9418:alice,bob,cindy,david
    3. $ cd /home/devo.git
    4. $ ls -l (2)
    5. lrwxrwxrwx 1 david git 17 Dec 4 22:40 HEAD -> refs/heads/master
    6. drwxrwsr-x 2 david git 4096 Dec 4 22:40 branches
    7. -rw-rw-r-- 1 david git 84 Dec 4 22:40 config
    8. -rw-rw-r-- 1 david git 58 Dec 4 22:40 description
    9. drwxrwsr-x 2 david git 4096 Dec 4 22:40 hooks
    10. -rw-rw-r-- 1 david git 37504 Dec 4 22:40 index
    11. drwxrwsr-x 2 david git 4096 Dec 4 22:40 info
    12. drwxrwsr-x 4 david git 4096 Dec 4 22:40 objects
    13. drwxrwsr-x 4 david git 4096 Nov 7 14:58 refs
    14. drwxrwsr-x 2 david git 4096 Dec 4 22:40 remotes
    15. $ ls -l hooks/update (3)
    16. -r-xr-xr-x 1 david git 3536 Dec 4 22:40 update
    17. $ cat info/allowed-users (4)
    18. refs/heads/master alice\|cindy
    19. refs/tags/v[0-9]* david
    1. 将开发人员放在同一个git组中。

    2. 并使该组可写的共享存储库。

    3. 使用来自Documentation / howto /的Carl的update-hook示例进行分支策略控制。

    GIT

    部分 套件