Git是目前世界上最先进的分布式版本控制系统,最初的版本由Linux的创造者Linus用c语言完成的,并迅速成为最流行的分布式版本控制系统,此处不对Git的功能做过多的简介,详情可以参考Git官网,下面会对Git的使用进行全方位的阐述,干货满满。
Git配置
git config --global user.name "Your Name"
配置全局的用户名
git config --global user.email "email@example.com"
配置全局的邮箱地址
git config --list
查看git配置列表
初始化版本库
git init
初始化git版本库
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit
$ git init
Initialized empty Git repository in D:/learngit/.git/
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ ls -ah
./ ../ .git/
注意:.git
目录为隐藏目录,使用ls -ah
可查看
工作区和暂存区
以readme.txt
文件为例,文件所在的目录就是工作区,当我们执行git add
命令时,实际上是把工作区的修改添加到暂存区,然后执行 git commit
命令时,实际上是把暂存区的所有修改都添加到对应的分支上,并生成新的版本,暂存区的存在能够避免每次修改都提交一个版本,也能够避免工作区的改动过多但是未提交所产生的风险。
git add
在版本库目录下编写readme.txt
文件,内容如下:
hello world
git add <file>
将工作区中的修改添加到暂存区
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git add readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
git commit
git commit -m "desc"
将暂存区的改动提交到当前分支,生成新的版本
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git commit -m 'first'
[master (root-commit) 1b66990] first
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
git status
git status
查看当前仓库文件的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean
git status -s
或 git status --short
查看当前仓库文件的状态(简化输出)
输出规则如下:
-
输出标记会有两列,第一列是对暂存区域而言,第二列是对工作区而言
-
??
用来标记文件是新创建的未跟踪的状态 -
第一列是
A
字母, 用来标记文件是新创建的已跟踪的状态 -
第一列是
M
字母,用来标记文件是有改动的已跟踪的状态 -
第二列是
M
字母,用来标记文件是有改动的未跟踪的状态 -
MM
表示文件上次改动被跟踪,当前改动未被跟踪
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
?? readme.txt
接下来我们跟踪一个文件从创建到提交的整个过程,来观察git status
的输出
1.版本库中无文件,我们查看一下仓库文件的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ ls -ah
./ ../ .git/
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status
On branch master #在master分支上
No commits yet #没有提交的版本
nothing to commit (create/copy files and use "git add" to track) #没有更改需要提交
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
执行git status
后,可以看到在当前master分支上还没有提交的版本,执行git status -s
后无输出信息
2.新创建一个文件readme.txt
,touch readme.txt
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
readme.txt
nothing added to commit but untracked files present (use "git add" to track)
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
?? readme.txt
执行git status
后,可以看到存在未跟踪的文件readme.txt
,执行git status -s
后,发现readme.txt
文件之前第一列和第二列多了两个问号,表示文件为新增的并且未添加到暂存区中。
3.执行git add readme.txt
,再查看一下仓库文件的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.txt
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
A readme.txt
执行git status
后,可以看到存在要提交的更改(新建的文件readme.txt
),执行git status -s
后,发现readme.txt
文件之前第一列多了一个A
,表示文件的改动已添加到暂存区。
4.执行git commit -m 'first commit'
,再查看一下仓库文件的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
此时暂存区的修改提交到了当前master分支上。
5.我们对readme.txt
文件进行修改,执行vim readme.txt
,添加一行hello world,然后查看一下仓库文件的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ 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: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
M readme.txt
执行git status
后,可以看到文件存在改动并且改动未添加到暂存区(改变的文件readme.txt
),执行git status -s
后,发现readme.txt
文件之前第二列多了一个M
,表示工作区的readme.txt
文件有改动并且未添加到暂存区。
6.再次执行git add readme.txt
,然后查看一下仓库文件的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: readme.txt
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
M readme.txt
执行git status
后,可以看到存在要提交的更改(改变的文件readme.txt
),执行git status -s
后,发现readme.txt
文件之前第一列多了一个M
,表示工作区的readme.txt
文件有改动并且已添加到暂存区。
7.此时执行commit命令,则会输出同第4步的内容,但我们先不提交,而是修改readme.txt
,执行vim readme.txt
,添加一行git is very good,然后查看一下仓库文件的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: readme.txt
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: readme.txt
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
MM readme.txt
执行git status
后,我们发现文件即存在要提交的更改,也存在未添加到暂存区的更改,执行git status -s
后,发现readme.txt
文件前面第一列和第二列分别多了一个M
,表示工作区的readme.txt
文件的上次改动添加到了暂存区,本次改动未添加到暂存区。
8.我们此时再提交暂存区内的改动,执行commit命令,git commit -m 'second commit'
,然后查看一下仓库文件的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ 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: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git status -s
M readme.txt
执行git status
后,可以看到文件存在改动并且改动未添加到暂存区(改变的文件readme.txt
),执行git status -s
后,发现readme.txt
文件之前第二列多了一个M
,表示工作区的readme.txt
文件有改动并且未添加到暂存区。
git diff
git diff <file>
查看指定的工作区的文件和暂存区的不同
git diff head <file>
查看指定的工作区的文件和版本库中最新版本的不同
我们将readme.txt
保证在工作区,暂存区,版本库中各不相同,然后执行命令查看效果
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git diff readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
diff --git a/readme.txt b/readme.txt
index 0829798..176bcf6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
hello world
git is very good
+i like git very much
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git diff head readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
diff --git a/readme.txt b/readme.txt
index 3b18e51..176bcf6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,3 @@
hello world
+git is very good
+i like git very much
我们可以看到工作区比暂存区多了一行i like git very much,比版本库多了一行git is very good,一行i like git very much。
git log
git log
查看历史版本
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git log
commit 6763ec51e6a1f8c6191624ef12013c5b2b0f6dcd (HEAD -> master)
Author: yhc <1403125476@qq.com>
Date: Thu Mar 11 00:12:26 2021 +0800
second commit
commit 400662a418a8f395b22c1a9d7a2183f461677a67
Author: yhc <1403125476@qq.com>
Date: Wed Mar 10 21:45:48 2021 +0800
first commit
git log --pretty=oneline
查看历史版本(每个版本精简为一行)
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git log --pretty=oneline
6763ec51e6a1f8c6191624ef12013c5b2b0f6dcd (HEAD -> master) second commit
400662a418a8f395b22c1a9d7a2183f461677a67 first commit
git reflog
git reflog
查看历史操作记录
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git reflog
6763ec5 (HEAD -> master) HEAD@{0}: commit: second commit
400662a HEAD@{1}: commit (initial): first commit
版本切换
git reset --hard HEAD^
回退到上一个版本
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git reset --hard HEAD^
HEAD is now at 1b66990 first
git reset --hard HEAD^^
回退到上上一个版本,以此类推
git reset --hard <commit_id>
回退到指定版本,以此类推
注意:--hard
的作用为工作区和要切换的版本保持一致,暂存区置为空
撤销修改
git checkout -- <file>
把指定文件在工作区的修改全部撤销到暂存区或版本库的状态,让这个文件回到最近一次git commit或git add时的状态
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git checkout -- readme.txt
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ cat readme.txt
hello world
git is very good
注意:--
必须加,否则就变成了切换分支命令
git reset HEAD <file>
把指定文件的修改从暂存区中撤销掉
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master)
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
删除文件
git rm <file>
把文件从工作区中删除,并把此修改添加到暂存区(相当于执行rm <file>
,然后执行git add <file>
)
git rm --cached <file>
工作区的文件保留,但暂存区的文件删除