joeの小窝

Loading...

git基本操作

一、git全局配置

一般在新的系统上,我都需要配置自己的git工作环境,配置工作只需进行一次,以后升级时还会沿用现在的配置,如果需要,以后可以用相同的命令修改已有的配置

# 配置全局用户名
[root@docker workspace]# git config --global user.name "qq"
# 配置全局用户邮箱
[root@docker workspace]# git config --global user.email "qq@email.com"

# 查看git配置
[root@docker workspace]# git config --list
user.email=qq@email.com
user.name=qq

[root@docker workspace]# git config user.name 
qq
[root@docker workspace]# git config user.email 
qq@email.com

二、创建一个版本库

# 创建一个目录
[root@docker workspace]# mkdir appA
[root@docker workspace]# ls
appA
[root@docker workspace]# cd appA/

# 在目录里面初始化操作
[root@docker appA]# git init
Initialized empty Git repository in /root/workspace/appA/.git/

# 会出现.git目录,所有git需要的数据和资源都存放在这个目录中
[root@docker appA]# ls -a
.  ..  .git

三、git常用操作

  • 在工作目录所有文件都是2种状态,已跟踪或未跟踪

    • 已跟踪的文件,在git仓库里面,状态可能是修改,暂存,未更新

    • 未跟踪的文件,就是在工作目录下面新创建的文件,不在这个git仓库里面

  • 对某些文件进行编辑后,git将这些文件标记为已修改,将此添加到暂存区,一次一次的添加,如此重复,提交到仓库里面

img

1、版本提交和版本回退

1、版本提交

创建一个文件

[root@docker appA]# echo 123 > code.txt

提交一个版本

[root@docker appA]# git add code.txt 
[root@docker appA]# git commit -m "first c" 
[master (root-commit) ae68b82] first c
 1 file changed, 1 insertion(+)
 create mode 100644 code.txt

查看版本记录

[root@docker appA]# git log
commit ae68b82720be107af80f3cdbdc71b9dd69b7cc51 (HEAD -> master)
Author: qq <qq@email.com>
Date:   Thu Apr 9 15:17:10 2026 +0800

    first c

2、版本回退

再次提交一个版本

# 添加一个新的内容
[root@docker appA]# cat code.txt 
123
2commit


# 再次提交
[root@docker appA]# git add .
[root@docker appA]# git commit -m "second commit" 

# 查看历史信息
[root@docker appA]# git log
commit 6deb1a0c96806c45c52dea40e7cd81bf733373cd (HEAD -> master)
Author: qq <qq@email.com>
Date:   Thu Apr 9 15:20:48 2026 +0800

    second commit   # 第二次提交

commit ae68b82720be107af80f3cdbdc71b9dd69b7cc51
Author: qq <qq@email.com>
Date:   Thu Apr 9 15:17:10 2026 +0800

    first c   # 第一次提交

现在想要回退到上一个版本

[root@docker appA]# git reset --hard  HEAD^
HEAD is now at ae68b82 first c

# 查看历史信息,发现只有第一次提交的信息,回退成功了
[root@docker appA]# git log
commit ae68b82720be107af80f3cdbdc71b9dd69b7cc51 (HEAD -> master)
Author: qq <qq@email.com>
Date:   Thu Apr 9 15:17:10 2026 +0800

    first c

# 查看第一次提交时的文件
[root@docker appA]# cat code.txt 
123

HEAD 表示当前最新的版本,HEAD表示当前版本的上一个版本,^表示当前版本的上上个版本,也可以使用HEAD1表示当前版本的前一个版本,HEAD100表示当前版本的前100个版本

假如这个时候,需要回到第二次提交的版本

# 能看到所有操作历史,包括reset丢失的版本
root@docker appA]# git reflog
ae68b82 (HEAD -> master) HEAD@{0}: reset: moving to HEAD
ae68b82 (HEAD -> master) HEAD@{1}: reset: moving to HEAD
ae68b82 (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
6deb1a0 HEAD@{3}: commit: second commit
ae68b82 (HEAD -> master) HEAD@{4}: commit (initial): first c

# 回到第二个版本,--hard强制回退
[root@docker appA]# git reset --hard 6deb1a0
HEAD is now at 6deb1a0 second commit

# 查看版本信息,有第二次提交的信息了,回到了最新的版本了
[root@docker appA]# git log
commit 6deb1a0c96806c45c52dea40e7cd81bf733373cd (HEAD -> master)
Author: qq <qq@email.com>
Date:   Thu Apr 9 15:20:48 2026 +0800

    second commit

commit ae68b82720be107af80f3cdbdc71b9dd69b7cc51
Author: qq <qq@email.com>
Date:   Thu Apr 9 15:17:10 2026 +0800

    first c

# 查看内容
[root@docker appA]# cat code.txt 
123
2commit

2、工作区,暂存区和版本库

1、工作区和暂存区

  • 工作区,就是一个目录,可见的文件

  • 暂存区就是将目录下的文件,git add 添加到暂存区里面了

2、版本库

  • 隐藏目录.git 是git的版本库,里面存放了很多的东西

  • 因为我们创建git版本库时,git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改

  • 可以简单理解为,需要提交的文件修改全部放到暂存区,然后,一次性提交暂存区的所有修改

img

  • 将文件往git仓库里面添加的时候,分2步执行的

    • 第一步git add 添加到暂存区

    • 第二步git commit 将暂存区的所有内容,提交到当前分支

再次创建一个文件

[root@docker appA]# echo 111 > code2.txt

使用git status查看当前版本文件的状态,几乎每次都需要使用查看

查看当前工作区和暂存区的文件状态

[root@docker appA]# git status 
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	code2.txt

nothing added to commit but untracked files present (use "git add" to track)

上面表示code2.txt没有被跟踪,没有被git控制

将code2.txt加入到暂存区

[root@docker appA]# git add  code2.txt 

# 添加到暂存区了,新文件
[root@docker appA]# git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   code2.txt

然后,执行git commit就可以将暂存区文件提交到分支,创建一个版本

[root@docker appA]# git commit -m "code2" 
[master d48cf26] code2
 1 file changed, 1 insertion(+)
 create mode 100644 code2.txt

提交后,再次查看工作区,就是干净的

[root@docker appA]# git status 
On branch master
nothing to commit, working tree clean

img

3、管理文件修改(非常重要的)

1、撤销工作区

  • 工作区修改文件,怎么撤销了
# 工作区修改了文件
[root@docker appA]# echo 222 >>qq.ttx 

# git检测到文件被修改了,还没有添加到暂存区
[root@docker appA]# git status 
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   qq.ttx


# 直接撤销操作
[root@docker appA]# git restore qq.ttx
# 查看 git信息
[root@docker appA]# git status 
On branch master
nothing to commit, working tree clean

# 发现撤销了
[root@docker appA]# cat qq.ttx 
11

2、撤销暂存区

  • 修改了文件,提交到暂存区怎么撤销
# 修改内容
[root@docker appA]# echo 22 >> qq.ttx 
# 添加到暂存区
[root@docker appA]# git add  qq.ttx 

# 查看git状态
[root@docker appA]# git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   qq.ttx


# 从暂存区撤销
[root@docker appA]# git reset HEAD qq.ttx
Unstaged changes after reset:
M	qq.ttx

# 再次查看git状态,发现没有被添加到暂存区,成功从暂存区撤销了
[root@docker appA]# git status 
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   qq.ttx

no changes added to commit (use "git add" and/or "git commit -a")

# 执行撤销工作区的修改即可
[root@docker appA]# git restore qq.ttx
[root@docker appA]# git status 
On branch master
nothing to commit, working tree clean

# 撤销成功了
[root@docker appA]# cat qq.ttx 
11


3、小结

  1. 当改乱了工作区的某个文件内容,想用直接丢弃工作区的修改时,用git restore file

  2. 当你修改了工作区的某个文件时,还添加到了暂存区里面,撤销的话,分2步,第一步用git reset HEAD file, 第二步用 git restore file

  3. 这个命令通用的 git reset --head HEAD (清空暂存区,丢弃工作区的所有修改,直接回到最新的commit)

  4. 已经提交了不合适的修改到版本库时,想要撤销本次的提交,可以直接回退到版本库 git reset --hard HEAD^

  5. 如果觉得代码有用的话,直接git add , git commit提交即可

  6. 撤销这个动作,非常有用,如果删除了文件,也是可以撤销的

git reset --hard 强制回滚,会将仓库,暂存区,本地文件全部恢复成目标版本,你现在在这些区域的所有修改都会被直接删除

新增的文件不会,因为没有被git add 控制

没有hard的话,仓库历史回退到指定的版本,你的修改的代码文件,没有变,但是状态可能变了,已修改,未提交的状态

4、文件差异的对比

git diff  # 查看当前工作目录与暂存区文件的差异,知道哪些内容改了,还没有add

git diff --staged # 查看暂存区和本地仓库的差异,知道提交的什么代码

git diff HEAD # 查看工作区和最新一次提交,不管有没有add,现在的文件vs上一次提交的版本

git diff 版本id1 版本id2 # 比较2个版本之间的差异

1、查看当前工作区与HEAD版本修改差异

[root@docker appA]# echo "new line" >> code.txt 

# 差异对比
# HEAD在前,修改的文件在后,决定了后面输出的信息的顺序
[root@docker appA]# git diff HEAD code.txt
diff --git a/code.txt b/code.txt
index 5e08e36..6d3a9ae 100644
--- a/code.txt  # --- 表示HEAD
+++ b/code.txt  # +++ 表示当前工作区的文件
@@ -3,3 +3,4 @@
 33
 44
 diyici-m
+new line   # 代表当前工作区比HEAD多一行

2、对比2个版本之间的差异

# 查看历史提交
[root@docker appA]# git reflog 
97d79e2 (HEAD -> master) HEAD@{0}: commit: new file
7de8564 HEAD@{1}: reset: moving to 7de8564
ae68b82 HEAD@{2}: reset: moving to ae68b82

# 对比2个版本
[root@docker appA]# git diff 7de8564 97d79e2
diff --git a/code.txt b/code.txt
index 5e08e36..6d3a9ae 100644
--- a/code.txt
+++ b/code.txt  # 表示最新版本
@@ -3,3 +3,4 @@
 33
 44
 diyici-m
+new line  # 最新版本多了一行内容

5、删除文件

1、删除硬盘和让git知道

就是将硬盘的上文件删除,同时删除操作记录到git里面

git commit提交删除

[root@master appA]# ls
11.txt
# 做了2件事,删除了磁盘文件和提交到了暂存区里面了
[root@master appA]# git rm 11.txt 
rm '11.txt'
[root@master appA]# git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    11.txt

[root@master appA]# ls
[root@master appA]# 

# 提交到仓库里面就能提交删除
[root@master appA]# git commit -m "delete 11.txt"
[master 12f6fac] delete 11.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 11.txt
[root@master appA]# git status 
On branch master
nothing to commit, working tree clean


2、删除git仓库里的文件同时保留本地文件

  • 就是想让git不管理文件,但是本地还有这文件

  • 不想提交,但是保留文件

[root@master appA]# git rm --cached 11.txt 
rm '11.txt'

# git里面 11.txt被删除了,但是本地还在
[root@master appA]# git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    11.txt

Untracked files:  # 没有被git管理的文件 11.txt
  (use "git add <file>..." to include in what will be committed)
	11.txt

# 提交即可
[root@master appA]# git commit -m "dele11.txt"
[master 457037f] dele11.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 11.txt
[root@master appA]# git status 
On branch master
Untracked files:  # 11.txt没有被git管理
  (use "git add <file>..." to include in what will be committed)
	11.txt

nothing added to commit but untracked files present (use "git add" to track)

# 本地也有这个文件
[root@master appA]# ls
11.txt

6、移动文件

  • git mv
[root@master appA]# git mv 11.txt 123.txt
[root@master appA]# git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	renamed:    11.txt -> 123.txt


[root@master appA]# git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	renamed:    11.txt -> 123.txt

[root@master appA]# git commit -m "rename11.txt"
[master 50594db] rename11.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename 11.txt => 123.txt (100%)
[root@master appA]# git status 
On branch master
nothing to commit, working tree clean

git mv 相当于运行了三条命令

mv 11.txt 123.txt
git rm 11.txt
git add 123.txt

# git 会识别文件内容,发现内容一样,就表明是改了名

7、查看提交历史

查看提交的历史
git log

git log --online 只展示每个版本的一行

git log -p -2 查看最近2次提交的差异,对比一下

四、关于回退

git reset --hard 强制回滚,会将仓库,暂存区,本地文件全部恢复成目标版本,你现在在这些区域的所有修改都会被直接删除

新增的文件不会,因为没有被git add 控制

没有hard的话,仓库历史回退到指定的版本,你的修改的代码文件,没有变,但是状态可能变了,已修改,未提交的状态

posted @ 2026-04-09 15:19  乔的港口  阅读(8)  评论(0)    收藏  举报