git基础知识

简述 git 的安装配置、工作区域划分、文件类型、基本命令。


基础安装与配置

基于 WSL 的 Ubuntu 下的 git

打开或关闭Windows功能->Hyper-V、Virtual Machine Platform、Windows Subsystem for Linux

powershell 复制代码
# 1.必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 
# 2.在管理员模式下打开 PowerShell 或 Windows 命令提示符
wsl --install
shell 复制代码
sudo apt-get install git # 安装 git

配置(设置用户名和邮箱)同下。

Windows系统下 git 配置

下载:Git - Downloads (git-scm.com)。安装完成后,进入你要存放文件的文件夹,右击点击进入 Git Bash Here

shell 复制代码
# 设置用户名
git config --global user.name '自己的用户名'
# 设置用户名邮箱
git config --global user.email '这里填写自己的用户名邮箱'
# 查询配置信息
git config list

拓展:

  1. 项目(仓库)级别仅在当前本地库有效

    shell 复制代码
    git config user.name tom # 设置用户名tom
    git config user.email liu@qq.com # 设置用户邮箱
  2. 系统用户级别仅在当前登录的操作系统用户有效

    shell 复制代码
    git config --global user.name tom
    git config --global user.email liu@qq.com
    仅仅加了一个 --global
    优先级别:项目级别 > 系统级别
    信息保存位置:~/.gitconfig 文件

工作区域

工作区

工作区(Working Directory),进行添加、编辑、修改文件等动作。就是你在电脑里能看到的目录,平时存放项目代码的地方

暂存区

暂存区(Index / Stage)存储已经修改的文件,事实上它只是一个文件,最后统一提交到git仓库中

git add 命令就是将文件转到暂存区。

仓库区/版本库

工作区有一个隐藏目录 .git,这个是 Git 的仓库区/版本库(Repository/Git Directory)。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向master的一个指针叫 HEAD 。

把文件往Git版本库里添加的时候,是分两步执行的:

  1. git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
  2. git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。

Git 中的文件类型

工作目录下每一个文件的状态仅有:已跟踪未跟踪 。已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改(Unmodified)已修改(modified)已放入暂存区(staged)

未跟踪文件(Untracked):工作目录中除已跟踪文件外的其它所有文件。它们既不存在于上次快照的记录中,也没有被放入暂存区。

未修改文件(Unmodified):工作目录的文件(已跟踪文件)中处于未修改状态的文件。

已修改文件(modified):提交后、且被修改的文件。

已跟踪文件(staged):初次克隆某个仓库的时候,工作目录中的所有文件。


Git 命令

git init:初始化 repository

shell 复制代码
git init
Initialized empty Git repository in C:/Users/Administrator/Desktop/git_test/.git/

随即在指定目录下创建一个空的 Git repository。生成的 .git 目录是一个隐藏文件,可以直接在 资源管理器 中查看,或者在 cmd 中输入命令 dir /a 。此目录是Git来跟踪管理版本库的,不能手动修改此目录里的文件。

git init 后就运行 git add <files> 命令,开始跟踪当前目录下的文件。

git log:显示提交日志

shell 复制代码
root@Lenovo:/home/git_test# git log
commit e49ffb91d8776b952000f5a15791439ea11a51fe (HEAD -> master)
Author: phil <xxxxxxxxxx@xx.com>
Date:   Tue Jan 16 19:32:31 2024 +0800
    add distributed under the GPL

commit 670e23aeddd81f8fc3151d7866ad368b959376a4
Author: phil <xxxxxxxxxx@xx.com>
Date:   Tue Jan 16 17:03:37 2024 +0800
    add distributed

commit 5f2427d23f7bc17ab29a16c37c5bb380aa033d76
Author: phil <xxxxxxxxxx@xx.com>
Date:   Tue Jan 16 16:36:16 2024 +0800
    write a readme file

显示从最近到最远的提交日志,有 commit idAuthorData 以及文件修改详细信息。和 SVN 不一样,Git 的 commit id 不是1,2,3......递增的数字,而是一个 SHA1 计算出来的十六进制数字。

参数--prettygit log --pretty=oneline,单行显示提交日志

shell 复制代码
root@Lenovo:/home/git_test# git log --pretty=oneline
e49ffb91d8776b952000f5a15791439ea11a51fe (HEAD -> master) add distributed under the GPL
670e23aeddd81f8fc3151d7866ad368b959376a4 add distributed
5f2427d23f7bc17ab29a16c37c5bb380aa033d76 write a readme file

git reset:回退版本

参数--hardgit reset --hard HEAD

在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,后面 HEAD~[3] 来表示,或将 HEAD 换成 commit-id 来表示版本。

回退版本操作也会记录在日志中,并有相应的 commit id

shell 复制代码
@Lenovo:/home/git_test# git reflog
5f2427d (HEAD -> master) HEAD@{0}: reset: moving to 5f2427d23f7bc17ab29a16c37c5bb380aa033d76
670e23a HEAD@{1}: reset: moving to HEAD^
e49ffb9 HEAD@{2}: commit: add distributed under the GPL
670e23a HEAD@{3}: commit: add distributed
5f2427d (HEAD -> master) HEAD@{4}: commit (initial): write a readme file
root@Lenovo:/home/git_test# git reset --hard "e49ffb9"
HEAD is now at e49ffb9 add distributed under the GPL

git reflog:显示所有操作日志

reflogReference logs(参考日志),git reflog命令可以显示所有的历史版本记录。

这不同于git log 只可以查看到 HEAD 指针及其之前的版本信息,如果版本发生过回退操作,则无法显示 HEAD 指针之后的版本情况。

shell 复制代码
root@Lenovo:/home/git_test# git reflog
e49ffb9 (HEAD -> master) HEAD@{0}: commit: add distributed under the GPL
670e23a HEAD@{1}: commit: add distributed
5f2427d HEAD@{2}: commit (initial): write a readme file

输出结果:
commit id 的前7位:根据这7位可以将版本库恢复到对应节点状态

HEAD@{n}:表示 HEAD 指针前移两次的版本,也就是上上个版本

最后一段字符串为提交的说明信息。

git status:查看状态

shell 复制代码
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

nothing to commit, working directory clean 表示所有已跟踪文件在上次提交后都未被更改过,或者说当前目录下没有出现任何处于未跟踪状态的新文件。

Untracked files(未跟踪的文件)表明之前的快照(提交/ commit )中没有这些文件。

Changes not staged for commit 表明已跟踪文件的内容发生了变化,但还没有放到暂存区。要暂存这次更新,需要运行 git add 命令。

Changes to be committed 下的文件表明是已暂存状态。如果此时提交,那么该文件在你运行 git add 时的版本将被留存在后续的历史记录中。

暂存后再被修改的文件

shell 复制代码
$ git add README
$ vi README # 修改文件
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

当将一个文件添加到暂存区(add),然后修改文件内容,那么文件就会同时出现在暂存区和非暂存区。

实际上,Git 只会暂存运行了 git add 命令的文件。如果执行 commit 命令,提交的版本是运行 git add 命令时的那个版本,而不是在工作目录中的修改后的当前版本。

git add:追踪文件

git add 命令使用文件目录的路径 作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。这是个多功能命令:可以用它开始跟踪新文件 ,或者把已跟踪的文件放到暂存区 ,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为"精确地将内容添加到下一次提交中"而不是"将一个文件添加到项目中"要更加合适。

shell 复制代码
git add fileName 指定文件
# 一次 add 多个文件
git add file1.txt file2.txt file3.txt
# 提交被修改的和新建的文件,但不包括被删除的文件
git add.
# 更新所有改变的文件,即提交所有变化的文件
git add -u --update update tracked files
# 提交已被修改和已被删除文件,但是不包括新的文件
git add -A --all add changes from all tracked and untracked files 

git commit:提交

git commit -m 'commit message(提交描述) fileName'

Git 操作流

创建 repository

  1. 创建文件夹,作为版本库/仓库/repository。在 repository 中的所有文件都可以被 Git 管理,Git 能跟踪每个文件的修改、删除,以便任何时刻都可以追踪历史,或者在将来某个时刻还原。

    Windows 中命令如下:

    cmd 复制代码
    md C:\Users\Administrator\Desktop\Git_test
    cd C:\Users\Administrator\Desktop\Git_test
    dir

    Linux 中命令如下:

    shell 复制代码
    mkdir /home/git_test
  2. 初始化一个 Git 仓库(把上述的目录变成 Git 可以管理的仓库)

    shell 复制代码
    git init
    Initialized empty Git repository in C:/Users/Administrator/Desktop/git_test/.git/

    随即在指定目录下创建一个空的 Git repository。生成的 .git 目录是一个隐藏文件,可以直接在 资源管理器 中查看,或者在 cmd 中输入命令 dir /a 。此目录是Git来跟踪管理版本库的,不能手动修改此目录里的文件。

添加文件到 repository

  1. 创建并编辑文件

    shell 复制代码
    touch 'fileName' # 创建文件
    vi 'fileName' # 输入a、i、o进行插入模式

    按键 esc进入命令模式,输入 :wq 退出文件编辑并保存。

  2. 将文件添加到仓库

    shell 复制代码
    git add 'fileName' # 把文件添加到仓库(可添加多个文件或多次添加)

    命令执行后,没有任何提示。

  3. 提交文件

    shell 复制代码
    git commit -m 'commit message' # 把文件提交到仓库

    -m 后面输入的是本次提交的说明,最好输入有意义的提交/改动信息。

    git commit命令执行成功后显示:几个个文件被改动(file changed);插入了几行内容( insertions(+) )。git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。

Git 添加文件到 repository 需要 addcommit 两步,以便多次 add 不同的文件,最后一次性提交。

修改 repository 中的文件并再次提交

  1. 修改文件

    shell 复制代码
    # 编辑文件
    vi 'fileName' # 输入a、i、o进行插入模式

    按键 esc 进入命令模式,输入 :wq 退出文件编辑并保存。

  2. 查看当前的状态。哪个文件被修改,是否被 commit

    shell 复制代码
    git status
  3. 查看修改内容

    shell 复制代码
    git diff readme.txt # difference(diff)
  4. 将修改后的文件再次提交

    shell 复制代码
    git add readme.txt
    git commit -m "add distributed"
    git status
    cat 'fileName' # 将文件内容打印显示

参考:
Git book 2nd Edition (2014)
faster-git datawhale
安装 WSL | Microsoft Learn
【学了就忘】Git操作 --- 51.git reflog命令 - 简书 (jianshu.com)

相关推荐
Smile丶凉轩1 小时前
微服务即时通讯系统的实现(服务端)----(1)
c++·git·微服务·github
和你一起去月球10 小时前
TypeScript - 函数(下)
javascript·git·typescript
我不是程序猿儿11 小时前
【GIT】TortoiseGit的变基(Rebase)操作
git
yyycqupt18 小时前
git使用(一)
git
Kkooe21 小时前
GitLab|数据迁移
运维·服务器·git
Beekeeper&&P...1 天前
git bash是什么,git是什么,git中的暂存区是什么,git中的本地仓库是什么,git中工作目录指的是什么
开发语言·git·bash
Stara05111 天前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
lsswear1 天前
GIT 操作
git
勋勋勋勋小勋勋1 天前
git分支合并某一次提交
git