Git03-git的基本使用
- Git负责管理变化。Git与其他版本控制器有许多相同的概念,如提交、变更日志、版本库等,工作流在概念上也是相似的。不过,Git还提供了许多新奇事物,也其他版本控制器的观念和做法可能有所不同。
- Git提供的工具有:
- git:Git的核心工具。
- git-daemon:Git的守护进程。
- git-email:Git发送电子邮件的工具。
- git-cvs:导入CVS版本库的Git工具。
- git-svn:导入Subversion版本库的Git工具。
- git-bzr:用于使用bzr版本库的Git工具。
- git-p4:用于处理Perforce仓库的Git工具。
- git-hg:用于处理mercurial版本库的Git工具。
- git-gui:Git的GUI工具。
- gitk:Git修订树可视化器。
- gitweb:简单的Web界面,用于跟踪git版本库中的更改。
- git-instaweb:一个简单的脚本,用于设置gitweb和用于浏览本地版本库的Web服务器。
1、git常用子命令
- Git文档:http://www.kernel.org/pub/software/scm/git/docs/
]# git help usage: git [--version] [--help] [-C <path>] [-c <name>=<value>] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>] //启动工作区 clone 将版本库克隆到新目录中 init 创建一个空的Git版本库或重新初始化一个现有的版本库 //处理当前更改 add 将文件内容添加到索引 mv 移动或重命名文件、目录或符号链接 restore 恢复工作树文件 rm 从工作树和索引中删除文件 sparse-checkout 初始化和修改稀疏签出(sparse-checkout) //检查历史和状态 bisect 使用二叉搜索查找引入错误的提交 diff 显示提交之间,提交和工作树之间的更改 grep Print lines matching a pattern log 显示提交日志 show 显示各种类型的对象 status 显示工作树状态 //增加、标记和调整共享历史 branch 列出、创建或删除分支 commit 记录对版本库的更改 merge 将两个或多个开发历史记录连接在一起 rebase 在另一个基本提示之上重新应用提交 reset 将当前 HEAD 重置为指定状态 switch 切换分支 tag 创建、列出、删除或验证使用 GPG 签名的标签对象 //协作 fetch 从另一个版本库下载对象和引用 pull 从另一个版本库或本地分支获取并与之集成 push 更新远程引用以及关联的对象
- 查看完整的git子命令列表:
]# git help -a
- 获取子命令的帮助文档:
git help <subcommand> git <subcommand> --help
- git命令使用示例:
//Git的命令能够理解“短”和“长”的选项。 git commit -m "Fixed a type." git commit --message="Fixed a type." //可以使用“双破折号”的分离一系列参数。例如,如果有一个文件和一个标签都叫main.c。 //Checkout the tag named "main.c" git checkout main.c //Checkout the file named "main.c" git checkout -- main.c
2、git使用快速入门
2.1、创建Git版本库
- 有两种建立Git版本库的方法:
- (1)创建裸版本库。
- (2)复制(或叫克隆)一个已有的版本库。
- git init命令会创建一个空的Git版本库。即在指定目录中创建了一个隐藏目录“.git”,Git会把所有修改的信息都放在.git目录里。
- .git目录中包含objects、refs/heads、refs/tags和template等子目录。
1、创建一个裸版本库
//(1)创建git的工作目录 ]# mkdir ./public_html ]# cd ./public_html //(2)初始化一个git库 ]# git init ... Initialized empty Git repository in /root/public_html/.git/
2、查看裸版本库的目录结构
]# tree -a ../public_html/ ../public_html/ └── .git ├── branches ├── config ├── description ├── HEAD ├── hooks │ ├── applypatch-msg.sample │ ├── commit-msg.sample │ ├── fsmonitor-watchman.sample │ ├── post-update.sample │ ├── pre-applypatch.sample │ ├── pre-commit.sample │ ├── pre-merge-commit.sample │ ├── prepare-commit-msg.sample │ ├── pre-push.sample │ ├── pre-rebase.sample │ ├── pre-receive.sample │ ├── push-to-checkout.sample │ └── update.sample ├── info │ └── exclude ├── objects │ ├── info │ └── pack └── refs ├── heads └── tags
2.2、将文件添加到git版本库
2.2.1、创建git对象
1、将文件添加到git版本库
//(1)创建一个文件 ]# echo 'My website is alive' > index.html //(2)将文件添加到版本库中(会在.git/objects目录中创建一个以sha1值为名的文件) ]# git add index.html
2、查看是否有变更
- 显示索引文件和当前HEAD commit之间有差异的路径,工作树和索引文件之间有差异的路径,以及工作树中没有被Git跟踪的路径。第一个是运行git commit所提交的内容;第二个和第三个是在运行git commit之前运行git add可以提交的内容。
]# git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: index.html
2.2.2、设置邮箱和作者
//修改项目目录中的配置文件.git/config,添加如下信息。你自己的邮箱,你自己的姓名 ]# vim .git/config [user] email=hengha@123.com name=heng ha
- 也可以使用命令设置邮箱和作者
]# git config user.name "heng ha" ]# git config user.email "hengha@123.com"
2.2.3、提交
1、提交
]# git commit -m "Initial contents of public_html" --author="heng ha <hengha@123.com>"
2、查看是否有变更
- 工作目录是干净(clean)的,这意味着工作目录里不包含任何与版本库中不同的未知或者更改过的文件。
//没有暂存的变更和提交。 ]# git status On branch master nothing to commit, working tree clean
2.3、再次提交
1、修改index.html
]# vim index.html hhh My website is alive
2、再次提交
- 如果再次提交已经提交过的文件,可以不执行git add命令(因为这个文件已添加到版本库里了,git已经知道了)。当直接提交该文件时,该文件的变更会自动捕获!
]# git commit -m "Initial contents of public_html" --author="heng ha <hengha@123.com>" index.html
2.4、查看提交
2.4.1、git log命令
- git log命令会列出版本库里一系列单独提交的历史。
//从最新的到最老的顺序依次列出:每个条目包括提交作者的名字和email地址,提交日期,变更的日志信息和提交的内部识别码。 ]# git log commit 1b787c1d43d29bf43e872148da8b582740ddf1c5 (HEAD -> master) Author: heng ha <hengha@123.com> Date: Mon Mar 13 14:04:17 2023 +0800 Initial contents of public_html commit 66720441609a26ddbdae954f0bdabf82778d0d65 Author: heng ha <hengha@123.com> Date: Mon Mar 13 13:45:56 2023 +0800 Initial contents of public_html
2.4.2、git show命令
- git show命令可以查看特定提交的详细的信息。
- 如果在执行git show命令的时候没有显式指定提交码,它将只显示最近一次提交的详细信息。
]# git show 1b787c1d43d29bf43e872148da8b582740ddf1c5 commit 1b787c1d43d29bf43e872148da8b582740ddf1c5 (HEAD -> master) Author: heng ha <hengha@123.com> Date: Mon Mar 13 14:04:17 2023 +0800 Initial contents of public_html diff --git a/index.html b/index.html index 6a75d30..93de565 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -My website is alive +hhh My website is alive
2.4.3、git show-branch命令
- git show-branch命令列出当前开发分支简洁的单行摘要。
//参数“--more-10"表示列出10个版本,但是因为目前只有两个版本,所以显示了两行。master这个名字是默认的分支名。 ]# git show-branch --more=10 [master] Initial contents of public_html [master^] Initial contents of public_html
2.4.4、git diff命令
- git diff命令查看的两个版本之间的差异。
]# git diff 1b787c1d43d29bf43e872148da8b582740ddf1c5 66720441609a26ddbdae954f0bdabf82778d0d65 diff --git a/index.html b/index.html index 93de565..6a75d30 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -hhh My website is alive +My website is alive
2.5、重命名和删除版本库中的文件
2.5.1、重命名版本库中的文件
//(1)重命名版本库中的文件 ]# git mv index.html index123.html //(2)提交 ]# git commit -m "move index.html to index123.html" [master 7e7fcf4] move index.html to index123.html 1 file changed, 0 insertions(+), 0 deletions(-) rename index.html => index123.html (100%)
2.5.2、删除版本库中的文件
- 删除操作需要两步:
- (1)git rm表示要删除文件的意图,并暂存这个变更,
- (2)git commit在版本库里实现这个变更。
//(1)删除版本库中的文件 ]# git rm index123.html rm 'index123.html' //(2)提交 ]# git commit -m "Remove index123.html" [master ad74b82] Remove index123.html 1 file changed, 1 deletion(-) delete mode 100644 index123.html
2.6、克隆版本库
- 通过git clone命令可以创建一个完整的副本,或克隆。
//(1)进入项目的父目录 ]# cd ../ //(2)克隆项目 ]# git clone public_html my_website
- 虽然这两个Git版本库现在包含相同的对象、文件和目录,但是还有一些细微的差别。
//对比两个版本库 ]# diff -r public_html my_website
3、git的配置文件
- Git的配置文件全都是.ini风格的文本文件。
- Git支持不同层次的配置文件。优先级递减,如下所示。
- .git/config:版本库特定的配置,可用--file选项修改(默认)。最高优先级。
- ~/.gitconfig:用户特定的配置,可用--global选项修改。
- /etc/gitconfig:系统范围的配置,如果有它的UNIX文件写权限,可以用--system选项修改它。优先级最低。可能在其他位置(也许在/usr/local/etc/gitconfig),也可能完全不存在。
//查看设置 ]# git config -l //设置 ]# git config --global user.name "heng ha" ]# git config --global user.email "hengha@123.com" //取消设置 ]# git config --unset --global user.name
- 命令别名
//git show-graph相当于git log --graph --abbrev-commit --pretty=oneline ]# git config --global alias.show-graph \ 'log --graph --abbrev-commit --pretty=oneline'
9、命令
9.1、git init命令
- git init命令会创建一个空的Git版本库。即在指定目录中创建了一个隐藏目录“.git”,Git会把所有修改的信息都放在.git目录里。
- .git目录中包含objects、refs/heads、refs/tags和template等子目录。
- 可以通过环境变量GIT_DIR,指定Git版本库的基础目录。默认使用“./.git”目录。
- 可以通过环境变量GIT_OBJECT_DIRECTORY,指定对象存储目录。默认使用$GIT_DIR/objects目录。
- 在现有的版本库中执行git init是安全的,它不会覆盖已经存在的东西。重新执行git init的主要原因是获取新添加的模板(或者如果指定了--separate-git-dirr,会将版本库移动到另一个地方)。
]# git init --help git init [-q | --quiet] [--bare] [--template=<template_directory>] [--separate-git-dir <git dir>] [--object-format=<format>] [-b <branch-name> | --initial-branch=<branch-name>] [--shared[=<permissions>]] [directory]
- 命令参数说明:
- -q, --quiet:只输出错误和警告消息。
- --bare:创建裸版本库。如果没有设置环境变量GIT_DIR,则使用当前工作目录。
- --object-format=<format>:(实验性选项)为版本库指定对象格式(哈希算法)。有效值为sha1(默认)、sha256。
- --template=<template_directory>:指定模板目录。
- --separate-git-dir=<git dir>:指定Git版本库的基础目录,不使用环境变量GIT_DIR和“./.git”。如果重新初始化,会将版本库将移动到指定的路径。
- -b <branch-name>, --initial-branch=<branch-name>:为新创建的版本库中的初始分支指定的名称。如果未指定,则使用默认名称(目前为master。可以通过init.defaultBranch变量自定义)。
- --shared[=(false|true|umask|group|all|world|everybody|0xxx)]:指定Git版本库要在多个用户之间共享。如果指定了配置变量"core.sharedRepository",可以在$GIT_DIR下创建具有请求权限的文件和目录。如果没有指定,Git将使用umask报告的权限。
9.2、将文件添加到git版本库(git add)
- 如果目录中已经有了很多文件,可以使用"git add ."命令把当前目录及子目录中的文件都添加到版本库里。
- git add命令会将新的或修改过的文件添加到git版本库的git版本库中,可以在提交之前多次执行。为提交到git版本库做准备。
]# git add --help git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize] [--chmod=(+|-)x] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>...]
- 命令参数说明:
- <pathspec>...:Fileglobs可以用来添加所有匹配的文件,例如*.c。也可以是一个目录,可以将整个目录的变动添加到git版本库(例如,可以修改目录中的文件dir/file1,在目录中新增一个文件dir/file2,也可以删除目录中的一个文件dir/file3)。注意,旧版本的Git会忽略删除的文件,如果想添加修改或新文件,但忽略删除的文件,请使用--no-all选项。
- -n, --dry-run:只显示文件是否存在、是否忽略。
- -v, --verbose:冗长的
- -f, --force:要被忽略的文件。
- -i, --interactive:以交互方式将修改添加到git版本库中。
- -p, --patch:以交互方式,选择git版本库和工作树之间的补丁块,并将它们添加到git版本库中。这让用户有机会在将修改的内容添加到git版本库之前查看差异。
- -e, --edit:在编辑器中打开。
- -u, --update:在已经有匹配<pathspec>的条目的地方更新索引。这将删除并修改索引条目以匹配工作树,但不会添加新文件。如果在使用-u选项时没有给出<pathspec>,则会更新整个工作树中的所有被跟踪文件(旧版本的Git用于将更新限制在当前目录及其子目录中)。
- -A, --all, --no-ignore-removal:不仅要更新工作树中有匹配kk的文件的索引,还要更新索引中已经有一个条目的索引。这将添加、修改和删除索引项,以匹配工作树。
- 如果在使用-A选项时没有给出kk,则会更新整个工作树中的所有文件(旧版本的Git用于将更新限制在当前目录及其子目录中)。
- --no-all, --ignore-removal:通过添加索引未知的新文件和工作树中修改过的文件来更新索引,但忽略已从工作树中删除的文件。当不使用kk时,此选项为no-op。
- 这个选项主要是帮助使用旧版本Git的用户。
- -N, --intent-to-add:只记录稍后将添加路径的事实。路径的条目被放置在没有内容的索引中。这对于使用git diff显示这些文件的未分级内容以及使用git commit -a提交这些文件非常有用。
- --refresh:不要添加文件,而只是在索引中刷新它们的stat()信息。
- --ignore-errors:如果某些文件由于索引错误而无法添加,不中止操作,而是继续添加其他文件。该命令仍将以非零状态退出。可以设置配置文件add.ignoreErrors=true。
- --ignore-missing:此选项只能与--dry-run一起使用。通过使用这个选项,用户可以检查给定的文件是否会被忽略,无论它们是否已经存在于工作树中。
- --no-warn-embedded-repo:默认情况下,git add会在没有使用git子模块add在.gitmodules中创建条目的情况下,将一个嵌入式版本库添加到索引中发出警告。此选项将抑制警告(例如,如果您在子模块上手动执行操作)。
- --renormalize:对所有被跟踪的文件应用“清理”过程,强制将它们再次添加到索引中。这在更改核心后是有用的。配置或文本属性,以纠正添加了错误的CRLF/LF行结尾的文件。这个选项意味着-u。
- --chmod=(+|-)x:覆盖添加文件的可执行位。可执行位只在索引中改变,磁盘上的文件保持不变。
- --pathspec-from-file=<file>:Pathspec在<file>中传递,而不是命令行参数。如果<file>是“-”,那么使用标准输入。
- --pathspec-file-nul:只有在--pathspec-from-file中才有意义。Pathspec元素用NUL字符分隔,所有其他字符按字面意思(包括换行符和引号)。
- --:这个选项可以用来将命令行选项从文件列表中分离出来(当文件名可能被误认为命令行选项时很有用)。
9.3、查看工作树(git status)
- 显示索引文件和当前HEAD commit之间有差异的路径,工作树和索引文件之间有差异的路径,以及工作树中没有被Git跟踪的路径(并且没有被gitignore忽略)。
- 第一个是运行git commit所提交的内容。
- 第二个和第三个是在运行git commit之前运行git add可以提交的内容。
]# git status --help git status [<options>...] [--] [<pathspec>...]
- 命令参数说明:
- -s, --short:以简短格式进行输出。
- -b, --branch:以简短的格式显示分支和跟踪信息。
- --show-stash:显示当前隐藏的条目数量。
- --porcelain[=<version>]:以易于解析的脚本格式进行输出,类似于简短的输出。version指定格式版本,默认为原始版本v1格式。
- --long:以长格式进行输出(默认)。
- -v, --verbose:除了已更改的文件名称外,还显示将要提交的文本更改(例如git diff——cached的输出)。如果-v被指定两次,那么还会显示工作树中尚未分级的更改(例如git diff的输出)。
- -u[<mode>], --untracked-files[=<mode>]:显示未跟踪的文件。可用值有no、normal、all(默认)。
- no:显示没有未跟踪的文件。
- normal:显示未跟踪的文件和目录
- all:还显示未跟踪目录中的单个文件。
- 当不使用-u选项时,将显示未跟踪的文件和目录(即与指定normal相同),以帮助您避免忘记添加新创建的文件。因为在文件系统中查找未跟踪的文件需要额外的工作,所以在大型工作树中,这种模式可能需要一些时间。
- --ignore-submodules[=<when>]:在寻找更改时,忽略对子模块的更改。<when>可以是none、untracking、dirty、all(默认)
- 当子模块包含未跟踪或已修改的文件,或者它的头部与superproject中记录的commit不同时,使用"none"将认为子模块被修改了,并且可以用来覆盖git-config或gitmodules中ignore选项的任何设置。当使用“untracking”时,如果子模块只包含未跟踪的内容(但仍然扫描修改的内容),则它们不会被认为是脏的。使用“dirty”忽略对子模块工作树的所有更改,只显示对存储在superproject中的提交的更改(这是1.7.0之前的行为)。使用“all”隐藏对子模块的所有更改(并在配置选项状态时抑制子模块摘要的输出)。设置submoduleSummary)。
- --ignored[=<mode>]:显示被忽略的文件。<mode>可以是traditional(默认)、no、matching。
- traditional:显示被忽略的文件和目录。除非指定了--untracking-files=all,这时,将显示被忽略目录中的单个文件。
- no:显示没有被忽略的文件。
- matching:显示匹配ignore模式的被忽略的文件和目录。
- 当指定匹配模式时,将显示显式匹配被忽略模式的路径。如果一个目录匹配一个忽略模式,那么它将被显示,但不显示被忽略目录中包含的路径。如果一个目录不匹配一个忽略模式,但是忽略了所有内容,那么这个目录就不显示,但是显示了所有内容。
- -z:用NUL而不是LF来终止条目。如果没有给出其他格式,这意味着--porcelain=v1输出格式。
- --column[=<options>], --no-column:以列显示未跟踪的文件。不带选项的--column和--no-column分别等价于always和never。
- --ahead-behind, --no-ahead-behind:显示或不显示分支相对于其上游分支的详细超前/滞后计数。默认为true。
- --renames, --no-renames:不管用户配置如何,打开/关闭重命名检测。
- --find-renames[=<n>]:打开重命名检测,可选地设置相似性阈值。
- <pathspec>...:参见gitglossary(7)中的pathspec条目。
9.4、提交(git commit)
- 创建一个新的提交,其中包含索引的当前内容和描述更改的给定日志消息。新的提交是HEAD的直接子节点,通常是当前分支的顶端,并且分支被更新并指向它(除非没有分支与工作树相关联,在这种情况下,HEAD被“分离”)。
- 提交的内容可以通过几种方式指定:
- (1)通过git-add在commit之前增量地“添加”索引的更改(注意:即使修改过的文件也必须“添加”)。
- (2)在使用commit命令之前,使用git-rm从工作树和索引中删除文件。
- (3)通过将文件作为commit命令的参数列出(没有--interactive或--patch),在这种情况下,commit将忽略在索引中暂存的更改,而是记录所列出文件的当前内容(Git必须已经知道这些内容);
- (4)通过使用-a和commit命令自动“添加”所有已知文件(即索引中已经列出的所有文件)的更改,并自动“rm”索引中已经从工作树中删除的文件,然后执行实际的commit;
- (5)通过在commit命令中使用--interactive或--patch来决定除了索引中的内容外,哪些文件或块应该作为commit的一部分,然后完成操作。
- 如果提交之后,立即发现了一个错误,可以使用git reset进行重置。
]# git commit --help git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend] [--dry-run] [(-c | -C | --fixup | --squash) <commit>] [-F <file> | -m <msg>] [--reset-author] [--allow-empty] [--allow-empty-message] [--no-verify] [-e] [--author=<author>] [--date=<date>] [--cleanup=<mode>] [--[no-]status] [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]] [-S[<keyid>]] [--] [<pathspec>...]
- 命令参数说明:
- -m <msg>, --message=<msg>:提交的消息。如果给出了多个-m选项,会将它们的值做为单独的段落。-m与-c、-c、-F互斥。
- --author=<author>:提交者的邮箱,使用<author@example.com>格式指定作者。
1
# #