记录 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 committed
和 Changes not staged for commit
两种状态
$ 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 add
,stage
),然后修改文件内容,那么文件就会同时出现在暂存区和非暂存区。
实际上,Git 只会暂存运行了 git add
命令的文件。如果执行 commit
命令,提交的版本是运行 git add
命令时的那个版本,而不是在工作区中修改后的当前版本。
git init
:初始化 repository$ 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
:显示提交日志$ 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 id
、Author
、Data
以及文件修改详细信息。和 SVN
不一样,Git 的 commit id
不是1,2,3……递增的数字,而是一个 SHA1
计算出来的十六进制数字。
当 commit
(提交)比较多,git log
的内容在一页显示不完整,就会显示冒号 :
。回车键可以往下滚一行、空格键往下滚一页,以便继续查看剩余内容直至显示 (END)
。英文状态下 按 q
可以退出git log
状态。
参数--pretty
:git log --pretty=oneline
,单行显示提交日志
$ git log --pretty=oneline
e49ffb91d8776b952000f5a15791439ea11a51fe (HEAD -> master) add distributed under the GPL
670e23aeddd81f8fc3151d7866ad368b959376a4 add distributed
5f2427d23f7bc17ab29a16c37c5bb380aa033d76 write a readme file
git reset
:回退版本参数--hard
:git reset --hard [HEAD~[?]]/[commit_id]/HEAD@{?}
在 Git 中,用 HEAD
表示当前版本,上一个版本就是 HEAD^
,上上一个版本就是 HEAD^^
,后面 HEAD~[3]
来表示(难确定目标版本与HEAD~[?]的对应关系,不建议使用);根据 git reflog
输出的 commit_id
来确定回退版本;根据 git reflog
输出的 HEAD@{?}
来回退版本。
回退版本操作也会记录在日志中,并有相应的 commit id
。
$ 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
:显示所有操作日志reflog
:Reference logs
(参考日志),git reflog
命令可以显示所有的历史版本记录。
这不同于git log
只可以查看到 HEAD 指针及其之前的版本信息,如果版本发生过回退操作,则无法显示 HEAD 指针之后的版本情况。
$ 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
命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
$ 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
:撤销修改# 撤销对文件的修改
$ git checkout -- file
这里有两种情况:
filename
已经添加到暂存区后,又作了修改,现在撤销修改,会回到在暂存区中的状态filename
自修改后还没有被放到暂存区,现在撤销修改,会回到上次提交的状态总之,就是让这个文件回到最近一次 git add
或 git commit
时的状态。
git rm file
:删除文件创建文件夹,作为版本库/仓库/repository。在 repository 中的所有文件都可以被 Git 管理,Git 能跟踪每个文件的修改、删除,以便任何时刻都可以追踪历史,或者在将来某个时刻还原。
Windows 中命令如下:
md C:\Users\Administrator\Desktop\Git_test
cd C:\Users\Administrator\Desktop\Git_test
dir
Linux 中命令如下:
mkdir /home/git_test
初始化一个 Git 仓库(把上述的目录变成 Git 可以管理的仓库)
$ git init
Initialized empty Git repository in C:/Users/Administrator/Desktop/git_test/.git/
随即在指定目录下创建一个空的 Git repository。生成的 .git
目录是一个隐藏文件,可以直接在 资源管理器 中查看,或者在 cmd 中输入命令 dir /a
。此目录是Git来跟踪管理版本库的,不能手动修改此目录里的文件。
创建并编辑文件
$ touch 'fileName' # 创建文件
$ vi 'fileName' # 输入a、i、o进行插入模式
按键 esc
进入命令模式,输入 :wq
退出文件编辑并保存。
将文件添加到仓库
$ git add 'fileName' # 把文件添加到仓库(可添加多个文件或多次添加)
命令执行后,没有任何提示。
提交文件
$ 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
需要 add
和 commit
两步,以便多次 add
不同的文件,最后一次性提交。
对已经提交的文件修改,并将修改后的文件再次提交。
修改文件
# 编辑文件
$ vi 'fileName' # 输入a、i、o进行插入模式
按键 esc
进入命令模式,输入 :wq
退出文件编辑并保存。
查看当前的状态。哪个文件被修改,是否被 commit
$ git status
# 查看修改内容
$ git diff readme.txt # difference(diff)
将修改后的文件再次提交
$ git add readme.txt
$ git commit -m "add distributed"
$ git status
$ cat 'fileName' # 将文件内容打印显示
如果文件存在于版本库中(被追踪 /add),删除文件需要在工作区和版本库中都删除,仅删除工作区中的文件不会影响版本库中的文件。
$ touch file.txt
$ git add file.txt
$ git commit -m "add file.txt"
在工作区中删除文件
$ 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")
在版本库中删除文件。
$ 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
若在工作区中误删文件后,可以利用版本库中的文件还原:
$ git checkout -- test.txt
修改状态为 staged
或 committed
的文件,若想丢弃工作区的修改时,用命令 git checkout -- file
。
修改状态为 staged
的文件,并添加到了暂存区,想丢弃修改。分两步:第一步用命令 git reset HEAD <file>
,然后 git checkout -- file
。
修改状态为 committed
的文件,并已提交但没有推送到远程库,想要撤销本次提交。用命令 git reset
回退版本。
参考:
Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
【学了就忘】Git操作 — 51.git reflog命令 - 简书 (jianshu.com)
git rebase详解(图解+最简单示例,一次就懂)-CSDN博客
)