ToB企服应用市场:ToB评测及商务社交产业平台

标题: Git 基础——《Pro Git》 [打印本页]

作者: 大号在练葵花宝典    时间: 7 天前
标题: Git 基础——《Pro Git》
⭐获取 Git 仓库

获取 Git 仓库有两种方式:

在已存在目次中初始化 Git 仓库


克隆现有的 Git 仓库


⭐记载每次更新到仓库

工作目次下的每一个文件只有两种状态:已跟踪 未跟踪




检查当前文件状态——git status

可以用 git status 命令检察哪些文件处于什么状态。

  1. $ git status
  2. On branch master
  3. Your branch is up-to-date with 'origin/master'.
  4. nothing to commit, working directory clean
复制代码




跟踪新文件——git add


  1. $ git add README
复制代码

  1. $ git status
  2. On branch master
  3. Your branch is up-to-date with 'origin/master'.
  4. Changes to be committed:
  5.   (use "git restore --staged <file>..." to unstage)
  6.     new file:   README
复制代码


暂存已修改的文件——git add



状态简览——git status -s

Git 有一个选项可以帮你缩短状态命令的输出,如许可以以简便的方式检察更改。 假如你使用 git status -s 命令或 git status --short 命令,你将得到一种格式更为紧凑的输出。
  1. $ git status -s
  2. M README
  3. MM Rakefile
  4. A  lib/git.rb
  5. M  lib/simplegit.rb
  6. ?? LICENSE.txt
复制代码






忽略文件——.gitignore

一样平常我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些主动生成的文件,比如日志文件,或者编译过程中创建的暂时文件等。 在这种环境下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。 来看一个现实的 .gitignore 例子:
  1. $ cat .gitignore
  2. *.[oa]
  3. *~
复制代码
第一行告诉 Git 忽略全部以 .o 或 .a 结尾的文件。一样平常这类对象文件和存档文件都是编译过程中出现的。 第二行告诉 Git 忽略全部名字以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用如许的文件名保存副本。 别的,你大概还必要忽略 log,tmp 或者 pid 目次,以及主动生成的文档等等。 要养成一开始就为你的新仓库设置好 .gitignore 文件的风俗,以免将来误提交这类无用的文件。
文件 .gitignore 的格式规范如下:

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个恣意字符;[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只匹配一个恣意字符;假如在方括号中使用短划线分隔两个字符, 表示全部在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配全部 0 到 9 的数字)。 使用两个星号(**)表示匹配恣意中心目次,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
我们再看一个 .gitignore 文件的例子:
  1. # 忽略所有的 .a 文件
  2. *.a
  3. # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
  4. !lib.a
  5. # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
  6. /TODO
  7. # 忽略任何目录下名为 build 的文件夹
  8. build/
  9. # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
  10. doc/*.txt
  11. # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
  12. doc/**/*.pdf
复制代码
Tip
GitHub 有一个非常具体的针对数十种项目及语言的 .gitignore 文件列表, 你可以在 GitHub - github/gitignore: A collection of useful .gitignore templates找到它。
Note
在最简朴的环境下,一个仓库大概只根目次下有一个 .gitignore 文件,它递归地应用到整个仓库中。 然而,子目次下也可以有额外的 .gitignore 文件。子目次中的 .gitignore 文件中的规则只作用于它所在的目次中。 (Linux 内核的源码库拥有 206 个 .gitignore 文件。)
多个 .gitignore 文件的具体细节超出了本书的范围,更多详情见 man gitignore 。

检察已暂存和未暂存的修改——git diff





Note
Git Diff 的插件版本
在本书中,我们使用 git diff 来分析文件差异。 但是你也可以使用图形化的工具或外部 diff 工具来比较差异。 可以使用 git difftool 命令来调用 emerge 或 vimdiff 等软件(包括商业软件)输出 diff 的分析结果。 使用 git difftool --tool-help 命令来看你的体系支持哪些 Git Diff 插件。

提交更新——git commit

  1. $ git commit
复制代码
Note
启动的编辑器是通过 Shell 的环境变量 EDITOR 指定的,一样平常为 vim 或 emacs。 固然也可以按照 起步 介绍的方式, 使用 git config --global core.editor 命令设置你喜欢的编辑器。

  1. # Please enter the commit message for your changes. Lines starting
  2. # with '#' will be ignored, and an empty message aborts the commit.
  3. # On branch master
  4. # Your branch is up-to-date with 'origin/master'.
  5. #
  6. # Changes to be committed:
  7. #        new file:   README
  8. #        modified:   CONTRIBUTING.md
  9. #
  10. ~
  11. ~
  12. ~
  13. ".git/COMMIT_EDITMSG" 9L, 283C
复制代码

Note
更具体的内容修改提示可以用 -v 选项检察,这会将你所作的更改的 diff 输出出现在编辑器中,以便让你知道本次提交具体作出哪些修改。

  1. $ git commit -m "Story 182: Fix benchmarks for speed"
  2. [master 463dc4f] Story 182: Fix benchmarks for speed
  3. 2 files changed, 2 insertions(+)
  4. create mode 100644 README
复制代码


跳过使用暂存区域——git commit -a

  1. $ git commit -a -m 'added new benchmarks'
  2. [master 83e38c7] added new benchmarks
  3. 1 file changed, 5 insertions(+), 0 deletions(-)
复制代码

移除文件——git rm


  1. $ rm PROJECTS.md
  2. $ git status
  3. On branch master
  4. Your branch is up-to-date with 'origin/master'.
  5. Changes not staged for commit:
  6.   (use "git add/rm <file>..." to update what will be committed)
  7.   (use "git checkout -- <file>..." to discard changes in working directory)
  8.         deleted:    PROJECTS.md
  9. no changes added to commit (use "git add" and/or "git commit -a")
复制代码

  1. $ git rm PROJECTS.md
  2. rm 'PROJECTS.md'
  3. $ git status
  4. On branch master
  5. Your branch is up-to-date with 'origin/master'.
  6. Changes to be committed:
  7.   (use "git reset HEAD <file>..." to unstage)
  8.     deleted:    PROJECTS.md
复制代码

  1. $ git rm --cached README
复制代码

  1. $ git rm log/\*.log
复制代码

  1. $ git rm \*~
复制代码


移动文件——git mv <file_from> <file_to>

  1. $ git mv file_from file_to
复制代码
  1. $ git mv README.md README
  2. $ git status
  3. On branch master
  4. Your branch is up-to-date with 'origin/master'.
  5. Changes to be committed:
  6.   (use "git reset HEAD <file>..." to unstage)
  7.     renamed:    README.md -> README
复制代码
  1. $ mv README.md README
  2. $ git rm README.md
  3. $ git add README
复制代码

检察提交历史——git log

不传入任何参数的默认环境下,git log 会按时间先后次序列出全部的提交,近来的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交阐明。
常用的选项

选项
阐明
-p
按补丁格式显示每个提交引入的差异。
--stat
显示每次提交的文件修改统计信息。
--shortstat
只显示 --stat 中末了的行数修改添加移除统计。
--name-only
仅在提交信息后显示已修改的文件清单。
--name-status
显示新增、修改、删除的文件清单。
--abbrev-commit
仅显示 SHA-1 校验和全部 40 个字符中的前几个字符。
--relative-date
使用较短的相对时间而不是完备格式显示日期(比如“2 weeks ago”)。
--graph
在日志旁以 ASCII 图形显示分支与合并历史。
--pretty
使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。
--oneline
--pretty=oneline --abbrev-commit 合用的简写。


选项
阐明
%H
提交的完备哈希值
%h
提交的简写哈希值
%T
树的完备哈希值
%t
树的简写哈希值
%P
父提交的完备哈希值
%p
父提交的简写哈希值
%an
作者名字
%ae
作者的电子邮件地址
%ad
作者修订日期(可以用 --date=选项 来定制格式)
%ar
作者修订日期,按多久从前的方式显示
%cn
提交者的名字
%ce
提交者的电子邮件地址
%cd
提交日期
%cr
提交日期(距今多长时间)
%s
提交阐明

限制输出选项

选项
阐明
-<n>
仅显示近来的 n 条提交。
--since, --after
仅显示指定时间之后的提交。(可以是雷同 "2008-01-15" 的具体的某一天,也可以是雷同 "2 years 1 day 3 minutes ago" 的相对日期。)
--until, --before
仅显示指定时间之前的提交。
--author
仅显示作者匹配指定字符串的提交。
--committer
仅显示提交者匹配指定字符串的提交。
--grep
仅显示提交阐明中包含指定字符串的提交。
-S
仅显示添加或删除内容匹配指定字符串的提交。
非常有用的过滤器是 -S(俗称“pickaxe”选项,取“用鹤嘴锄在土里捡石头”之意), 它接受一个字符串参数,而且只会显示那些添加或删除了该字符串的提交。 假设你想找出添加或删除了对某一个特定函数的引用的提交,可以调用:$ git log -S function_name
--<path>
假如只关心某些文件或者目次的历史提交,可以在 git log 选项的末了指定它们的路径。 由于是放在末了位置上的选项,所以用两个短划线(--)隔开之前的选项和后面限定的路径名。
Note
你可以指定多个 --author 和 --grep 搜刮条件,如许会只输出匹配 恣意 --author 模式和 恣意 --grep 模式的提交。然而,假如你添加了 --all-match 选项, 则只会输出匹配 全部 --grep 模式的提交。

实例

来看一个现实的例子,假如要在 Git 源码库中检察 Junio Hamano 在 2008 年 10 月其间, 除了合并提交之外的哪一个提交修改了测试文件,可以使用下面的命令:
  1. $ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \
  2.    --before="2008-11-01" --no-merges -- t/
  3. 5610e3b - Fix testcase failure when extended attributes are in use
  4. acd3b9e - Enhance hold_lock_file_for_{update,append}() API
  5. f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
  6. d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
  7. 51a94af - Fix "checkout --track -b newbranch" on detached HEAD
  8. b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch
复制代码
在近 40000 条提交中,上面的输出仅列出了符合条件的 6 条记载。
Tip
隐蔽合并提交
按照你代码仓库的工作流程,记载中大概有为数不少的合并提交,它们所包含的信息通常并不多。 为了避免显示的合并提交弄乱历史记载,可以为 log 加上 --no-merges 选项。

撤销操作

重新提交——git commit --amend


✍️:

取消暂存的文件——git reset HEAD <file>


✍️:


撤销对文件的修改——git checkout --<file>


✍️:


总结

在 Git 中任何 已提交 的东西险些总是可以规复的。 甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以规复 (阅读 数据规复 了解数据规复)。 然而,任何你未提交的东西丢失后很大概再也找不到了。

远程仓库的使用

为了能在恣意 Git 项目上协作,你必要知道怎样管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中的你的项目标版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据必要推送或拉取数据。 管理远程仓库包括了解怎样添加远程仓库、移除无效的远程仓库、管理差异的远程分支并定义它们是否被跟踪等等。
✍️远程仓库可以在你的本地主机上:
你完全可以在一个“远程”仓库上工作,而现实上它在你本地的主机上。 词语“远程”未必表示仓库在网络或互联网上的别的位置,而只是表示它在别处。 在如许的远程仓库上工作,仍然必要和别的远程仓库上一样的尺度推送、拉取和抓取操作。
检察远程仓库——git remote


添加远程仓库——git remote add <shortname> <url>


从远程仓库抓取与拉取——git fetch <remote> <branch>, git pull <remote> <branch>


推送到远程仓库——git push <remote> <branch>


检察某个远程仓库——git show <remote>

  1. $ git remote show origin
  2. * remote origin
  3.   URL: https://github.com/my-org/complex-project
  4.   Fetch URL: https://github.com/my-org/complex-project
  5.   Push  URL: https://github.com/my-org/complex-project
  6.   HEAD branch: master
  7.   Remote branches:
  8.     master                           tracked
  9.     dev-branch                       tracked
  10.     markdown-strip                   tracked
  11.     issue-43                         new (next fetch will store in remotes/origin)
  12.     issue-45                         new (next fetch will store in remotes/origin)
  13.     refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  14.   Local branches configured for 'git pull':
  15.     dev-branch merges with remote dev-branch
  16.     master     merges with remote master
  17.   Local refs configured for 'git push':
  18.     dev-branch                     pushes to dev-branch                     (up to date)
  19.     markdown-strip                 pushes to markdown-strip                 (up to date)
  20.     master                         pushes to master                         (up to date)
复制代码

远程仓库的重命名与移除——git remote rename, git remote remove

  1. $ git remote rename pb paul
  2. $ git remote
  3. origin
  4. paul
复制代码

打标签——git tag

1. 列出标签


2. 创建标签


3. 后期打标签


4. 共享标签


5. 删除标签


6. 检出标签



Git 别名

Git 别名可以帮助简化命令,减少输入长度,使 Git 操作更加高效。你可以通过配置别名,将常用的长命令缩短为更直观的命令。
常见的 Git 别名配置示例

1. 根本命令简化



2. 自定义实用别名


  1. git config --global alias.unstage 'reset HEAD --'
复制代码
使用 git unstage fileA 撤销暂存,等价于 git reset HEAD -- fileA。

  1. git config --global alias.last 'log -1 HEAD'
复制代码
使用 git last 检察末了一次提交记载。

3. 外部命令别名


  1. git config --global alias.visual '!gitk'
复制代码
使用 git visual 打开 gitk 图形界面工具。

其他提示



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4