重拾 git

警告
本文最后更新于 2022-09-13,文中内容可能已过时。

重新学习 git。

安装

配置:config

git 要求给出开发人员的基本信息:

  1. 名字
  2. 邮件

这是为了更好的最终文件修改人。这个配置可以是全局、或者单独针对某个项目。

global

1
2
git config --global user.name "william"
git config --global user.email "william.x.x@gmail.com"

使用

新建空项目:init

1
2
3
4
5
6
mkdri testing
cd testing
git init
Initialized empty Git repository in /tmp/testing/.git/

ls -alh

添加文件:add

1
2
3
git add readme.md

git add install.sh

提交修改:commit

1
2
3
4
5
6
git commit -m "init project and add readme"

[master (root-commit) f78741f] init project and add readme
 2 files changed, 2 insertions(+)
 create mode 100644 install.sh
 create mode 100644 readme.md

查看当前状态:status

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
echo "hello, world" >> readme.md
echo "this is new line" >> readme.md

git status

On branch master
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:   readme.md

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

查看不同:diff

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git diff readme.md

diff --git a/readme.md b/readme.md
index 63173a9..cea5572 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,3 @@
 # git testing
+hello, world
+this is new line

查看日志:log

git 处理的是每一次修改的快照(snapshot),为每一次的修改生成一次 log 条目,用于查看该次修改的日志说明。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
git log

commit 3a0003085047a83783a7fff67b3904ccd2154ff0 (HEAD -> master)
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 09:05:39 2022 +0800

    modify readme

commit f78741f31fe3f5600a8c003aa456744668a09da2
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 08:58:23 2022 +0800

    init project and add readme

回滚:reset

HEAD 表示当前版本号,可以使用 HEAD^ 返回上一个版本,或者 HEAD~n 返回之前n个版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
## 上一个版本,也可以用 HEAD~n,其中n表示之前多少个log
git reset --hard HEAD^

HEAD is now at f78741f init project and add readme

git log

commit f78741f31fe3f5600a8c003aa456744668a09da2 (HEAD -> master)
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 08:58:23 2022 +0800

    init project and add readme

当然,如果我们想恢复之前的第二个修改,在上面的 git log 我们知道这个版本的修改 commit id

1
2
3
4
5
commit 3a0003085047a83783a7fff67b3904ccd2154ff0 (HEAD -> master)
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 09:05:39 2022 +0800

    modify readme

所以我们还是可以在不同的 commit id 来回跳转的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
## 一般写前面几位就可以了,不需要整个 id
#git reset --hard 3a0003085047a83783a7fff67b3904ccd2154ff0
git reset --hard 3a0003

commit 3a0003085047a83783a7fff67b3904ccd2154ff0 (HEAD -> master)
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 09:05:39 2022 +0800

    modify readme

commit f78741f31fe3f5600a8c003aa456744668a09da2
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 08:58:23 2022 +0800

    init project and add readme

我们看到,当前的版本又重新回到的最近的修改了。Git 的版本回退速度非常快,因为 Git 在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git 仅仅是把 HEAD 从指向对应的 commit id

重看log:reflog

像上面那样,如果我们 resetHEAD,结果把屏幕清除了,导致我们记不起之前的 commit id。该怎么办呢?其实 git 提供了对每次修改的记录查新,可以很方便的看到每次操作的历史记录

1
2
3
4
5
6
git reflog

3a00030 (HEAD -> master) HEAD@{0}: reset: moving to 3a0003
f78741f HEAD@{1}: reset: moving to HEAD^
3a00030 (HEAD -> master) HEAD@{2}: commit: modify readme
f78741f HEAD@{3}: commit (initial): init project and add readme

从上面的记录我们看到,reset: moving to HEAD^ 是我们把 HEAD 往前回滚了一次,到了 f78741f ,这时候 3a00030 就是后面一条最新的版本,所以还是可以回滚到这个版本的

1
git reset --hard 3a0003

撤销修改:checkout

有时候,我们对于修改的文件,想要丢弃,恢复到原先的状态。这时候可以使用 checkout

在工作区未提交

如果我们的修改只是在工作区,则可以直接丢弃修改即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
git status .
On branch master
nothing to commit, working tree clean

echo "add extra line" >> readme.md

git status .
On branch master
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:   readme.md

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

从上面我们看出来,当前工作区有一个 modified 没有提交到缓存区 Changes not staged for commit。如果我们想放弃本次修改,可以直接使用命令 checkout

1
2
3
4
5
6
git checkout readme.md

git status

On branch master
nothing to commit, working tree clean

可以看到,本次修改已经被丢弃,当前分支是干净的。

已经 add 到缓存区

如果修改已经提交到了缓存区,我们可以用 reset HEAD filename 将缓存区(stage)退回到与当前分支一样的状态(HEAD),然后在用 checkout 丢弃修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
echo "add extra line" >> readme.md

git add readme.md

git status .
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.md

看到上面的已经被 add 到了缓存区。那么,我们可以用 reset HEAD <file> 命令将其从缓存区放弃

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
## 先将其从缓存区放弃
git reset HEAD readme.md

## 然后在从工作区放弃
git checkout readme.md

## 现在查看状态已经是干净的了

git status
On branch master
nothing to commit, working tree clean

已经 commit 到分支

对于已经提交到分支的修改,我们可以用 reset commit_id 退回到上一个版本(这个 commit_id 指的是上一个版本号)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
echo "add extra line3" >> readme.md

git add readme.md
git commit -m "add extra line3 into readme"

git log
commit 18529d695e8e4ce797f7878135369a11ef658549 (HEAD -> master)
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 11:07:35 2022 +0800

    add extra line3 in readme

commit 9205b630a3efd2b5c2ddd7ea732a53e5f0a3bd6e
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 10:54:59 2022 +0800

    add extra line in readme

commit 3a0003085047a83783a7fff67b3904ccd2154ff0
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 09:05:39 2022 +0800

    modify readme

commit f78741f31fe3f5600a8c003aa456744668a09da2
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 08:58:23 2022 +0800

    init project and add readme

我们发现本次修改已经在当前分支了,log 已经能查询本次修改。那么,我们可以退回上一次的修改,commit_id 对应是 9205b630a3efd2b5c2ddd7ea732a53e5f0a3bd6e

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
git reset --hard 9205b630a3efd2b5c2ddd7ea732a53e5f0a3bd6e

git log

commit 9205b630a3efd2b5c2ddd7ea732a53e5f0a3bd6e (HEAD -> master)
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 10:54:59 2022 +0800

    add extra line in readme

commit 3a0003085047a83783a7fff67b3904ccd2154ff0
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 09:05:39 2022 +0800

    modify readme

commit f78741f31fe3f5600a8c003aa456744668a09da2
Author: “williamlfang” <“william.lian.fang@gmail.com”>
Date:   Sun Jul 24 08:58:23 2022 +0800

    init project and add readme

现在已经没有 line3 的修改记录了。

如果没有添加 –hard 这表示本次修改依然保留在工作区

相关内容

william 支付宝支付宝
william 微信微信
0%