集中式:CVS SVN

  1. 速度慢,必须联网
  2. 版本库集中放在中央服务器,工作时,获取最新版本,工作完成后,再推送给中央服务器

    分布式

  3. 无中央服务器,每个人的电脑都是一个完整的版本库

  4. 完全性能会更高
  5. 通常有一台充当“中央服务器”的电脑,仅仅作为方便“交换”大家的修改

    安装使用

    [root@node1 ~]# yum install git -y
    为node1上所有的git仓库设置用户名和Email
    [root@node1 ~]# git config —global user.name “ryan”
    [root@node1 ~]# git config —global user.email “ryan@example.com”
    创建并初始化版本库:
    [root@node1 ~]# mkdir firstgit && cd firstgit && git init && ls -ah
    Initialized empty Git repository in /root/firstgit/.git/
    . .. .git
    .git : 目录作用是:跟踪管理版本库
    所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的
    程序代码等等,Git也不例外。 版本控制系统可以告诉你每次的改动,图片、视频
    这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能
    把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,
    但到底改了啥,版本控制系统不知道,也没法知道。
    版本控制系统:能够跟踪文本文件的改动

    常规操作

    把文件添加到仓库中

    [root@node1 firstgit]# echo “hello eagles” >> readme.txt
    [root@node1 firstgit]# git add readme.txt # 添加到仓库中
    [root@node1 firstgit]# git commit -m “write a readme.txt file” # 提交并通过-m参数说明
    [master (root-commit) d17c654] write a readme.txt file
    1 file changed, 1 insertion(+)
    create mode 100644 readme.txt

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

    [root@node1 firstgit]# echo “hello world” >> readme.txt
    [root@node1 firstgit]# git status # 查看当前git仓库状态,readme.txt 文件被修改了,修改添加并提交
    # On branch master
    # Changes not staged for commit:
    # (use “git add …” to update what will be committed)
    # (use “git checkout — …” to discard changes in working directory)
    #
    # modified: readme.txt
    #
    no changes added to commit (use “git add” and/or “git commit -a”)
    [root@node1 firstgit]# git diff readme.txt
    diff —git a/readme.txt b/readme.txt
    index 5203f63..03cfda3 100644
    —- a/readme.txt
    +++ b/readme.txt
    @@ -1,2 +1,3 @@
    hello eagles
    hello world
    +hello world Linux
    [root@node1 firstgit]# git add readme.txt
    [root@node1 firstgit]# git status
    # On branch master
    # Changes to be committed:
    # (use “git reset HEAD …” to unstage)
    #
    # modified: readme.txt
    #
    [root@node1 firstgit]# git commit -m “change readme.txt file one”
    [master 7cee10e] change readme.txt file one
    1 file changed, 1 insertion(+)
    [root@node1 firstgit]# git status
    # On branch master
    nothing to commit, working directory clean

    查询历史记录版本,并回退

    [root@node1 firstgit]# git log
    commit 7cee10e3c131a42e65745063c2f7266b86d88625 # 版本ID
    Author: ryan ryan@example.com
    Date: Fri Jan 17 13:43:52 2020 +0800
    change readme.txt file one
    commit d17c65406351cb0c5cb162dd8f0722d6ec5dd621
    Author: ryan ryan@example.com
    Date: Fri Jan 17 13:41:09 2020 +0800
    write a readme.txt file
    退回到指定版本:
    git reset —hard
    [root@node1 firstgit]# git reset —hard 7cee10e3c131a42e65745063c2f7266b86d88625
    HEAD is now at 7cee10e change readme.txt file one
    [root@node1 firstgit]# cat readme.txt
    hello eagles
    hello world
    [root@node1 firstgit]# git reset —hard d17c65406351cb0c5cb162dd8f0722d6ec5dd621
    HEAD is now at d17c654 write a readme.txt file
    [root@node1 firstgit]# cat readme.txt
    hello eagles
    # 记录每一次的命令
    [root@node1 firstgit]# git reflog
    d17c654 HEAD@{0}: reset: moving to d17c65406351cb0c5cb162dd8f0722d6ec5dd621
    7cee10e HEAD@{1}: commit: change readme.txt file one
    d17c654 HEAD@{2}: commit (initial): write a readme.txt file
    - 控制版本历史记录:因为git内部有个Head指针指向当前的版本,如果需要退回版本,
    只需要将Head指针指向相对应的版本号,并且更新工作区文件
    工作区 & 暂存区
    工作区: 当前所在的firstgit目录就是一个工作区
    暂存区:工作区和仓库之间一块区域
    .git: 不算工作区,只是git的版本控制库
    - 版本库中有暂存区和自动创建的master分支已经指向master的一个指针Head

    - git add: 将修改后的文件添加到暂存区中
    - git commit : 将暂存区的所有文件提交到master分支上
    - git跟踪的是每次修改而不是文件,如果不将修改添加到暂存区中是无法加入commit中的

工作区&暂存区

工作区:当前所在的firstgit目录就是一个工作区
暂存区:工作区和仓库之间一块区域
.git:不算工作区,只是git的版本控制库
版本库中有暂存区和自动创建的master分支已经指向master的一个指针head
git add:将修改后的文件添加到暂存区中
git commit:将暂存区的所有文件提交到master分支上
git跟踪的是每次修改而不是文件,如果不将修改添加到暂存区中是无法加入commit中的
image.png

撤销修改

场景1: 当你改乱了工作区某个文件的内容,想要直接丢弃工作区的修改时
[root@node1 firstgit]# cat readme.txt
hello eagles
fjklajflajdlfj
[root@node1 firstgit]# git checkout readme.txt
[root@node1 firstgit]# cat readme.txt
hello eagles
场景2: 不但改乱工作区的某个文件内容,而且添加到暂存区中,想要丢弃修改
1. git reset Head
[root@node1 firstgit]# cat readme.txt
hello eagles
fdkajafl
[root@node1 firstgit]# git add readme.txt
[root@node1 firstgit]# git reset d17c65406351cb0c5cb162dd8f0722d6ec5dd621
2. git checkout
[root@node1 firstgit]# git checkout readme.txt
[root@node1 firstgit]# cat readme.txt
hello eagles
[root@node1 firstgit]# git status
# On branch master
nothing to commit, working directory clean
场景3: 修改工作文件内容,并添加和提交了
进行版本回退即可:git reset —hard V_ID
[root@node1 firstgit]# git reset —hard d17c65406351cb0c5cb162dd8f0722d6ec5dd621

删除文件

[root@node1 firstgit]# rm readme.txt
rm: remove regular file ‘readme.txt’? y
[root@node1 firstgit]# git status
# On branch master
# Changes not staged for commit:
# (use “git add/rm …” to update what will be committed) # 先删除再提交
# (use “git checkout — …” to discard changes in working directory) # 将版本库中的最新内容同步到工作区
#
# deleted: readme.txt
#
no changes added to commit (use “git add” and/or “git commit -a”)
更新同步
[root@node1 firstgit]# git checkout — readme.txt
删除版本库中的文件:
[root@node1 firstgit]# git rm readme.txt

远程仓库

Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。有一台机器有一个原始版本库,
别的机器可 以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
1.注册Github账号 (gitee)
2.创建SSH Key $ ssh‐keygen ‐t rsa ‐C “youremail@example.com”
3.登陆Github将id_rsa.pub文件的内容添加到SHH Key页面中
PS: GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,
所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,
你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,
就可以在每台电脑上往GitHub推送了。
[root@node1 ~]# ssh-keygen -t rsa -C “ryan@example.com”
[root@node1 ~]# cd .ssh/
[root@node1 .ssh]# ls
id_rsa id_rsa.pub known_hosts

添加远程仓库

根据提示信息:
1. 在命令行创建新的仓库并关联
[root@node1 ~]# mkdir Linux
[root@node1 ~]# cd Linux/
[root@node1 Linux]# echo “# Linux” >> README.md
[root@node1 Linux]# git init
Initialized empty Git repository in /root/Linux/.git/
[root@node1 Linux]# git add README.md
[root@node1 Linux]# git commit -m “first commit”
[master (root-commit) 2e26ef4] first commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
关联:
[root@node1 Linux]# git remote add origin git@github.com:Cokeku/Linux.git
[root@node1 Linux]# git push -u origin master
The authenticity of host ‘github.com (52.74.223.119)’ can’t be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘github.com,52.74.223.119’ (RSA) to the list of known hosts.
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:Cokeku/Linux.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
2. 在命令行中关联已经存在的仓库
git remote add origin git@github.com:Cokeku/Linux.git
git push -u origin master

3. git push 命令: 把当前分支master推送到远程
echo “hello eagles” >> 1.txt
git add 1.txt
git commit -m “commit 1.txt file” 1.txt
git push -u origin master

从远程库克隆

现有的仓库:
[root@node1 ~]# git clone git@github.com:Cokeku/playbook.git
- 先前我们都是先去创建本地库然后关联远程库
- 现在最佳实践是:先创建远程库再克隆到本地
[root@node1 ~]# git clone git@github.com:Cokeku/Gittest.git
Cloning into ‘Gittest’…
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
[root@node1 ~]# cd Gittest/
[root@node1 Gittest]# cat README.md
[root@node1 Gittest]# ll -ah
total 4.0K
drwxr-xr-x. 3 root root 35 Jan 17 14:38 .
dr-xr-x—-. 9 root root 270 Jan 17 14:38 ..
drwxr-xr-x. 8 root root 163 Jan 17 14:38 .git
-rw-r—r—. 1 root root 9 Jan 17 14:38 README.md