分布式版本控制 - Git 使用技巧

    分布式版本控制系统  Git 

      一、git介绍:

      Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

    分布式版本管理:多个贡献者本地都有完整的控制版本功能,可进行版本管理。且通过一个版本服务器共享彼此的代码。 是本地化和集中化的汇总。好处:没有单点问题,不强制依赖服务器,不强制依赖网络环境。典型工具 如  Git  。

     二 、如何安装:

             管网下载: https://git-scm.com/  

Git安装除了安装位置外,其他一直下一步即可。

# 安装后,打开cmd ,自报家门
# 如下信息会在提交代码时要使用,记录在你的每次提交中。以后才知道哪次提交是谁做的,"git log"可以查看
# 执行:
git config --global user.name "Your Name"  #用户名
git config --global user.email "[email protected]"  #邮箱
# 查看信息
git config -l 

测试:cmd中执行 git version 查看git版本

二、 仓库

对应的就是一个目录,这个目录中的所有文件被git管理起来。

以后会将一个项目的根目录,作为仓库。

仓库中的每个文件的修改、删除 git都能跟踪。

三、git基本指令 

       

创建版本仓库:创建一个文件夹,cmd指向该文件夹,然后执行 git init 即可

.git目录 保存仓库的所有内容

新增文件:在文件夹中创建一个文件: xx.txt ,然后cmd执行该文件夹,

执行 git add xx.txt 增加一个文件

git add xx.txt xx2.txt 增加多个文件

git add abc 增加当库目录下的abc目录中的所有文件

git add . 增加库目录中所有文件

提交文件:git commit -m "this is a test file"【-m 后是对本次提交的描述】【提交添加的所有文件】

          git commit hello.txt hello2.txt -m "this is a test file" 提交某些文件

          git commit -a -m "this is a test file" 自动add并commit所有已跟踪并修改或删除的文件

文件状态: git status 在提交后,如果文件有改动,可以看到

文件改动:git diff hello.txt 查看该文件的改动情况

注意:每次对库中内容改动后,都需要 add 和 commit操作,同步git,git中会记录当前仓库的快照(版本)。

删除文件:git rm hello.txtgit commit hello.txt -m "xxx" 即可

帮助:git help commitgit commit --help

   日志 - 提交历史:

每次 commit,随着版本的记录,也会留下日志。

执行:git log # 显示从最早的提交点 到 当前提交点的 日志

git log --oneline               #简洁日志显示

git log --oneline -2         #简洁日志显示,最近2次提交日志 ​

git log --oneline --graph      #图形化显示分支走向

 

    #   commitID                                               描述
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append xxx
e475afc93c209a690c39c13a46716e8fa000c366 add words
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 add one line

注意git的 commitID 是通过SHA1计算出来的一个非常大的数字,用十六进制表示,在分布式中保证唯一。

  版本回退:

 每次的修改文件并add、commit 。git中也会记录一个版本。如果有需要可以回退到之前的一个数据版本状态。

执行:git reset --hard HEAD~ # 回退到上一个版本

git reset --hard HEAD~~ # 回退到上上一个版本

git reset --hard HEAD~5 # 回退到上5个版本

执行:git rest --hard e475a #回退到commitID 为 "e475a..."的版本, commitID可以只写前几位,唯一即可

总结:

          1> 每次commit,git都会保留一个版本,每个版本都有一个全局唯一的commitID

          2> git有个游标:HEAD,指向当前的版本,所以可以移动游标来回退版本

          3> 也可以通过 commitID 回退到某个版本

          4> 回退并不会删除任何版本,所以版本间可以来回切换

细节:发生版本回退后,通过 git log 只能看到最原始提交点 至 当前提交点的 日志。git reflog 可以看全部日志

四、架构

版本库:工作区中有一个隐藏目录 .git,这个目录不属于工作区,而是git的 版本库,是git管理的所有内容

暂存区:版本库中包含一个临时区域,保存下一步要提交的文件。

分支:版本库中包含若干分支,提交的文件存储在分支中

如下图:

分布式版本控制 - Git 使用技巧

   1、文件首先出现在工作区,如果需要有git管理,则通过 git add xx 将文件添加到暂存区 通过 git commit ... 将暂存区的文件一次性提交到分支中 同时提交行为将触发git的一次commit日志记录。

   2.关于分支是git的一个重要概念,master分支是安装git时默认创建的    。

  五、文件状态

切换到某分支,在工作区操作其文件,文件的状态会有如下可能:

  • 未跟踪

    • 工作区中新创建的文件,git中并未保存它的任何记录

    • git add 增加到暂存时,即可建立跟踪

  • 修改

    • 已跟踪的文件,在工作区被修改了。

  • 暂存

    • git add 的文件,处于暂存状态。

    • 每次暂存的是文件的当时状态,如果暂存后又做了修改,需要再次 git add文件。

    • 每次提交时,是将所有暂存的文件提交。

  • 提交

    • git commit 的文件,处于提交状态。

    • 每次提交,增加一个快照版本,分支指针后移,指向最新版本。

3.3 文件状态查看

在工作区中一系列操作后,要查看文件状态:

执行:git status 可以看到文件状态:

On branch master #分支 master

Changes to be committed: #说明有内容在暂存区可以提交

(use "git reset HEAD <file>..." to unstage)

modified: hello.txt

On branch master #分支 master

Changes to be committed: #说明有内容在暂存区可以提交

(use "git reset HEAD <file>..." to unstage)

modified: hello.txt

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: hello.txt

细节:通过git diff 比对变动情况:

git diff hello10.txt 比对工作区和暂存区(若暂存区没有,比分支)

git diff HEAD -- hello10.txt 比对工作区和分支中的最新结果 ( 了解或忽略此点 )

git diff --staged hello10.txt 对比暂存和分支中的最新结果 ( 了解或忽略此点 )

坑:-- hello10.txt之间需要分隔,不能写成--hello10.txt

撤销修改  、

工作区撤销 : 

执行:git checkout -- hello9.txt 可以撤销到最近一次 git add 或 git commit 的状态

即:如果 暂存区有此文件,则将暂存区中的文件内容恢复到工作区。 如果 暂存区没有此文件,则将分支中的文件内容恢复到工作区。

注意:-- hello9.txt 一定不能少写 --,否则就是其他语意啦。

暂存区撤销:

如果在工作区中修改了文件并发送到暂存区中,但文件中有需要撤销的内容

则可以执行:git reset HEAD hello9.txt 将hello.txt在暂存区的内容清除。

然后可执行:git checkout -- hello9.txt 回退到上一个版本