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.mdgit 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.mdgit commit 提交文件
bash
❯ git commit -m "first commit"
[main (root-commit) 6c03018] first commit
1 file changed, 1 insertion(+)
create mode 100644 README.mdgit 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.mdgit 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.mdgit 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] Ngit 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.mdgit 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 commitgit 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-demo1git 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 commitbash
❯ 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 | 不变 | 不变 | 重置到指定提交 |
- git reset --mixed:
- 这是
git reset命令的默认行为,当你执行git reset <commit>时,实际上就是执行了git reset --mixed <commit>。 - 它会重置暂存区(index)到指定的提交状态,但不会改变工作目录(也就是你的文件不会被修改)。
- 这是
- git reset --hard:
git reset --hard <commit>会将暂存区和工作目录都重置到指定的提交状态。- 这意味着所有从该提交之后做的更改都将被丢弃,是一种非常危险的操作,因为它无法恢复。
- git reset --soft:
git reset --soft <commit>会保留工作目录和暂存区的内容,仅仅将头指针移动到指定的提交。- 这通常用于将已经提交的更改重新放回暂存区,以便重新安排提交历史。
TIP
在使用 git reset --hard 命令之前,采取以下步骤可以确保操作的安全性:
- 备份当前工作:
- 使用
git stash命令可以将当前未提交的更改保存起来,这样在重置之后可以重新应用这些更改。 - 或者,你可以创建一个新分支来保存当前的工作状态,使用
git checkout -b backup-branch。
- 使用
- 确认未跟踪文件:
- 使用
git clean -ndx查看将会被删除的未跟踪文件。 - 如果发现有重要的未跟踪文件,应该先将其移动到安全的地方。
- 使用
- 检查提交历史:
- 使用
git log查看即将被丢弃的提交,确认这些提交可以被安全丢弃。
- 使用
- 确保备份:
- 确认你有一个完整的仓库备份,可以使用
git clone --mirror来克隆一个裸仓库作为备份。
- 确认你有一个完整的仓库备份,可以使用
- 确认操作:
- 在执行
git reset --hard之前,再次确认这是你想要的操作,因为一旦执行,更改将无法通过 Git 恢复。
- 在执行
git checkout 切换到指定分支/提交
git checkout <branch>:切换到指定的分支。git checkout <commit>:切换到指定的提交。git checkout -b <new-branch>:创建并切换到一个新的分支。git checkout -- <file>:放弃对指定文件的修改,回到最后一次git commit或git add的状态。