本篇文章来源于《GitHub入门与实践》第4章 通过实际操作学习Git

1、基本操作

  • git init – 初始化仓库

初始化成功后该目录下会生成.git目录(也称为附属于该仓库的工作树),储存管理当前目录内容所需的仓库数据

文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前的快照,在工作树中打开

1
2
3
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test
$ git init
Initialized empty Git repository in C:/Users/G3/Desktop/git test/.git/
  • git status –查看仓库的状态

工作树和仓库在被操作的过程中,状态会不断发生变化

1
2
3
4
5
6
7
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

所谓提交(Commit),是指“记录工作树中所有文件的当前状态”

新建README.md文件后的status如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ touch README.md

G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git status
On branch master

No commits yet

Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md

nothing added to commit but untracked files present (use "git add" to track)
  • git add –向暂存区中添加文件

只是用Git仓库的工作树创建了文件,那么该文件并不会被记入Git仓库的版本管理对象当中。因此我们用git status命令查看README.md文件时,它会显示在Untracked files里。

要想让文件成为Git仓库的管理对象,就需要用gitadd命令将其加入暂存区(Stage或者Index)中。暂存区是提交之前的一个临时区域

1
2
3
4
5
6
7
8
9
10
11
12
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git add README.md

G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git status
On branch master

No commits yet

Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
  • git commit –保存仓库的历史记录

该命令将当前暂存区中的文件实际保存到仓库的历史记录中。通过这些记录,我们就可以在工作树中复原文件

-m参数后的称为提交信息,是对该提交的概述

1
2
3
4
5
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git commit -m "First commit"
[master (root-commit) 066eaf7] First commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md

记录详细提交信息

不加-m参数,直接执行git commit命令,接着会打开对应的编辑器编辑提交信息,其格式如下:

第一行:用一行文字简述提交的更改内容

第二行:空行

第三行以后:记述更改的原因和详细内容
终止提交
在编辑器启动后想中止提交,请将提交信息留空并直接关闭编辑器,随后提交就会被中止
查看提交后状态

1
2
3
4
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git status
On branch master
nothing to commit, working tree clean
  • git log –查看提交日志

查看以往仓库中提交的日志。包括可以查看什么人在什么时候进行了提交或合并,以及操作前后有怎样的差别
注:若日志较长无法完全显示,可回车往下显示一行,并且按”q”正常退出,若非正常退出则会造成继续输入命令时无法正常显示出来;若出现这样的情况可以输入reset命令重置git bash,也可关闭当前终端重新打开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git log
commit 02117edd38575da4a4de7a40be083cef2e7883b2 (HEAD -> master)
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:32:23 2022 +0800

file context changed.

I am trying to change this context of the README.md file
changed by LYJ

commit 066eaf72002d80f78d7031f22e38db8c87f03a9e
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:25:49 2022 +0800

First commit

只显示提交信息第一行

使用命令git log --pretty=short即可
只显示指定目录、文件日志
使用命令git log filename即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git log README.md
commit 02117edd38575da4a4de7a40be083cef2e7883b2 (HEAD -> master)
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:32:23 2022 +0800

file context changed.

I am trying to change this context of the README.md file
changed by LYJ

commit 066eaf72002d80f78d7031f22e38db8c87f03a9e
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:25:49 2022 +0800

First commit

显示文件改动

使用命令git log -p即可在提交信息后显示文件的前后差别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ git log -p
commit 02117edd38575da4a4de7a40be083cef2e7883b2 (HEAD -> master)
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:32:23 2022 +0800

file context changed.

I am trying to change this context of the README.md file
changed by LYJ

diff --git a/README.md b/README.md
index e69de29..71b6fb7 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,5 @@
+# hello world
+
+This is a test, I am trying to learn git and do some excise(maybe).
+
+And this is a test file.
\ No newline at end of file
  • git diff –查看更改前后的差别

git diff命令可以查看工作树、暂存区、最新提交之间的差别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git diff
diff --git a/README.md b/README.md
index 71b6fb7..5b82da4 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,6 @@

This is a test, I am trying to learn git and do some excise(maybe).

-And this is a test file.
\ No newline at end of file
+The line be deleted. This is a description.
+
+And this is a new line.
\ No newline at end of file

由于我们尚未用git add命令向暂存区添加任何东西,所以程序只会显示工作树与最新提交状态之间的差别

+”号标出的是新添加的行,被删除的行则用“-”号标出

使用git add README.md将README.md文件加入暂存区

查看工作树和最新提交的差别

现在执行git diff
命令,由于工作树和暂存区的状态并无差别,结果什么都不会显示。要查看与最新提交的差别,请执行命令git diff HEAD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git diff

G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git diff HEAD
diff --git a/README.md b/README.md
index 71b6fb7..5b82da4 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,6 @@

This is a test, I am trying to learn git and do some excise(maybe).

-And this is a test file.
\ No newline at end of file
+The line be deleted. This is a description.
+
+And this is a new line.
\ No newline at end of file

不妨养成这样一个好习惯:在执行git commit命令之前先执行git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。这里的HEAD是指向当前分支中最新一次提交的指针

1
2
3
$ git commit -m "Add something new and delete something old"
[master a071997] Add something new and delete something old
1 file changed, 3 insertions(+), 1 deletion(-)

查看提交日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ git log
commit a07199771e6436b72a32b6fec45b90caf4ed8c1b (HEAD -> master)
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:51:20 2022 +0800

Add something new and delete something old

commit 02117edd38575da4a4de7a40be083cef2e7883b2
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:32:23 2022 +0800

file context changed.

I am trying to change this context of the README.md file
changed by LYJ

commit 066eaf72002d80f78d7031f22e38db8c87f03a9e
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:25:49 2022 +0800

First commit

2、分支操作

  • git branch –显示分支一览表
1
2
3
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git branch
* master

标 * 表示当前所在分支

  • git checkout –创建(添加参数-b)、切换分支

使用如下命令进行切换:

1
git checkout feature-A
1
2
3
4
5
6
7
8
9
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git checkout -b feature-A
Switched to a new branch 'feature-A'

G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (feature-A)
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (feature-A)
$ git branch
* feature-A
master

此时修改代码、执行git add命令提交,代码会提交到feature-A分支,像这样不断对一个分支(例如feature-A)进行提交的操作,我们称为“培育分支”

注:这里在feature-A修改代码并提交后再切换到master分支,代码不会有相应的改动

切换回上一个分支

用“-”(连字符)代替分支名,就可以切换至上一个分支。当然,将“-”替换成master同样可以切换到master分支

1
2
3
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (feature-A)
$ git checkout -
Switched to branch 'master'

特性分支

特性分支顾名思义,是集中实现单一特性(主题),除此之外不进行任何作业的分支。在日常开发中,往往会创建数个特性分支,同时在此之外再保留一个随时可以发布软件的稳定分支。稳定分支的角色通常由master分支担当

主干分支

主干分支是刚才我们讲解的特性分支的原点,同时也是合并的终点。通常人们会用master分支作为主干分支

  • git merge –合并分支

使用命令git merge --no-ff feature-A,参数–no-ff是为了在历史记录中明确记录下本次分支合并

1
2
3
4
5
6
7
8
9
10
11
12
13
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git merge --no-ff feature-A
hint: Waiting for your editor to close the file...
[main 2022-02-22T06:12:20.690Z] update#setState idle
[main 2022-02-22T06:12:21.135Z] ExtensionHostStarterWorker created
[main 2022-02-22T06:12:23.323Z] Starting extension host with pid 13468 (fork() took 103 ms).
[main 2022-02-22T06:12:23.324Z] ExtensionHostStarterWorker.start() took 106 ms.
[main 2022-02-22T06:12:50.696Z] update#setState checking for updates
[main 2022-02-22T06:12:50.792Z] update#setState idle
[main 2022-02-22T06:13:03.000Z] Extension host with pid 13468 exited with code: 0, signal: null.
Merge made by the 'recursive' strategy.
README.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
  • git log –graph 以图表形式查看分支

git log --graph命令进行查看的话,能很清楚地看到特性分支(feature-A)提交的内容已被合并。除此以外,特性分支的创建以及合并也都清楚明了

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
30
31
32
33
34
git log --graph
* commit 4c6d8896e9e288b21a36aa840f0c536d8154d683 (HEAD -> master)
|\ Merge: a071997 40d98e7
| | Author: Thee24LYJ <1579290423@qq.com>
| | Date: Tue Feb 22 14:12:18 2022 +0800
| |
| | Merge branch 'feature-A' into master
| |
| * commit 40d98e76c16be3748c4cc78d178049b579450e13 (feature-A)
|/ Author: Thee24LYJ <1579290423@qq.com>
| Date: Tue Feb 22 14:01:11 2022 +0800
|
| add to feature-A
|
* commit a07199771e6436b72a32b6fec45b90caf4ed8c1b
| Author: Thee24LYJ <1579290423@qq.com>
| Date: Mon Feb 21 14:51:20 2022 +0800
|
| Add something new and delete something old
|
* commit 02117edd38575da4a4de7a40be083cef2e7883b2
| Author: Thee24LYJ <1579290423@qq.com>
| Date: Mon Feb 21 14:32:23 2022 +0800
|
| file context changed.
|
| I am trying to change this context of the README.md file
| changed by LYJ
|
* commit 066eaf72002d80f78d7031f22e38db8c87f03a9e
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:25:49 2022 +0800

First commit

3、更改提交操作

  • git reset –回溯历史版本

这里为熟悉对历史版本的操作,先回溯历史版本,创建一个名为fix-B的特性分支

1
2
3
4
5
6
7
8
9
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git checkout -b fix-B
Switched to a new branch 'fix-B'

G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (fix-B)
$ git branch
feature-A
* fix-B
master

回溯到创建feature-A分支前

要让仓库的HEAD、暂存区、当前工作树回溯到指定状态,需要用到gitreset –hard命令。只要提供目标时间点的哈希值,就可以完全恢复至该时间点的状态

1
2
3
4
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git reset --hard a07199771e6436b72a32b6fec45b90caf4ed8c1b
HEAD is now at a071997 Add something new and delete something old

已经成功回溯到特性分支(feature-A)创建之前的状态。由于所有文件都回溯到了指定哈希值对应的时间点上,README.md文件的内容也恢复到了当时的状态
创建fix-B分支

1
2
3
4
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git checkout -b fix-B
Switched to a new branch 'fix-B'

修改代码内容并提交

1
2
3
4
5
6
7
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (fix-B)
$ git add README.md

G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (fix-B)
$ git commit -m "fix-B change"
[fix-B e690648] fix-B change
1 file changed, 9 insertions(+), 1 deletion(-)

推进至feature-A分支合并后的状态

首先恢复到feature-A分支合并后的状态。不妨称这一操作为“推进历史”

git log命令只能查看以当前状态为终点的历史日志。所以这里要使用git reflog命令,查看当前仓库的操作日志。在日志中找出回溯历史之前的哈希值,通过git reset --hard命令恢复到回溯历史前的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (fix-B)
$ git reflog
e690648 (HEAD -> fix-B) HEAD@{0}: commit: fix-B change
a071997 (master) HEAD@{1}: checkout: moving from master to fix-B
a071997 (master) HEAD@{2}: reset: moving to a07199771e6436b72a32b6fec45b90caf4ed8c1b
4c6d889 HEAD@{3}: checkout: moving from fix-B to master
4c6d889 HEAD@{4}: checkout: moving from master to fix-B
4c6d889 HEAD@{5}: merge feature-A: Merge made by the 'recursive' strategy.
a071997 (master) HEAD@{6}: checkout: moving from feature-A to master
40d98e7 (feature-A) HEAD@{7}: checkout: moving from master to feature-A
a071997 (master) HEAD@{8}: checkout: moving from master to master
a071997 (master) HEAD@{9}: checkout: moving from feature-A to master
40d98e7 (feature-A) HEAD@{10}: checkout: moving from master to feature-A
a071997 (master) HEAD@{11}: checkout: moving from feature-A to master
40d98e7 (feature-A) HEAD@{12}: commit: add to feature-A
a071997 (master) HEAD@{13}: checkout: moving from master to feature-A
a071997 (master) HEAD@{14}: checkout: moving from feature-A to master
a071997 (master) HEAD@{15}: checkout: moving from master to feature-A
a071997 (master) HEAD@{16}: commit: Add something new and delete something old
02117ed HEAD@{17}: commit: file context changed.
066eaf7 HEAD@{18}: commit (initial): First commit

在日志中,我们可以看到commit、checkout、reset、merge等Git命令的执行记录。只要不进行Git的GC(Garbage Collection,垃圾回收),就可以通过日志随意调取近期的历史状态,就像给时间机器指定一个时间点,在过去未来中自由穿梭一般。即便开发者错误执行了Git操作,基本也都可以利用git reflog命令恢复到原先的状态

恢复到回溯前的历史状态

1
2
3
4
5
6
7
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (fix-B)
$ git checkout master
Switched to branch 'master'

G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git reset --hard 4c6d889
HEAD is now at 4c6d889 Merge branch 'feature-A' into master

消除冲突

现在只要合并fix-B分支,就可以得到我们想要的状态

1
2
3
4
5
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git merge --no-ff fix-B
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

系统告诉我们README.md文件发生了冲突(Conflict)。系统在合并README.md文件时,feature-A分支更改的部分与本次想要合并的fix-B分支更改的部分发生了冲突。不解决冲突就无法完成合并,所以我们打开README.md文件解决这个冲突

提交解决后结果

1
2
3
4
5
6
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master|MERGING)
$ git add README.md

G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master|MERGING)
$ git commit -m "Fix conflict by LYJ"
[master 898df01] Fix conflict by LYJ
  • git commit –amend 修改提交信息

要修改上一条提交信息,可以使用git commit –amend命令。我们将上一条提交信息记为了”Fix conflict”,但它其实是fix-B分支的合并,解决合并时发生的冲突只是过程之一,这样标记实在不妥。于是,我们要修改这条提交信息

执行上述命令后再打开的编辑器中修改之前提交信息,之后保存文件并关闭编辑器

  • 如果只是想修改上一次提交的代码内容,可以先修改代码文件,然后使用以下命令:
1
2
git add <file>
git commit --amend

其中<file>为要修改的文件名。这样就可以修改上一次提交的代码内容了。需要注意的是,如果已经将修改推送到远程仓库,不建议修改历史提交记录,以免引起其他人的代码混乱。

  • 4.合并至master分支

执行git log –graph命令,可以看到提交日志中的相应内容也已经被修改

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$ git log --graph
* commit a783495d5c1328df81c759b2c2521cae175d4ae6 (HEAD -> master)
|\ Merge: 4c6d889 e690648
| | Author: Thee24LYJ <1579290423@qq.com>
| | Date: Tue Feb 22 14:41:40 2022 +0800
| |
| | Merge branch 'fix-B'
| |
| * commit e6906488cc59494f376a0673f65d0da0dd260c97 (fix-B)
| | Author: Thee24LYJ <1579290423@qq.com>
| | Date: Tue Feb 22 14:32:16 2022 +0800
| |
| | fix-B change
| |
* | commit 4c6d8896e9e288b21a36aa840f0c536d8154d683
|\ \ Merge: a071997 40d98e7
| |/ Author: Thee24LYJ <1579290423@qq.com>
|/| Date: Tue Feb 22 14:12:18 2022 +0800
| |
| | Merge branch 'feature-A' into master
| |
| * commit 40d98e76c16be3748c4cc78d178049b579450e13 (feature-A)
|/ Author: Thee24LYJ <1579290423@qq.com>
| Date: Tue Feb 22 14:01:11 2022 +0800
|
| add to feature-A
|
* commit a07199771e6436b72a32b6fec45b90caf4ed8c1b
| Author: Thee24LYJ <1579290423@qq.com>
| Date: Mon Feb 21 14:51:20 2022 +0800
|
| Add something new and delete something old
|
* commit 02117edd38575da4a4de7a40be083cef2e7883b2
| Author: Thee24LYJ <1579290423@qq.com>
| Date: Mon Feb 21 14:32:23 2022 +0800
|
| file context changed.
|
| I am trying to change this context of the README.md file
| changed by LYJ
|
* commit 066eaf72002d80f78d7031f22e38db8c87f03a9e
Author: Thee24LYJ <1579290423@qq.com>
Date: Mon Feb 21 14:25:49 2022 +0800

First commit

git rebase -i 压缩历史

在合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,不妨提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一个历史记录

  • 1.创建feature-C分支
1
2
3
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (master)
$ git checkout -b feature-C
Switched to a new branch 'feature-C'

作为feature-C的功能实现,我们在README.md文件中添加一行文字,并且故意留下拼写错误,以便之后修正.
提交这部分内容。这个小小的变更就没必要先执行git add命令再执行git commit命令了,我们用git commit -am命令来一次完成这两步操作

1
2
3
$ git commit -am "add feature-C"
[feature-C a6c2906] add feature-C
1 file changed, 3 insertions(+)
  • 2.修正拼写错误
1
2
3
4
5
6
7
8
9
10
11
12
$ git diff
diff --git a/README.md b/README.md
index e49ccca..8b79141 100644
--- a/README.md
+++ b/README.md
@@ -17,4 +17,4 @@ hello world...!

---

-- faeture-C
+- feature-C

然后提交

1
2
3
4
G3@DESKTOP-OM3KFRO MINGW64 ~/Desktop/git test (feature-C)
$ git commit -am "Fix typo"
[feature-C 508e161] Fix typo
1 file changed, 1 insertion(+), 1 deletion(-)

错字漏字等失误称作typo,所以我们将提交信息记为”Fix typo”。实际上,我们不希望在历史记录中看到这类提交,因为健全的历史记录并不需要它们

  • 3.更改历史

将”Fix typo”修正的内容与之前一次的提交合并,在历史记录中合并为一次完美的提交

1
git rebase -i HEAD~2

用上述方式执行git rebase命令,可以选定当前分支中包含HEAD(最新提交)在内的两个最新历史记录为对象,并在编辑器中打开

1
2
3
4
5
pickup a6c2906 add feature-C
pickup 508e161 Fix typo
---修改
pickup a6c2906 add feature-C
fixup 508e161 Fix typo
1
2
3
4
5
6
7
8
9
10
$ git rebase -i HEAD~2
hint: Waiting for your editor to close the file...
[main 2022-02-22T06:53:27.400Z] update#setState idle
[main 2022-02-22T06:53:27.436Z] ExtensionHostStarterWorker created
[main 2022-02-22T06:53:28.558Z] Starting extension host with pid 12816 (fork() took 51 ms).
[main 2022-02-22T06:53:28.558Z] ExtensionHostStarterWorker.start() took 51 ms.
[main 2022-02-22T06:53:57.413Z] update#setState checking for updates
[main 2022-02-22T06:53:57.507Z] update#setState idle
[main 2022-02-22T06:54:12.586Z] Extension host with pid 12816 exited with code: 0, signal: null.
Successfully rebased and updated refs/heads/feature-C.

此时再查看日志会发现add feature-C的哈希值改变了,这样一来,Fix typo就从历史中被抹去,也就相当于Add feature-C中从来没有出现过拼写错误。这算是一种良性的历史改写

4.修改上一次提交的内容

1
git commit --amend

执行上述命令后,会打开编辑器,并显示上一次提交时的提交信息。在编辑器中修改提交信息后保存并退出即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git checkout master
Switched to branch 'master'

$ git merge --no-ff feature-C
hint: Waiting for your editor to close the file...
[main 2022-02-22T06:59:46.546Z] update#setState idle
[main 2022-02-22T06:59:46.575Z] ExtensionHostStarterWorker created
[main 2022-02-22T06:59:47.640Z] Starting extension host with pid 15528 (fork() took 54 ms).
[main 2022-02-22T06:59:47.640Z] ExtensionHostStarterWorker.start() took 55 ms.
[main 2022-02-22T07:00:00.585Z] Waiting for extension host with pid 15528 to exit.
[main 2022-02-22T07:00:00.585Z] Extension host with pid 15528 exited with code: 0, signal: null.
Merge made by the 'recursive' strategy.
README.md | 3 +++
1 file changed, 3 insertions(+)

4.其他git技巧

1.当需要修改一个突发bug时,很自然地,可以创建一个分支bug-1来修复它,但是当前正在某个分支上进行的工作还没有提交,此时可以使用git stash把当前工作现场“储藏”起来,等解决完bug后继续工作

1
2
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge

解决完bug后,可以使用以下两个方式恢复现场工作环境:

  • git stash apply恢复,但是恢复后,stash内容并不删除,需要用git stash drop来删除;
  • git stash pop,恢复的同时也会把stash内容删除

2.若需要将bug分支修复的操作“复制”到其他分支,git专门提供了一个cherry-pick 提交哈希值命令,让我们能复制一个特定的提交到当前分支

3.给某个commit创建标签

命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a -m “blablabla…”可以指定标签信息;
命令git tag可以查看所有标签
命令git push origin 可以推送一个本地标签;
命令git push origin –tags可以推送全部未推送过的本地标签;
命令git tag -d 可以删除一个本地标签;
命令git push origin :refs/tags/可以删除一个远程标签

4.删除之前版本中提交的文件但不影响现有的文件,后续再通过将该文件添加到.gitignore中确保不会被提交到版本管理中去

1
$ git rm --cached 文件

5、推送至远程仓库

前面三个部分都是针对本地单一仓库的操作,现在开始接触网络上的远程仓库

1.git remote add –添加远程仓库

1
git remote add origin git@github.com:用户名/git-tutorial.git

2.git push –推送至远程仓库

  • 推送至master分支
1
git push -u origin master

像这样执行git push命令,当前分支的内容就会被推送给远程仓库origin的master分支。-u参数可以在推送的同时,将origin仓库的master分支设置为本地仓库当前分支的upstream(上游)。添加了这个参数,将来运行git pull命令从远程仓库获取内容时,本地仓库的这个分支就可以直接从origin的master分支获取内容,省去了另外添加参数的麻烦

执行该操作后,当前本地仓库master分支的内容将会被推送到GitHub的远程仓库中

  • 推送至master以外的分支
1
git push -u origin feature-D

5、从远程仓库获取

1.git clone –获取远程仓库

  • 获取远程仓库
1
git clone git@github.com:用户名/git-tutorial.git

执行git clone命令后我们会默认处于master分支下,同时系统会自动将origin设置成该远程仓库的标识符。也就是说,当前本地仓库的master分支与GitHub端远程仓库(origin)的master分支在内容上是完全相同的

用git branch -a命令查看当前分支的相关信息。添加 -a参数可以同时显示本地仓库和远程仓库的分支信息

  • 获取远程的feature-D分支
1
git checkout -b feature-D origin/feature-D

-b参数的后面是本地仓库中新建分支的名称。为了便于理解,我们仍将其命名为feature-D,让它与远程仓库的对应分支保持同名。新建分支名称后面是获取来源的分支名称。例子中指定了origin/feature-D,就是说以名为origin的仓库(这里指GitHub端的仓库)的feature-D分支为来源,在本地仓库中创建feature-D分支

  • 向本地的feature-D分支提交更改

这里跟之前的一样

  • 推送feature-D分支
1
git push

从远程仓库获取feature-D分支,在本地仓库中提交更改,再将feature-D分支推送回远程仓库,通过这一系列操作,就可以与其他开发者相互合作,共同培育feature-D分支,实现某些功能

2.git pull –获取最新的远程仓库

使用git pull命令,将本地的feature-D分支更新到最新状态。当前分支为feature-D分支

1
git pull origin feature-D

参考教程:

Git教程
Git教程-极客笔记
教你如何上传项目到GitHub