Skip to content

05 Git 常用命令演示

git config 配置

bash
 git config --local user.name "wwvl"
 git config --local user.email "wwvl@example.com"
 git config --list --local
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=git@e.coding.net:g-bjcj9808/learn/clone-demo1.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
user.name=wwvl
user.email=wwvl@example.com

创建版本库

git clone 远程版本库

bash
 git clone git@e.coding.net:g-bjcj9808/learn/clone-demo1.git
Cloning into 'clone-demo1'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (4/4), done.

git init 创建本地版本库

bash
 mkdir init-demo1
 cd init-demo1
 git init
Initialized empty Git repository in /Users/wwvl/Desktop/learn/init-demo1/.git/

修改和提交

bash
cd init-demo1
echo "# init-demo1" >> README.md

git status 查看状态

命令列出当前目录下所有未跟踪(untracked)、已修改(modified)、已暂存(staged)的文件。

bash
 git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        README.md

nothing added to commit but untracked files present (use "git add" to track)
 git status -sb # 结合了 --short 和 --branch 选项,它以简洁的格式显示当前Git仓库的状态,并且包括分支和跟踪信息
?? README.md

输出的示例及其含义

bash
 M README.md
MM Rakefile
A  new-file.txt
M  modified-file.txt
?? untracked-file.txt

解释每一列的意义:

  • (空格):表示文件已经暂存(staged),等待提交。
  • M:表示文件在工作目录中被修改了,但还没有暂存。
  • A:表示新添加到暂存区的文件。
  • D:表示文件在暂存区中被删除了。
  • R:表示文件名被修改了(重命名)。
  • C:表示文件复制了一份,并且复制后的文件已经被暂存。
  • ?? 表示文件既不在暂存区也不在版本控制中,即它是未跟踪的。

第一个状态字符表示暂存区的状态,第二个状态字符表示工作区的状态。例如:

  • MM:文件在工作区和暂存区都被修改了。
  • AM:文件是新添加的,并且在添加后又被修改了。

git add 暂存文件

bash
 git add README.md
 git status -sb
## No commits yet on main
A  README.md

git commit 提交文件

bash
 git commit -m "first commit"
[main (root-commit) 6c03018] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

git diff 查看修改

bash
 git diff
 git diff --cached # 查看暂存区与最后一次提交的差异
 git diff HEAD # 查看工作区与最后一次提交的差异

git mv 移动文件

bash
 git mv README.md index.md
 git status -sb
## main
R  README.md -> index.md
 git commit -m "rename README.md to index.md"
[main c1306a1] rename README.md to index.md
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename README.md => index.md (100%)

git commit --amend 修改最近一次提交的提交信息

bash
 git commit --amend -m "amended commit: rename README.md to index.md"
[main 742dda3] amended commit: rename README.md to index.md
 Date: Sat Jul 13 03:58:49 2024 +0800
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename README.md => index.md (100%)

git rm 删除文件

  • git rm:删除文件,并从暂存区和工作区中删除。
bash
 git rm index.md
rm 'index.md'

 git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    index.md

git rm --cache 删除暂存区文件

  • git rm --cached:删除暂存区的文件,但保留工作区的文件。停止跟踪文件,但不删除本地文件
bash
 git rm --cached index.md
rm 'index.md'

 git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    index.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        index.md

git restore 恢复文件

  • git restore:恢复文件到指定状态,可以恢复到暂存区、工作区或最近一次提交的状态。
bash
 git restore --staged index.md

 git status
On branch main
nothing to commit, working tree clean

查看提交历史

git log 查看提交历史

bash
 git log
commit 742dda3a35fcead4e54b13d078c58e4ea2b69d27 (HEAD -> main)
Author: wwvl <wwvl@example.com>
Date:   Sat Jul 13 03:58:49 2024 +0800

    amended commit: rename README.md to index.md

commit 6c030183e053ba9c548fcb284a4a5d26b276c383
Author: wwvl <wwvl@example.com>
Date:   Sat Jul 13 03:52:38 2024 +0800

    first commit

 git log --graph --topo-order --date=short --abbrev-commit --decorate --all --boundary --pretty=format:'%Cblue%ad %C(auto)%h%Creset -%C(auto)%d%Creset %s %Cblue[%aN]%Creset %Cblue%G?%Creset'
* 2024-07-13 742dda3 - (HEAD -> main) amended commit: rename README.md to index.md [wwvl] N
* 2024-07-13 6c03018 - first commit [wwvl] N

git log --pretty=format 常用选项

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

git log 常用选项

选项说明
-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 合用的简写。

限制 git log 输出的选项

选项说明
-<n>仅显示最近的 n 条提交。
--since, --after仅显示指定时间之后的提交。
--until, --before仅显示指定时间之前的提交。
--author仅显示作者匹配指定字符串的提交。
--committer仅显示提交者匹配指定字符串的提交。
--grep仅显示提交说明中包含指定字符串的提交。
-S仅显示添加或删除内容匹配指定字符串的提交。

git shortlog 查看每个提交者的提交日志

  • git shortlog 是一个简单的 git log 包装器,它会将提交者按提交次数排序,并显示提交者姓名和提交次数。
bash
 git shortlog
wwvl (2):
      first commit
      amended commit: rename README.md to index.md

git reflog 查看 ref 的修改历史

  • git reflog 记录了 HEAD 和分支引用所指向的历史。
bash
 git reflog
742dda3 (HEAD -> main) HEAD@{0}: reset: moving to HEAD
742dda3 (HEAD -> main) HEAD@{1}: commit (amend): amended commit: rename README.md to index.md
20d9ca9 HEAD@{2}: commit (amend): rename README.md to index.md
c1306a1 HEAD@{3}: commit: rename README.md to index.md
6c03018 HEAD@{4}: commit (initial): first commit

git log -p 查看指定文件的提交历史

  • git log -p <file> 查看指定文件的提交历史。
bash
 git log -p index.md
commit 742dda3a35fcead4e54b13d078c58e4ea2b69d27 (HEAD -> main)
Author: wwvl <wwvl@example.com>
Date:   Sat Jul 13 03:58:49 2024 +0800

    amended commit: rename README.md to index.md

diff --git a/index.md b/index.md
new file mode 100644
index 0000000..ebe4066
--- /dev/null
+++ b/index.md
@@ -0,0 +1 @@
+# init-demo1
查看代码
bash
 echo "这是追加的文本" >> index.md
 git add index.md
 git commit -m "追加文本到 index.md"
[main 4aa67e0] 追加文本到 index.md
 1 file changed, 1 insertion(+)
bash
 git log -p index.md
commit 4aa67e012690e2fbf1bfdcb0bd16d290fbaf63dc (HEAD -> main)
Author: wwvl <wwvl@example.com>
Date:   Sat Jul 13 04:25:44 2024 +0800

   追加文本到 index.md

diff --git a/index.md b/index.md
index ebe4066..d01c401 100644
--- a/index.md
+++ b/index.md
@@ -1 +1,2 @@
# init-demo1
+这是追加的文本

commit 742dda3a35fcead4e54b13d078c58e4ea2b69d27
Author: wwvl <wwvl@example.com>
Date:   Sat Jul 13 03:58:49 2024 +0800

   amended commit: rename README.md to index.md

diff --git a/index.md b/index.md
new file mode 100644
index 0000000..ebe4066
--- /dev/null
+++ b/index.md
@@ -0,0 +1 @@
+# init-demo1

git blame 查看指定文件的每一行最后修改的提交

  • git blame <file> 查看指定文件的每一行最后修改的提交。
查看代码
bash
 Set-Content -Path "index.md" -Value @"
∙ # init-demo1

∙ 沁园春雪
∙ 毛泽东
∙ 北国风光,千里冰封,万里雪飘。
∙ 望长城内外,惟余莽莽;大河上下,顿失滔滔。
∙ 山舞银蛇,原驰蜡象,欲与天公试比高。
∙ 须晴日,看红装素裹,分外妖娆。
∙ 江山如此多娇,引无数英雄竞折腰。
∙ 惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
∙ 一代天骄,成吉思汗,只识弯弓射大雕。
∙ 俱往矣,数风流人物,还看今朝。
∙ "@

 git add index.md
 git commit -m "添加 《沁园春雪》"
[main 42f686e] 添加 《沁园春雪》
 1 file changed, 11 insertions(+), 1 deletion(-)
bash
 git blame index.md
^6c03018 README.md (wwvl 2024-07-13 03:52:38 +0800  1) # init-demo1
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800  2)
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800  3) 沁园春雪
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800  4) 毛泽东
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800  5) 北国风光,千里冰封,万里雪飘。
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800  6) 望长城内外,惟余莽莽;大河上下,顿失滔滔。
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800  7) 山舞银蛇,原驰蜡象,欲与天公试比高。
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800  8) 须晴日,看红装素裹,分外妖娆。
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800  9) 江山如此多娇,引无数英雄竞折腰。
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800 10) 惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800 11) 一代天骄,成吉思汗,只识弯弓射大雕。
42f686e6 index.md  (wwvl 2024-07-13 04:38:02 +0800 12) 俱往矣,数风流人物,还看今朝。

git show 查看指定提交的修改内容

bash
 git show 42f686e
commit 42f686e6c3c56fbd5b4338cdf22804ae3dde8b0e (HEAD -> main)
Author: wwvl <wwvl@example.com>
Date:   Sat Jul 13 04:38:02 2024 +0800

    添加 《沁园春雪》

diff --git a/index.md b/index.md
index d01c401..606ff5f 100644
--- a/index.md
+++ b/index.md
@@ -1,2 +1,12 @@
 # init-demo1
-这是追加的文本
+
+沁园春雪
+毛泽东
+北国风光,千里冰封,万里雪飘。
+望长城内外,惟余莽莽;大河上下,顿失滔滔。
+山舞银蛇,原驰蜡象,欲与天公试比高。
+须晴日,看红装素裹,分外妖娆。
+江山如此多娇,引无数英雄竞折腰。
+惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
+一代天骄,成吉思汗,只识弯弓射大雕。
+俱往矣,数风流人物,还看今朝。
  • git show <commit> <file> 查看指定文件的指定提交的修改内容。
查看代码
bash
 Set-Content -Path "index.md" -Value @"
# init-demo1

"@
bash
 Set-Content -Path "沁园春 雪.md" -Value @"
沁园春·雪

毛泽东

独立寒秋,湘江北去,橘子洲头。
看万山红遍,层林尽染;漫江碧透,百舸争流。
鹰击长空,鱼翔浅底,万类霜天竞自由。
怅寥廓,问苍茫大地,谁主沉浮?
携来百侣曾游,忆往昔峥嵘岁月稠。
恰同学少年,风华正茂;书生意气,挥斥方遒。
指点江山,激扬文字,粪土当年万户侯。
曾记否,到中流击水,浪遏飞舟?
"@
bash
 git add index.md "沁园春 雪.md"
 git commit -m "修改 index.md 和 沁园春 雪.md"
[main 25313ec] 修改 index.md 和 沁园春 雪.md
 2 files changed, 12 insertions(+), 10 deletions(-)
 create mode 100644 沁园春 雪.md

 git log --oneline
25313ec (HEAD -> main) 修改 index.md 和 沁园春 雪.md
42f686e 添加 《沁园春雪》
4aa67e0 追加文本到 index.md
742dda3 amended commit: rename README.md to index.md
6c03018 first commit

bash
 git show 25313ec
commit 25313ec752665a4aa2f2db946fb7df4591d46621 (HEAD -> main)
Author: wwvl <wwvl@example.com>
Date:   Sat Jul 13 04:51:31 2024 +0800

    修改 index.md 沁园春 雪.md

diff --git a/index.md b/index.md
index 606ff5f..1106af1 100644
--- a/index.md
+++ b/index.md
@@ -1,12 +1,2 @@
 # init-demo1

-沁园春雪
-毛泽东
-北国风光,千里冰封,万里雪飘。
-望长城内外,惟余莽莽;大河上下,顿失滔滔。
-山舞银蛇,原驰蜡象,欲与天公试比高。
-须晴日,看红装素裹,分外妖娆。
-江山如此多娇,引无数英雄竞折腰。
-惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
-一代天骄,成吉思汗,只识弯弓射大雕。
-俱往矣,数风流人物,还看今朝。
diff --git a/沁园春 雪.md b/沁园春 雪.md
new file mode 100644
index 0000000..205d43b
--- /dev/null
+++ b/沁园春 雪.md
@@ -0,0 +1,12 @@
+沁园春雪
+
+毛泽东
+
+独立寒秋,湘江北去,橘子洲头。
+看万山红遍,层林尽染;漫江碧透,百舸争流。
+鹰击长空,鱼翔浅底,万类霜天竞自由。
+怅寥廓,问苍茫大地,谁主沉浮?
+携来百侣曾游,忆往昔峥嵘岁月稠。
+恰同学少年,风华正茂;书生意气,挥斥方遒。
+指点江山,激扬文字,粪土当年万户侯。
+曾记否,到中流击水,浪遏飞舟?
bash
 git show 25313ec index.md
commit 25313ec752665a4aa2f2db946fb7df4591d46621 (HEAD -> main)
Author: wwvl <wwvl@example.com>
Date:   Sat Jul 13 04:51:31 2024 +0800

    修改 index.md 沁园春 雪.md

diff --git a/index.md b/index.md
index 606ff5f..1106af1 100644
--- a/index.md
+++ b/index.md
@@ -1,12 +1,2 @@
 # init-demo1

-沁园春雪
-毛泽东
-北国风光,千里冰封,万里雪飘。
-望长城内外,惟余莽莽;大河上下,顿失滔滔。
-山舞银蛇,原驰蜡象,欲与天公试比高。
-须晴日,看红装素裹,分外妖娆。
-江山如此多娇,引无数英雄竞折腰。
-惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
-一代天骄,成吉思汗,只识弯弓射大雕。
-俱往矣,数风流人物,还看今朝。

撤销

git reset 撤销指定提交后的修改

命令选项工作区(Working Directory)暂存区(Staging Area)提交历史(Commit History)
--hard重置到指定提交重置到指定提交重置到指定提交
--mixed不变重置到指定提交重置到指定提交
--soft不变不变重置到指定提交
  1. git reset --mixed
    • 这是git reset命令的默认行为,当你执行git reset <commit>时,实际上就是执行了git reset --mixed <commit>
    • 它会重置暂存区(index)到指定的提交状态,但不会改变工作目录(也就是你的文件不会被修改)。
  2. git reset --hard
    • git reset --hard <commit>会将暂存区和工作目录都重置到指定的提交状态。
    • 这意味着所有从该提交之后做的更改都将被丢弃,是一种非常危险的操作,因为它无法恢复。
  3. git reset --soft
    • git reset --soft <commit>会保留工作目录和暂存区的内容,仅仅将头指针移动到指定的提交。
    • 这通常用于将已经提交的更改重新放回暂存区,以便重新安排提交历史。

TIP

在使用 git reset --hard 命令之前,采取以下步骤可以确保操作的安全性:

  1. 备份当前工作
    • 使用 git stash 命令可以将当前未提交的更改保存起来,这样在重置之后可以重新应用这些更改。
    • 或者,你可以创建一个新分支来保存当前的工作状态,使用 git checkout -b backup-branch
  2. 确认未跟踪文件
    • 使用 git clean -ndx 查看将会被删除的未跟踪文件。
    • 如果发现有重要的未跟踪文件,应该先将其移动到安全的地方。
  3. 检查提交历史
    • 使用 git log 查看即将被丢弃的提交,确认这些提交可以被安全丢弃。
  4. 确保备份
    • 确认你有一个完整的仓库备份,可以使用 git clone --mirror 来克隆一个裸仓库作为备份。
  5. 确认操作
    • 在执行 git reset --hard 之前,再次确认这是你想要的操作,因为一旦执行,更改将无法通过 Git 恢复。

git checkout 切换到指定分支/提交

  • git checkout <branch>:切换到指定的分支。
  • git checkout <commit>:切换到指定的提交。
  • git checkout -b <new-branch>:创建并切换到一个新的分支。
  • git checkout -- <file>:放弃对指定文件的修改,回到最后一次git commitgit add的状态。