Git 基本命令与操作流

记录 Git 中的基本命令和创建仓库、提交文件、删除文件等方面的操作


Git 基本命令

git status:查看状态

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

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

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

Changes to be committed :暂存区文件。创建后 git add (被追踪)还未提交的文件。

特殊的文件状态:同时属于Changes to be committedChanges not staged for commit 两种状态

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

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

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

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 复制代码
$ 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 计算出来的十六进制数字。

commit(提交)比较多,git log 的内容在一页显示不完整,就会显示冒号 :回车 键可以往下滚一行、空格 键往下滚一页,以便继续查看剩余内容直至显示 (END)。英文状态下 按 q 可以退出git log 状态。

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

shell 复制代码
$ 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~[?]]/[commit_id]/HEAD@{?}

在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,后面 HEAD~[3] 来表示(难确定目标版本与HEAD~?的对应关系,不建议使用);根据 git reflog 输出的 commit_id 来确定回退版本;根据 git reflog 输出的 HEAD@{?} 来回退版本。

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

shell 复制代码
$ 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

$ git reset --hard "e49ffb9"
HEAD is now at e49ffb9 add distributed under the GPL

git reset 除了可以回退版本,也可以把被修改的 staged 的文件回退到工作区,详见 Git 操作流撤销修改。

git reflog:显示所有操作日志

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

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

shell 复制代码
$ 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 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 checkout -- file:撤销修改

shell 复制代码
# 撤销对文件的修改
$ git checkout -- file

这里有两种情况:

  1. filename 已经添加到暂存区后,又作了修改,现在撤销修改,会回到在暂存区中的状态
  2. filename 自修改后还没有被放到暂存区,现在撤销修改,会回到上次提交的状态

总之,就是让这个文件回到最近一次 git addgit commit 时的状态。

git rm file:删除文件

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 不同的文件,最后一次性提交。

修改 committed 的文件并再次提交

对已经提交的文件修改,并将修改后的文件再次提交。

  1. 修改文件

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

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

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

    shell 复制代码
    $ git status
    # 查看修改内容
    $ git diff readme.txt # difference(diff)
  3. 将修改后的文件再次提交

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

删除文件

如果文件存在于版本库中(被追踪 /add),删除文件需要在工作区和版本库中都删除,仅删除工作区中的文件不会影响版本库中的文件。

shell 复制代码
$ touch file.txt
$ git add file.txt
$ git commit -m "add file.txt"

在工作区中删除文件

shell 复制代码
$ rm test.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    test.txt
no changes added to commit (use "git add" and/or "git commit -a")

在版本库中删除文件。

shell 复制代码
$ git rm test.txt 
$ git commit -m "remove test.txt" # 提交删除 
# output
[master b3a984f] remove test.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test.txt

若在工作区中误删文件后,可以利用版本库中的文件还原:

shell 复制代码
$ git checkout -- test.txt

撤销修改

  1. 修改状态为 stagedcommitted 的文件,若想丢弃工作区的修改时,用命令 git checkout -- file

  2. 修改状态为 staged 的文件,并添加到了暂存区,想丢弃修改。分两步:第一步用命令 git reset HEAD <file>,然后 git checkout -- file

  3. 修改状态为 committed 的文件,并已提交但没有推送到远程库,想要撤销本次提交。用命令 git reset 回退版本。


参考:

Git book 2nd Edition (2014)

Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)

Git 教程 | 菜鸟教程 (runoob.com)

faster-git datawhale

【学了就忘】Git操作 --- 51.git reflog命令 - 简书 (jianshu.com)

git rebase详解(图解+最简单示例,一次就懂)-CSDN博客

)

Git 教程 | 菜鸟教程 (runoob.com)

faster-git datawhale

【学了就忘】Git操作 --- 51.git reflog命令 - 简书 (jianshu.com)

git rebase详解(图解+最简单示例,一次就懂)-CSDN博客

相关推荐
透明的玻璃杯1 小时前
git应用
git
炸炸鱼.2 小时前
Git+Jenkins实战(一):从零搭建自动化发布与回滚系统(附完整代码)
git·jenkins
言6665 小时前
要忽略前端依赖包node_modules的文件在目录下 git暂存区消失
git
胡小禾6 小时前
Git Worktree
git
程序员小羊!6 小时前
18 GIt
git
怣疯knight6 小时前
Git 本地分支关联远程分支 常用命令汇总
git
ANNENBERG6 小时前
git分支开发管理
git
坤坤藤椒牛肉面6 小时前
GIT的使用
git
w3296362717 小时前
使用 OpenCode 在 Windows 上加速安装 Playwright 的完整指南
windows·git
我家媳妇儿萌哒哒1 天前
git:无法推送refs到远端。您可以试着运行“拉取”功能,整合您的更改。
git