赞
踩
本节涉及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
:显示摘要而非整个diff
git 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 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
命令进行添加
作用:于将更改提交到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
命令
作用:用于比较文件在暂存区和工作区的差异。用法如下
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 stash
命令将当前的修改暂存起来,然后再进行提交。如果你想要将之前暂存的内容恢复回来,可以使用 git stash pop
命令将其应用到当前分支上现在,我们可以根据版本号对这两次提交进行对比
作用:用来撤销 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
移动到 commit ec697df8bd88fadaa7cd84d8de879ea23dc9190e
。HEAD@{1}
:最近一次操作是 commit
,创建了一个新的提交,对 README.md
文件进行了修改。HEAD@{2}
:最近一次操作是 commit --amend
,在上一次提交的基础上进行了修改,并将其合并到同一个提交中。HEAD@{3}
:最近一次操作是 commit
,创建了一个新的提交,其中包括两个文件的第一次提交。因此这里我们依然可以用git reset
回到最新的提交上
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^^
等价,以此类推git checkout
命令会在后面的“分制管理”中详说明,这里介绍的原因是其有一个很常用的用法就是可以回滚某个指定文件
git checkout --<filename> # 将指定文件恢复到上一次提交时的状态
git checkout <commit> <filename> # 将指定文件恢复到指定版本号
如下,利用git checkout
将Hello.py
文件回滚
rm
是Linux系统中的删除命令,其效果等价于Windows中的右键删除,会把工作区的文件删除。因此,如果你想要删除这个操作提交到远程仓库,还需要执行git add
和git commit
如下,这里我们将Hello.py
文件删除
然后添加到暂存区和提交
(这里为了便于后面的展示,我们将版本回退至“第三次提交处(提交信息为:对Hello.py文件的修改)”)
作用:用于删除文件,其常用用法主要有如下三个
git rm
:
git rm
可以简单理解为 rm
+ git add
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
删除此文件
作用:用于将文件或目录移动或重命名,并在Git中记录更改。语法格式如下,其中,source
表示要移动或重命名的文件或目录的当前位置,destination
表示文件或目录应该移动到的新位置或应该被重命名为的新名称
git mv <source> <destination>
例子:
如下,创建一个名为dir1
的文件夹,然后将Hello.py
和README.md
文件移动进去
然后进行提交
然后再将Hello.py
文件重命名为HelloWorld.py
但此时运行git log
你会发现找不到这个HelloWorld.py
文件的提交记录,所以此时可以用git log --follow
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。