Git每天都会用到的20个命令(译官网资料)

官网链接 https://git-scm.com/docs/giteveryday
文中多次提到上游,我个人的理解是你的上一级代码库。就好像SVN的服务端代码。

定义

giteveryday — Everyday Git是Git最常用命令的最小集合

概要

有20个命令

描述

为方便描述,Git用户可以广泛地分为四类。

  • 个人开发者(独立) 这些命令对于任何人的代码提交都是重要的,即使是独立开发者也不例外。
  • 如果您与其他人合作,您还需要“ 个人开发者(合作开发)”部分中列出的命令。
  • 运维管理人员除了上述之外,还需要学习更多的命令。
  • 存储库管理命令适用于负责Git存储库的管理和馈送的系统管理员。

个人开发者(独立)

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

  • git-init [1]创建一个新的存储库。
  • git-log [1]看看发生了什么。
  • git-checkout [1]和git-branch [1]切换分支。
  • git-add [1]来管理索引文件。
  • git-diff [1]和git-status [1],看看你在做什么。
  • git-commit [1]推进当前分支。
  • git-reset [1]和git-checkout [1](使用路径名参数)来撤消更改。
  • git-merge [1]在本地分支之间合并。
  • git-rebase [1]维护主题分支。
  • git-tag [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)
  1. 添加当前目录下的所有内容。
  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)
  1. 创建一个新的主题分支。
  2. 恢复你的笨拙的变化curses/ux_audio_oss.c
  3. 你需要告诉Git是否添加了一个新的文件; 如果您git commit -a以后再对文件进行移除和修改操作,Git会告知你。
  4. 看看你正在做什么改变。
  5. 提交你已经测试过并打过标记的内容。
  6. 查看所有更改,包括以前的提交。
  7. 修改先前的提交,添加所有新的更改,使用您的原始消息。
  8. 切换到主分支。
  9. 将主题分支合并到主分支中。
  10. 查看提交日志; 可以组合其他形式来限制输出,并包括-10(最多显示10个提交) --until=2005-12-10等。
  11. 只查看curses/ 目录中的内容的更改或创建,自从v2.43开始实施。

个人开发者(合作开发)

作为组织项目参与者的开发人员需要了解如何与他人进行沟通,并且除了独立开发人员所需的命令外,还使用这些命令。

  • git-clone [1]从代码仓库下载代码到本地。
  • git-pull [1]和git-fetch [1]从“origin”保持与库中代码版本一致。
  • git-push [1]分享代码库,如果你接受CVS风格的Repo管理工作流程。
  • git-format-patch [1]准备电子邮件提交,如果你接受Linux内核风格的公开论坛工作流程。
  • git-send-email [1]发送您提交的电子邮件,without corruption by your MUA.(这句没理解)。
  • git-request-pull [1]创建上游代码库的更改摘要。

例子

克隆上游并对其进行处理。并提交更改到上游。
$ 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)
  1. 从主机检出一个新mine的分支。
  2. 根据需要重复操作。
  3. 从你的分支中提取补丁(分枝是相对于master而言的)。
  4. 发送电子邮件。
  5. 返回到master,看看有什么新的变化。
  6. git pullorigin默认提取,合并到当前分支。
  7. pull代码后后,看看上次修改之后的修改,只关注我们感兴趣的地方。
  8. 检查外部存储库中的分支名称(如果不知道)。
  9. ALL特定的存储库中获取特定的分支并将其合并。
  10. 恢复pull。
  11. 将pull版本后的冗余信息恢复。
推入(push)到另一个存储库。
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上启动一个存储库。
    1. 克隆默认设置这些配置变量。安排git pull将母机分支机构存放到本地remotes/origin/*远程分支机构。
    2. 安排git push将所有当地分支机构推到Master相应的分支代码。
    3. 将我们所有的工作都push到remotes/satellite/* 在母机上的远程跟踪分支上。您可以将其用作备份方法。同样,你可以假装那个“你”获得的Master(当访问是单面的时候很有用)。
    4. 在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/masternext应该有一切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]套件

    版权声明

    弈心博客


    本文首发site_name,转载请附上博文链接!