设为首页 收藏本站
查看: 558|回复: 0

[经验分享] Everyday GIT With 20 Commands Or So[zt]

[复制链接]

尚未签到

发表于 2018-9-19 07:31:11 | 显示全部楼层 |阅读模式
http://www.kernel.org/pub/software/scm/git/docs/everyday.htmlEveryday GIT With 20 Commands Or So  [Basic Repository] commands are needed by people who have a repository --- that is everybody, because every working tree of git is a repository.
  In addition, [Individual Developer (Standalone)] commands are essential for anybody who makes a commit, even for somebody who works alone.
  If you work with other people, you will need commands listed in the [Individual Developer (Participant)] section as well.
  People who play the [Integrator] role need to learn some more commands in addition to the above.
  [Repository Administration] commands are for system administrators who are responsible for the care and feeding of git repositories.
Basic Repository  Everybody uses these commands to maintain git repositories.

  •   git-init(1) or git-clone(1) to create a     new repository.
       
  •   git-fsck(1) to check the repository for errors.
       
  •   git-gc(1) to do common housekeeping tasks such as     repack and prune.
Examples Check health and remove cruft. $ git fsck (1)  $ git count-objects (2)
  $ git gc (3)

  •   running without --full is usually cheap and assures the repository health reasonably well.
       
  •   check how many loose objects there are and how much disk space is wasted by not repacking.
       
  •   repacks the local repository and performs other housekeeping tasks. Running without —prune is a safe operation even while other ones are in progress.
Repack a small project into single pack. $ git gc (1)  $ git gc --prune

  •   pack all the objects reachable from the refs into one pack, then remove the other packs.
Individual Developer (Standalone)  A standalone individual developer does not exchange patches with other people, and works alone in a single repository, using the following commands.

  •   git-show-branch(1) to see where you are.
       
  •   git-log(1) to see what happened.
       
  •   git-checkout(1) and git-branch(1) to switch     branches.
       
  •   git-add(1) to manage the index file.
       
  •   git-diff(1) and git-status(1) to see what     you are in the middle of doing.
       
  •   git-commit(1) to advance the current branch.
       
  •   git-reset(1) and git-checkout(1) (with     pathname parameters) to undo changes.
       
  •   git-merge(1) to merge between local branches.
       
  •   git-rebase(1) to maintain topic branches.
       
  •   git-tag(1) to mark known point.
Examples Use a tarball as a starting point for a new repository. $ 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)

  •   add everything under the current directory.
       
  •   make a lightweight, unannotated tag.
Create a topic branch and develop. $ 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 reset --soft HEAD^ (6)
  $ edit/compile/test
  $ git diff ORIG_HEAD (7)
  $ git commit -a -c ORIG_HEAD (8)
  $ git checkout master (9)
  $ git merge alsa-audio (10)
  $ git log --since='3 days ago' (11)
  $ git log v2.43.. curses/ (12)

  •   create a new topic branch.
       
  •   revert your botched changes in curses/ux_audio_oss.c.
       
  •   you need to tell git if you added a new file; removal and modification will be caught if you do git commit -a later.
       
  •   to see what changes you are committing.
       
  •   commit everything as you have tested, with your sign-off.
       
  •   take the last commit back, keeping what is in the working tree.
       
  •   look at the changes since the premature commit we took back.
       
  •   redo the commit undone in the previous step, using the message you originally wrote.
       
  •   switch to the master branch.
       
  •   merge a topic branch into your master branch.
       
  •   review commit logs; other forms to limit output can be combined and include --max-count=10 (show 10 commits), --until=2005-12-10, etc.
       
  •   view only the changes that touch what's in curses/ directory, since v2.43 tag.
Individual Developer (Participant)  A developer working as a participant in a group project needs to learn how to communicate with others, and uses these commands in addition to the ones needed by a standalone developer.

  •   git-clone(1) from the upstream to prime your local     repository.
       
  •   git-pull(1) and git-fetch(1) from "origin"     to keep up-to-date with the upstream.
       
  •   git-push(1) to shared repository, if you adopt CVS     style shared repository workflow.
       
  •   git-format-patch(1) to prepare e-mail submission, if     you adopt Linux kernel-style public forum workflow.
Examples Clone the upstream and work on it.  Feed changes to upstream. $ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6  $ cd my2.6
  $ edit/compile/test; git commit -a -s (1)
  $ git format-patch origin (2)
  $ git pull (3)
  $ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 (4)
  $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL (5)
  $ git reset --hard ORIG_HEAD (6)
  $ git gc --prune (7)
  $ git fetch --tags (8)

  •   repeat as needed.
       
  •   extract patches from your branch for e-mail submission.
       
  •   git pull fetches from origin by default and merges into the current branch.
       
  •   immediately after pulling, look at the changes done upstream since last time we checked, only in the area we are interested in.
       
  •   fetch from a specific branch from a specific repository and merge.
       
  •   revert the pull.
       
  •   garbage collect leftover objects from reverted pull.
       
  •   from time to time, obtain official tags from the origin and store them under .git/refs/tags/.
Push into another repository. 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 \
  master:refs/remotes/satellite/master (3)
  satellite$ edit/compile/test/commit
  satellite$ git push origin (4)
  mothership$ cd frotz
  mothership$ git checkout master
  mothership$ git merge satellite/master (5)

  •   mothership machine has a frotz repository under your home directory; clone from it to start a repository on the satellite machine.
       
  •   clone sets these configuration variables by default. It arranges git pull to fetch and store the branches of mothership machine to local remotes/origin/* tracking branches.
       
  •   arrange git push to push local master branch to remotes/satellite/master branch of the mothership machine.
       
  •   push will stash our work away on remotes/satellite/master tracking branch on the mothership machine.  You could use this as a back-up method.
       
  •   on mothership machine, merge the work done on the satellite machine into the master branch.
Branch off of a specific tag. $ git checkout -b private2.6.14 v2.6.14 (1)  $ edit/compile/test; git commit -a
  $ git checkout master
  $ git format-patch -k -m --stdout v2.6.14..private2.6.14 |
  git am -3 -k (2)

  •   create a private branch based on a well known (but somewhat behind) tag.
       
  •   forward port all changes in private2.6.14 branch to master branch without a formal "merging".
Integrator  A fairly central person acting as the integrator in a group project receives changes made by others, reviews and integrates them and publishes the result for others to use, using these commands in addition to the ones needed by participants.

  •   git-am(1) to apply patches e-mailed in from your     contributors.
       
  •   git-pull(1) to merge from your trusted lieutenants.
       

  •   git-format-patch(1) to prepare and send suggested    >   
  •   git-revert(1) to undo botched commits.
       
  •   git-push(1) to publish the bleeding edge.
Examples My typical GIT day. $ git status (1)  $ git show-branch (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 -u ./+to-apply (4)
  $ compile/test
  $ git checkout -b hold/linus && git am -3 -i -s -u ./+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 && git show-branch master maint 'tags/ko-*' (11)
  $ git push ko (12)
  $ git push ko v0.99.9x (13)

  •   see what I was in the middle of doing, if any.
       
  •   see what topic branches I have and think about how ready they are.
       
  •   read mails, save ones that are applicable, and save others that are not quite ready.
       
  •   apply them, interactively, with my sign-offs.
       
  •   create topic branch as needed and apply, again with my sign-offs.
       
  •   rebase internal topic branch that has not been merged to the master, nor exposed as a part of a stable branch.
       
  •   restart pu every time from the next.
       
  •   and bundle topic branches still cooking.
       
  •   backport a critical fix.
       
  •   create a signed tag.
       
  •   make sure I did not accidentally rewind master beyond what I already pushed out.  ko shorthand points at the repository I have at kernel.org, and looks like this:
    $ cat .git/remotes/ko  URL: kernel.org:/pub/scm/git/git.git
      Pull: master:refs/tags/ko-master
      Pull: next:refs/tags/ko-next
      Pull: maint:refs/tags/ko-maint
      Push: master
      Push: next
      Push: +pu
      Push: maint
      In the output from git show-branch, master should have everything ko-master has, and next should have everything ko-next has.
       
  •   push out the bleeding edge.
       
  •   push the tag out, too.
Repository Administration  A repository administrator uses the following tools to set up and maintain access to the repository by developers.

  •   git-daemon(1) to allow anonymous download from     repository.
       
  •   git-shell(1) can be used as a restricted login shell     for shared central repository users.
  update hook howto has a good example of managing a shared central repository.
Examples We assume the following in /etc/services $ grep 9418 /etc/services  git             9418/tcp                # Git Version Control System
Run git-daemon to serve /pub/scm from inetd. $ grep git /etc/inetd.conf  git     stream  tcp     nowait  nobody \
  /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm
  The actual configuration line should be on one line.
Run git-daemon to serve /pub/scm from xinetd. $ 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
  }
  Check your xinetd(8) documentation and setup, this is from a Fedora system. Others might be different.
Give push/pull only access to developers. $ 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

  •   log-in shell is set to /usr/bin/git-shell, which does not allow anything but git push and git pull.  The users should get an ssh access to the machine.
       
  •   in many distributions /etc/shells needs to list what is used as the login shell.
CVS-style shared repository. $ 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

  •   place the developers into the same git group.
       
  •   and make the shared repository writable by the group.
       
  •   use update-hook example by Carl from Documentation/howto/ for branch policy control.
       

  •   alice and cindy can push into master, only bob can push into doc-update. david is the>
HTTP server to support dumb protocol transfer. dev$ git update-server-info (1)  dev$ ftp user@isp.example.com (2)
  ftp> cp -r .git /home/user/myproject.git

  •   make sure your info/refs and objects/info/packs are up-to-date
       
  •   upload to public HTTP server hosted by your ISP.


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-593868-1-1.html 上篇帖子: Git 学习收集贴 下篇帖子: [转]git很好很强大
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表