您现在的位置是:首页 >学无止境 >Git基础操作网站首页学无止境
Git基础操作
2 Git基础知识
本章学习以后应该具备的能力
- 配置和初始化本地库
- 开始或停止跟踪文件
- 暂存和提交更改
- 如何设置git以忽略文件或文件模式
- 如何快速纠正错误
- 如何浏览项目历史,查看每次提交之间的变化
- 如何向远程存储库推送及如何从远程存储库提取文件
2.1 创建Git存储库
获取一个git存储库有以下两种方式:
- 将本地目录(未受版本控制的)转换为一个git存储库;
- 从其他地方克隆现有的git存储库
2.1.1 从现有目录中初始化存储库
如果想使用git对现有项目进行版本控制:
- 进入到项目目录下,即项目保存的位置:
C:UsersAdministratorDesktoplocalrepository
,然后在当前目录打开Git Bash Here
。
- 使用指令
git init
初始化当前目录,此时会创建一个名为.git
的子目录,里面包含所有必要的存储库文件。
- 启动版本控制现有项目,应该先使用
git add
让git记住该项目的所有文件,然后使用git commit
提交。
git add .*
:首次使用时,是让git记住项目的所有文件
git commit -m 'Initial project version'
:-m
是message的缩写,给本次提交添加一条提交信息。
2.1.2 克隆现有存储库
当使用git clone
指令时,默认会拉取项目历史记录种的每个文件的每个版本。
-
使用指令
git clone <url>
可以拉取存储库,如克隆名为libgit2的git可链接存储库
git clone https://github.com/libgit2/libgit2
-
如果不想使用libgit2作为目录名,可以自定义一个目录名参数,指令如下:
git clone https://github.com/libgit2/libgit2 mydirectoryname
2.2 记录对存储库的更改
- 已跟踪文件:git已知文件,如刚刚克隆下来的文件
- 未跟踪文件:在上次快照中没有的文件,也不会加入暂存区
- 当我们编辑文件时,git认为该文件被修改,我们需要暂存这些被修改的文件,然后提交,如果不暂存,git认为它是被修改。
2.2.1 检查文件状态
git status
指令:确定哪个文件处于哪种状态,如未跟踪、修改和暂存三种状态。
下面是对刚克隆的存储库使用git status
。
1. working tree clean:干净的工作目录,即未修改任何跟踪文件。跟踪文件就是git已知的文件
2. 如果git检查到有未跟踪文件,也会被列出。
现在,在刚克隆下来的项目中创建一个TEST.md文件,再使用git status
,观察结果。
未跟踪文件是上次快照中没有的文件,没有加入到暂存区,它也不会被加入到下次提交中。
2.2.2 跟踪新文件
git add
指令:将文件加入暂存区。
现在可以看到它已经是staged状态,即已经加入暂存区。当我们提交时,运行git commit
指令时的项目就会变成一个历史快照,提交以后的项目为最新的快照。
2.2.3 暂存修改的文件
-
修改README.md文件,然后运行
git status
。
-
使用
git add
将修改的文件加入暂存区。
加入暂存区的文件在下次执行git commit
指令时会被提交到git库中。 -
对已加入暂存区的README.md文件再次修改,会发生什么?使用
git status
观察结果。
在第二次修改后,未使用git add
指令,即第二次修改的文件未加入暂存区。此时git有两个版本的README.md,第一版第一次修改且已暂存,第二版第二次修改未暂存 -
执行
git commit
将提交第一版README.md。再次执行git add
将第二版加入暂存区,才能提交第二版。即每次文件修改后都要执行git add
指令将修改的文件加入暂存区,才能提交修改的内容。
git add
指令实际上是一个多用途指令。
- 执行
git init
后首次使用git add *
是为了跟踪项目中的文件(加入暂存区); - 加入新文件后或者修改文件后使用
git add
是将文件或修改的文件加入到暂存区。 - 简单的理解
git add
指令是将文件加入暂存区,暂存区中的文件在执行git commit
时会被提交。
2.2.4 简洁的状态信息
git status
获取的状态信息比较长,git status -s
或git status --short
指令可以获取更精简的状态信息。
??
:代表未跟踪文件A
:代表已添加到暂存区的新文件M
:为修改的文件,修改一次有一个M
2.2.5 忽略文件
忽略项目中的某些文件,当执行git status
时,git不会将其标记为untracked
状态。可以创建一个.gitignore
文件,根据规则匹配你想要忽略的文件。简单的说,创建一个.gitignore
文件,里面存放一些与被忽略文件名相匹配的正则表达式规则。
全局模式(Glob patterns)就像简化的正则表达式:
*
:匹配0或多个字符[abc]
:匹配括号中的任何字符?
:匹配单个字符[0-9]
:匹配它们之间的任何字符,如这个是0-9之间的任何字符**
:两个星号匹配嵌套目录,如a/**/z
可以匹配a/z
、a/b/z
、a/b/c/z
等
下面是一个.gitignore
文件示例
项目根目录中的.gitignore
文件应用于整个库,子目录中的.gitignore
文件只应用于它们所在的目录。
2.2.6 查看已暂存和未暂存的更改
-
git diff
指令:查看已修改但未暂存的内容。
-
git diff --staged
指令:查看已修改且已暂存的内容。
另外就是,先修改并暂存,然后再修改不暂存,此时执行git diff
指令。
- 以README.md为例
- 分别执行
git diff
和git diff --staged
- 使用
git diff --staged
和git diff --cached
都可以查看当前哪些修改时已暂存的
2.2.7 提交更改
未加入暂存区的新增(created)和修改(modified),执行git commit
时不会被提交。
git commit
指令:将暂存区中的文件提交到git库。
-
直接使用
git commit
时,会进入编辑器,可以在编辑器中添加提交信息。
-
在执行
git commit
同时使用-m
,可以直接添加提交信息
2.2.8 跳过暂存区
git commit -a
:在git commit
后使用-a
选项,跳过暂存区直接提交更改。
2.2.9 删除文件
rm <file>
:将文件移出暂存区,同时从项目目录中删除。但删除记录没有提交到本地git库
git rm <file>
:将本次删除提交到本地git库中记录下来。
- 如果已修改了的文件或已加入暂存区的文件,必须使用
-f
标签强制删除。
git rm --cached <file>
:只从暂存区删除(git不再跟踪该文件),本地保留该文件。
- 可以将文件,目录或者文件glob模式传给
git rm
指令
git rm log/*.log
:删除log目录下所有以.log为扩展名的文件
git rm *~
:删除所有名称以~
结尾的文件
2.2.10 移动文件
git mv file_from file_to
:重命名文件
相当于执行了3条指令
mv Hello Hello.md
:先删除Hello,新建一个Hello.md
git rm Hello
:将删除Hello的记录提交
git add Hello.md
:将新文件Hello.md加入暂存区(git跟踪该文件)
2.3 查看提交历史
-
git log
指令:查看当前项目的所有提交历史
-
-p 或 --patch
参数:显示每次提交中引入的差异,再传入一个-2
只显示最新的两条记录
-
--stat
参数:查看每个提交的缩写统计数据
-
--pretty
参数:改变log输出的格式,可以使用一些预设的值-
oneline
:每个提交打印在一行,适用于查看大量提交
-
short、full、fuller
:以相同的格式输出,但信息会较少或较多 -
format
:按照自己设置的格式打印信息
-
-
git log
的所有参数选项
2.3.1 限制日志(log)输出
-
-<n>
参数:n为正整数,意为输出最新的n条提交信息
-
--since/--until
:时间限制,可以指定日期(2008-01-15
)或相对日期(2 years 1 day 3 minutes ago)
-
--author
:指定作者 -
--grep
:指定提交信息中的关键字,可以同时筛选作者和提交信息中的关键字 -
-S
:接收一个字符串,显示改变了该字符串出现次数的提交 -
git log -- path/to/file
:传入一个目录路径,将输出限制为对该路径下文件的修改的提交 -
git log
的限制选项
-
--no-merges
:限制显示合并提交,合并提交内容不多。
2.4 撤销操作
撤销操作不能被撤销
git commit --amend
:--amend
如果上一次的提交有问题,该选项可以重新提交。
例如:提交时,某个文件忘记加到暂存区,可以做以下操作
git commit -m 'Initial commit'
:首次提交(第一次提交)
git add forgotten_file
:将忘记添加的文件加入暂存区
git commit --amend
:重新提交(第二次提交)
最后,第二次提交会替换第一次提交。
使用--amend
重新提交时,是使用第二次的提交替换第一次的提交,第一次的提交并不会被记录在项目历史中。
2.4.1 取消暂存文件的暂存
取消已加入暂存区的文件
例如:有两个被修改的文件,想分两次提交更改,但我们使用了$ git add *
,此时如何取消暂存其中的一个
git reset HEAD <file>
:取消暂存
git restore --staged <file>
:git 2.23.0版本以后都使用git restore代替
2.4.2 取消修改文件的修改
取消已修改但未加入暂存区的文件
git checkout -- <file>
git restore <file>
撤销操作比较危险的指令,我们对这个文件进行的所有本地更改都会消失,git只是使用最后一个暂存或提交的文件替换了该文件。
2.5 远程工作
2.5.1 显示远程
git remote
:查看配置了哪些远程服务器,显示简称。如果没有将看到origin,这是Git为克隆的服务器提供的默认名称
-v
:可以显示一个URL
如果不止一个远程库,git将列出所有库的url和对应的简称,这样我们可以从这些库拉取内容或推送内容至这些库
2.5.2 添加远程仓库
git remote add <简称> <url>
:将一个远程库添加到git库中
2.5.3 从远程端获取拉取
git fetch
git fetch <remote>
:从远程项目中获取数据,指向远程项目,并从远程项目中获取你还没有的所有数据。- 如果克隆了一个库,这个库会被自动的添加到"origin"下,使用
git fetch origin
可以获取自克隆以后该远程项目的任何新数据。 git fetch
只是将数据下载到本地库中,不会自动合并,需要手动合并。
git pull
- 如果当前分支设置了跟踪一个远程分支,使用
git pull
可以自动拉取远程分支,并合并到当前分支中 - 默认情况下,
git clone
会默认设置本地master分支跟踪克隆服务器上的master分支
2.5.4 向远程端推送
**git push <remote> <branch>**
git push <origin> <master>
:将你本地的master分支推送到远程克隆服务器master分支。
当有其他人正在向该远程项目推送内容时,你的推送会被拒绝,必须拿到他的推送内容以后才可以推送,即不能多人同时向同一个远程项目推送内容。
2.5.5 检查远程端
git remote show <remote>
:查看远程项目更多信息,其中<remote>
可以是远程项目的url也可以是简称
2.5.6 重命名或删除远程端
git remote rename
:修改远程库的简称。
如,将origin改为zhao,$ git remote rename origin zhao
git remote remove 或 git remote rm
:删除远程库。删除该引用以后,与该库相关的远程跟踪分支和配置设置也会被删除。
2.6 标记
2.6.1 列出标签
git tag
:查看已存在的标签,-l或--list
可选项
git tag -l "v1.8.5*"
:只查看v1.8.5*系列的标签,必须使用-l
或--list
2.6.2 创建标签
Git提供两种标签:轻量级标签和带注释的标签
- 轻量级标签:一个指向特定提交的指针
- 带注释的标签:将完整对象保存在Git数据库,它们是校验和,包含标记者姓名、电子邮箱和日期等等
2.6.3 带注释的标签
git tag -a v1.0 -m "version v1.0"
:在tag后使用-a
创建标签,-m
则为标签信息。如果创建时不使用-m
,git会启动编辑器,可以输入标签信息。
2.6.4 轻量级标签
轻量级标签基本是存储在文件中的提交校验和,没有其它信息。
创建轻量级标签不要提供-a
、-s
或-m
等选项,只需要一个标签名
git tag v1.2
2.6.5 稍后标记
如果你在提交以后,忘记进行标签。可以之后再进行标签,但需要提供要那次提交的校验和。
git tag -a v0.1 bcf4616
:对以前的某次提交创建标签,需要提供该次提交的校验和
2.6.6 共享标签
git push
指令不能直接将标签传输到远程服务器,必须显式的将标签推送到共享服务器
git push origin <tagname>
:一次推送一个标签。--tags
:一次推送多个标签,如git push origin --tags
。
这样其他人克隆你的库时,也会获取到所有标签
$ git push <remote> --tags
:将推送轻量级标签和带注释的标签
$ git push <remote> --follow-tags
:之推送带注释的标签
2.6.7 删除标签
git tag -d <tagname>
:删除本地库上的标签,记住这并没有删除远程库上的标签
删除远程库上的标签有两种方式:
git push <remote> :refs/tags/<tagname>
:git push origin --delete <tagname>
:
2.6.8 迁出标记
如果想查看标记所对应的文件的版本,可以对该标记进行签出,但会使该存储库处于分离的HEAD状态。
git check <tagname>
分离的HEAD状态:该状态下提交更改,标记将保持不变,新提交不属于任何分支且无法访问,除非使用提交哈希
2.7 Git别名
为git指令设置一个别名,这样在输入长指令时可以直接输入短的别名。这必须使用git config
指令配置
如上,在给git commit
设置别名以后,我们只需输入git ci
就等同于git commit
,大大提高了效率。