linux-git-02 git版本控制系统

linux-git-02 git版本控制系统

集中式vs分布式

  • 集中式CVS、SVN
    • 速度慢,必须联网,开源精神不符
    • 版本库集中放在中央服务器,工作时,获取最新版本,工作完成后,再推送给中央服务器!
  • 分布式
    • 无中央服务器,每个人的电脑都是一个完整的版本库
    • 安全性能更高
    • 通常有一台充当“中央服务器”的电脑,仅仅作为方便“交换”大家的修改

安装使用

Yum安装:

1
[root@localhost ~]# yum install git -y

为node1上所有的git仓库设置用户名和Email

1
2
[root@node1 ~]# git config --global user.name "Your Name"
[root@node1 ~]# git config --global user.email "email@example.com"

创建并初始化版本库

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# mkdir firstgit
[root@localhost ~]# cd firstgit/
[root@localhost firstgit]# git init
初始化空的 Git 版本库于 /root/firstgit/.git/
[root@localhost firstgit]# ls
[root@localhost firstgit]# ls -ah
. .. .git


.git目录作用:跟踪管理版本库

  所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

常规操作

1.把文件添加到仓库中

1
2
3
4
5
6
[root@localhost firstgit]# echo "hello world" > readme.txt
[root@localhost firstgit]# git add readme.txt
[root@localhost firstgit]# git commit -m "write something"
[master(根提交) c391307] write something
1 file changed, 1 insertion(+)
create mode 100644 readme.txt

2.修改文件内容,查询内容和状态并提交

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
[root@localhost firstgit]# echo "hello eagleslab" > readme.txt
[root@localhost firstgit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@localhost firstgit]# git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 3b18e51..8d0e700 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1 @@
-hello world
+hello eagleslab
[root@localhost firstgit]# git add readme.txt
[root@localhost firstgit]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: readme.txt
#
[root@localhost firstgit]# git commit -m "change messages"
[master 01633f9] change messages
1 file changed, 1 insertion(+), 1 deletion(-)
[root@localhost firstgit]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@localhost firstgit]#
[root@localhost firstgit]# ls
readme.txt


其中git status # 查询当前git仓库状态
git diff readme.txt # 查询发生变化的内容
-hello world 表示删减了hello world
+hello eagleslab 表示增加了hello eagleslab

3.查询历史记录并版本退回

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
[root@node1 firstgit]# git log
commit 3efa7f0fc058f00b0a98171fb77b44ab31481c87 # 版本ID
Author: Cokeku <1154283293@qq.com>
Date: Mon Mar 18 22:42:38 2019 -0400
add zj
commit 7b92afbb9f118f7ae10c49abc3114e4ee91ed26a
Author: Cokeku <1154283293@qq.com>
Date: Mon Mar 18 22:37:05 2019 -0400
change messages
commit e380d2cc936e01e17065408000c42c21f114321a
Author: Cokeku <1154283293@qq.com>
Date: Mon Mar 18 22:31:25 2019 -0400
write a readme.txt file
[root@node1 firstgit]# git reset --hard e380d2cc936e01e17065408000c42c21f114321a
HEAD is now at e380d2c write a readme.txt file
[root@node1 firstgit]# cat readme.txt
hello world
[root@node1 firstgit]# git reset --hard 3efa7f0fc058f00b0a98171fb77b44ab31481c87
HEAD is now at 3efa7f0 add zj
[root@node1 firstgit]# cat readme.txt
hello eagleslab zhengjiang!


[root@localhost firstgit]# git log
commit 01633f92603eea86884e9ba4cc181fee859016ad
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 15:07:06 2019 +0800

change messages

commit c3913073a08501d652624c2a0ccbe32e2aa70014
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 15:05:58 2019 +0800

write something
[root@localhost firstgit]# cat readme.txt
hello eagleslab
[root@localhost firstgit]# git reset --hard c3913073a08501d652624c2a0ccbe32e2aa70014
HEAD 现在位于 c391307 write something
[root@localhost firstgit]# cat readme.txt
hello world
[root@localhost firstgit]#


其中git reset --hard 版本ID # 退回指定版本

4.回滚失误怎么办?记录每一次的命令:

1
2
3
4
5
6
7
8
9
[root@localhost firstgit]# git reflog
c391307 HEAD@{0}: reset: moving to c3913073a08501d652624c2a0ccbe32e2aa70014
01633f9 HEAD@{1}: commit: change messages
c391307 HEAD@{2}: commit (initial): write something
[root@localhost firstgit]# git reset --hard 01633f9
HEAD 现在位于 01633f9 change messages
[root@localhost firstgit]# cat readme.txt
hello eagleslab
[root@localhost firstgit]#

  控制版本历史记录:因为git内部有个Head指针指向当前的版本,如果需要退回版本,只需要将Head指针指向相对应的版本号id,并且更新工作区文件。版本号不用写全,复制粘贴一部分即可。

工作区和暂存区

  • 工作区:当前所在的firstgit目录就是一个工作区
  • .git不算工作区,只是Git的版本库
    • 版本库中有暂存区和自动创建的master分支及指向master的一个指针HEAD

  git add将文件放到缓存区(暂存区)中,git commit将缓存区内的文件提交到仓库中,提交到仓库中之后我们用git status才能看到working directory clean工作区域变空,我们的仓库的内容才是最新的,所以每次工作对仓库内容进行更改之后,要git add并且git commit。

1EdLpn.png

    • git add:将修改后文件添加到暂存区
    • git commit:将暂存区的所有文件提交到master分支上
    • git跟踪的是每次修改而不是文件,如果不将修改添加到暂存区是无法加入commit中的
  • 撤销修改
    • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file
    • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset –hard 版本id,就回到了场景1,第二步按场景1操作
    • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,版本退回即可,不过前提是没有推送到远程库
  • 删除文件
1
2
3
4
5
6
[root@localhost firstgit]# git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed) # 先删除再提交
# (use "git checkout -- <file>..." to discard changes in working directory) # 将版本库中的最新内容同步到工作区
# deleted: readme.tx

实例测试

1
2
3
4
5
6
7
8
9
10
[root@localhost firstgit]# echo "i am first" > 1.txt
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git commit -m "add 1.txt"
[master 6f7081e] add 1.txt
1 file changed, 1 insertion(+)
create mode 100644 1.txt
[root@localhost firstgit]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@localhost firstgit]#

  场景1:当你改乱了1.txt的内容,想直接丢弃工作区的修改时,用命令git checkout – file

1
2
3
4
5
6
7
8
9
[root@localhost firstgit]# vim 1.txt 
[root@localhost firstgit]# cat 1.txt
i am first
asdiausdaushduahsdiuhiu
asjdoaishd
[root@localhost firstgit]# git checkout 1.txt
[root@localhost firstgit]# cat 1.txt
i am first
[root@localhost firstgit]#

  场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset –hard 版本id ,就回到了场景1;第二步按场景1操作。

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
[root@localhost firstgit]# vim 1.txt 
[root@localhost firstgit]# cat 1.txt
i am first
iauhdiusa'asdhausd
doaushdiau
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git log
commit 6f7081e1b06730504533015604d51e55e21c175a
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 15:52:47 2019 +0800

add 1.txt

commit 01633f92603eea86884e9ba4cc181fee859016ad
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 15:07:06 2019 +0800

change messages

commit c3913073a08501d652624c2a0ccbe32e2aa70014
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 15:05:58 2019 +0800

write something
[root@localhost firstgit]# git reset --hard 6f7081e1b06730504533015604d51e55e21c175a
HEAD 现在位于 6f7081e add 1.txt
[root@localhost firstgit]# git checkout 1.txt
[root@localhost firstgit]# cat 1.txt
i am first
[root@localhost firstgit]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@localhost firstgit]#

  场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,版本退回即可,不过前提是没有推送到远程库

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
48
49
[root@localhost firstgit]# vim 1.txt 
[root@localhost firstgit]# cat 1.txt
i am first
duasgiu\a
asda
sda
sd
as
das
d
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git commit -m "add trash 1.txt"
[master ec3d8c4] add trash 1.txt
1 file changed, 7 insertions(+)
[root@localhost firstgit]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@localhost firstgit]# git log
commit ec3d8c40f68aa9928d7294c61866be82a2b8f81d
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 16:03:03 2019 +0800

add trash 1.txt

commit 6f7081e1b06730504533015604d51e55e21c175a
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 15:52:47 2019 +0800

add 1.txt

commit 01633f92603eea86884e9ba4cc181fee859016ad
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 15:07:06 2019 +0800

change messages

commit c3913073a08501d652624c2a0ccbe32e2aa70014
Author: feng <yfengzone@outlook.com>
Date: Sun Mar 24 15:05:58 2019 +0800

write something
[root@localhost firstgit]# git reset --hard 6f7081e1b06730504533015604d51e55e21c175a
HEAD 现在位于 6f7081e add 1.txt
[root@localhost firstgit]# cat 1.txt
i am first
[root@localhost firstgit]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@localhost firstgit]#
欢迎打赏,谢谢
------ 本文结束------
0%