第二节:Git基本操作(关键词:git add、commit、diff、reset、checkout、rm、mv)
文章目录
本节涉及Git命令
git init:初始化git仓库git status -s:以简短方式查看仓库状态git commit --amend:将新更改追加到上一次提交中git commit --amend --no-edit:将新更改追加到上一次提交中(不提交消息)git diff:比较工作区与暂存区差异git diff --cached:比较暂存区和上一次提交的差异git diff commit1 commit2:比较两个提交之间的差异git diff branch1..branch2:比较两个分支之间的差异git diff -stat:显示摘要而非整个diffgit reset --hard:重置暂存区和工作目录内容git reset --soft:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区git reset --mixed:保留工作目录,并清空暂存区中未提交的修改git reset HEAD:用于取消之前的git add操作git reset HEAD^:回退到当前分支的前一个提交,也就是撤销上一次提交操作,这个命令通常用于撤销错误的提交或者重新整理提交历史git reset HEAD~n:回退到当前分支的前n个提交git checkout --<filename>:将指定文件恢复到上一次提交时的状态gut checkout <commit> <filename>:将指定文件恢复到指定版本号git rm:删除git mv:移动或重命名
一:Git基本工作流程
下图展示了Git的基本工作流程,如果不涉及分支操作、远程操作等的话(这些操作会在后面详细讲解),其实Git的命令还是比较固定的,掌握起来也比较容易的
- workspace:工作区
- statging area:暂存区
- local repository:版本库(或常称为本地仓库)
- remote repository:远程仓库

二:Git基本操作
(1)git init
略
(2)git add
作用:添加文件到暂存区,用法如下
git add [file1] [file2]... # 添加一个或多个文件到暂存区
git add [dir] # 添加目录到暂存区(包括暂存区)
git add . # 添加当前目录下的所有文件到暂存区
举例:
如下,创建两个文件README.md和Hello.py

使用git status -s查看状态,发现有两个文件发生改动

现在,使用git add命令将这两个文件添加到暂存区
继续使用git status -s查看状态,可以发现文件已经被添加。关于git status所显示的标志位的含义如下
A: 本地新增的文件(服务器上没有)C: 文件的一个新拷贝D: 本地删除的文件(服务器上还在)M: 文件的内容或者mode被修改了R: 文件名被修改了T: 文件的类型被修改了U: 文件没有被合并(需要完成合并才能进行提交)X: 未知状态(很可能是遇到了git的bug,可以向git提交bug report)

现在我们对README.md文件和Hello.py文件分别进行如下修改

继续使用git status -s查看状态,可以发现文件已经被修改

然后再使用git add命令进行添加

(3)git commit
作用:于将更改提交到Git存储库中。每次提交都包含一条消息,描述了提交所做的更改的概要,参数含义如下
-a: 自动添加所有已修改或已删除的文件,省去了git add命令的步骤。-m <message>: 提供提交消息的文本。如果不提供-m选项,Git将打开文本编辑器以允许输入提交消息。--amend: 将新的更改追加到最近的一次提交中。如果你想添加更改或修复之前提交的错误,这个选项会很有用。--no-edit: 使用与之前一样的提交消息,不打开编辑器进行更改。只有当你想要修改更改而不修改提交消息时才会使用这个选项。--allow-empty-message: 允许提交一个空的提交消息。不推荐使用,因为提交消息是记录更改历史的重要组成部分。--no-verify: 禁止 Git 钩子(hook)执行。Git 钩子是在特定事件发生时自动执行的脚本,如提交前验证,这个选项会忽略这些脚本。-v: 在提交消息中包含当前更改的差异。这在提交时需要查看更改内容时很有用
git commit [-a] [-m <message>] [--amend] [--no-edit] [--allow-empty-message] [--no-verify] [-v]
常用使用方法如下
git commit -a -m 'message' # 将所有改动自动添加到提交中
git commit --amend # 将新更改追加到上一次提交中(此时会打开编辑器让你输入新提交消息)
git commit --amend --no-edit # 将新更改追加到上一次提交中(不提交消息)
举例:
如下,利用git commit将刚才新添加的文件进行提交

现在,对Hello.py文件追加一句"print(Hello Python)",然后添加到暂存区

然后,我想把这一次更改直接追加到上一次的提交中且不输入新的提交消息,所以可以利用git commit --amend --no-edit命令

(4)git diff
作用:用于比较文件在暂存区和工作区的差异。用法如下
git diff # 比较工作区与暂存区的差异
git diff --cached # 比较暂存区和上一次提交的差异
git diff commit1 commit2 # 比较两个提交之间的差异
git diff branch1..branch2 # 比较两个分支之间的差异
git diff --stat # 显示摘要而非整个diff
举例:
如下,在README.md文件后添加一句"And we are doing a test",然后添加到暂存区
接着使用git diff --cached对比暂存区和上一次提交的差异,各字段含义如下
diff --git a/README.md b/README.md:这一行表示Git将要对比的文件名。在这个例子中,Git将会对比名为README.md的文件index e48f963..e8102b0 100644:这一行显示了两个十六进制数字,它们是Git用来比较两个文件版本的哈希值。这个数字是Git根据文件内容计算的,当文件的内容发生改变时,哈希值也会改变。在这个例子中,两个版本的哈希值分别为e48f963和e8102b0--- a/README.md和+++ b/README.md:表示旧版本的文件名(a表示旧文件)。在这个例子中,旧版本的文件名是README.md;表示新版本的文件名(b表示新文件)。在这个例子中,新版本的文件名是README.md@@ -1 +1,2 @@:显示了修改的行范围。在这个例子中,它表示在第1行添加了1行内容(+1,2表示在第1行开始添加了2行内容)This is README file:旧版本文件内容+And we are doing a test:表示新版本的文件内容。在这个例子中,新版本的内容是And we are doing a test。注意到这一行前面有个加号,表示这是一行新添加的内容

现在继续修改工作区中的README.md,在其后面添加一句“Hello Boy”

然后使用git diff命令对比工作区和暂存区的差异

现在再把README.md文件添加至暂存区,然后进行提交
- 注意:此时会覆盖原先暂存区的内容,在Git中,如果你多次将同一文件添加到暂存区,每次添加都会覆盖之前的暂存区内容,最终只有最后一次添加的内容会被提交。因此,如果你想要保存之前的暂存区内容,你可以在提交之前使用
git stash命令将当前的修改暂存起来,然后再进行提交。如果你想要将之前暂存的内容恢复回来,可以使用git stash pop命令将其应用到当前分支上

现在,我们可以根据版本号对这两次提交进行对比

(5)git reset
A:概述
作用:用来撤销 Git 仓库中的更改,包括恢复已被删除的文件、重置提交等操作。其语法格式如下
[--soft | --mixed | --hard]:三个可选参数,其中--mixed为默认[HEAD]:表示版本号,可以回退至指定版本
git reset [--soft | --mixed | --hard] [HEAD]
关于git reset三个参数各自含义如下
git reset --hard(危险操作,容易造成丢失):在重置版本的同时,重置暂存区和工作目录里的内容。也就说,就是在暂存区中你没有commit的修改会被全部擦掉,在工作区中你没有add的修改也被全部擦掉git reset --soft(保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区):在重置版本库的时候,保留工作目录和暂存区中的内容,并把重置版本库所带来的新的差异放进暂存区。也就说是说,工作目录的内容不受影响,而暂存区中已经commit的内容变成已add的状态git reset(不加参数mixed,保留工作目录,并清空暂存区中未提交的修改):也就是说,工作目录的修改、暂存区的未提交的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是把所有差异都混合(mixed)放在工作目录中

举例:
如下,现在对于README.md和Hello.py文件已经有两次提交了

这里我们使用git reset命令回退至第一次提交时的状态

使用git reset命令时要特别注意,因为它会永久性删除之前的提交记录,所以这里你再也查看不到第二次的提交记录了

解决方法就是使用git reflog命令,该命令用于查看 Git 仓库的引用记录,可以显示当前分支指向的历史记录,包括已经被删除的提交和分支。它记录了仓库中所有的提交操作和指针移动,并保留了最近 90 天的记录。对于本例,各字段所表示含义如下
HEAD@{0}:最近一次操作是reset,将当前分支master移动到 commitec697df8bd88fadaa7cd84d8de879ea23dc9190e。HEAD@{1}:最近一次操作是commit,创建了一个新的提交,对README.md文件进行了修改。HEAD@{2}:最近一次操作是commit --amend,在上一次提交的基础上进行了修改,并将其合并到同一个提交中。HEAD@{3}:最近一次操作是commit,创建了一个新的提交,其中包括两个文件的第一次提交。
因此这里我们依然可以用git reset回到最新的提交上

B:git reset 和 HEAD
git reset 和 HEAD 通常是一起使用的,前文说过,HEAD 指针在 Git 中是一个指向当前所在分支最近一次提交的指针。常用用法如下
git reset HEAD # 用于取消之前的 git add操作
git reset HEAD^:# 回退到当前分支的前一个提交,也就是撤销上一次提交操作,这个命令通常用于撤销错误的提交或者重新整理提交历史
git reset HEAD~n:# 回退到当前分支的前n个提交
例子:
如下,在Hello.py文件后面添加"print(“HAHA!”)",然后添加至暂存区

这里我们就可以使用git reset HEAD命令来撤销之前的添加操作了

上面只是为了展示git reset HEAD的效果,这里我们还是将其添加到暂存区,然后提交(这是第三次提交)

git reset HEAD^表示回到上一次提交(也就是第二次),git reset HEAD~2表示回到上上次提交(也就是第一次)
git reset HEAD~2和git reset HEAD^^等价,以此类推
C:git checkout
git checkout命令会在后面的“分制管理”中详说明,这里介绍的原因是其有一个很常用的用法就是可以回滚某个指定文件
git checkout --<filename> # 将指定文件恢复到上一次提交时的状态
git checkout <commit> <filename> # 将指定文件恢复到指定版本号
如下,利用git checkout将Hello.py文件回滚
(6)git rm
A:rm命令
rm是Linux系统中的删除命令,其效果等价于Windows中的右键删除,会把工作区的文件删除。因此,如果你想要删除这个操作提交到远程仓库,还需要执行git add和git commit
如下,这里我们将Hello.py文件删除

然后添加到暂存区和提交

(这里为了便于后面的展示,我们将版本回退至“第三次提交处(提交信息为:对Hello.py文件的修改)”)

B:git rm
作用:用于删除文件,其常用用法主要有如下三个
git rm:- 删除工作区中的文件,同时将删除的文件添加到暂存区
git rm可以简单理解为rm+git add- 注意:git rm 删除的文件必须是 没有经过修改的,也就是说必须要和当前版本库的内容一致的
git rm -f:- 当工作区中的文件经过修改后,再想使用
git rm命令时,就需要添加-f参数,表示强制删除 工作区中的文件 - 当工作区中的文件经过修改后,且使用
git add命令添加到暂存区后,再想使用git rm命令时,就需要添加-f参数,表示强制删除 工作区中和暂存区中的文件,并将删除添加到暂存区
- 当工作区中的文件经过修改后,再想使用
git rm --cached:- 会删除暂存区中的文件,但是会保留工作区中的文件,并将此次删除提交到暂存区
- 文件从暂存区中删除掉,即不会被提交到版本库中,也就是说此文件被取消了版本控制
- 可以这样理解:向暂存区告知本文件已经删除,但工作区却偷偷保留这个文件。于是
commit后仓库就不会有这个文件,是为了用户本次不想上传某些缓存文件设立
另外还需要注意git rm命令和rm命令的区别:当使用 rm 命令删除文件时,文件会被直接删除并从文件系统中移除。但是,当使用 git rm 命令删除已经被 Git 跟踪的文件时,Git 会记录该文件已经被删除,同时还会将删除操作添加到 Git 的暂存区中。这样做的好处可以在下一次提交时,将删除操作提交到 Git 仓库中,从而保留 Git 仓库的完整性和历史记录。因此,可以将 git rm 命令理解为一系列操作的组合,包括从本地文件系统中删除文件、从 Git 的暂存区中删除文件,并将这个变更添加到下一次提交中
rm:是一个操作系统级别的命令,用于从文件系统中删除文件;如果你只是想从文件系统中删除一个文件,并不想将其从 Git 版本控制中删除,那么应该使用rm命令git rm:是一个 Git 命令,用于从 Git 仓库中删除文件;如果你希望删除一个文件,并将其从 Git 版本控制中移除,那么你应该使用git rm命令
举例:
如下图,新建一个文件Test.py

此文件现在未被Git管理,因此使用git rm命令无法删除

这种情况下只能使用系统级别的命令rm进行删除

这里我们再次新建这个文件并将其添加到暂存区

现在使用git rm -f删除此文件

(7)git mv
作用:用于将文件或目录移动或重命名,并在Git中记录更改。语法格式如下,其中,source表示要移动或重命名的文件或目录的当前位置,destination表示文件或目录应该移动到的新位置或应该被重命名为的新名称
git mv <source> <destination>
例子:
如下,创建一个名为dir1的文件夹,然后将Hello.py和README.md文件移动进去

然后进行提交

然后再将Hello.py文件重命名为HelloWorld.py

但此时运行git log你会发现找不到这个HelloWorld.py文件的提交记录,所以此时可以用git log --follow

更多推荐
所有评论(0)