Git的基本命令及分支理解存在的问题

  • Post author:
  • Post category:其他




Git的基本命令



Git的四个工作区域

  1. Remote:远程仓库

  2. Repository: 本地仓库

  3. Index: 暂存区

  4. Workspace: 工作区

    pull

    fetch/clone

    push

    checkout

    commit

    add

    Remote

    Repository

    Index

    Workspace

  5. 执行

    git init

    初始化库。

  6. 通过

    git config --global user.name XXX

    以及

    git config --global user.email XXXX

    设置用户签名


  7. git status

    查看仓库状态


  8. git reflog

    查看版本信息


  9. git log

    查看版本详细信息

  10. 创建好文件

    hello.txt

    后:


  11. git add hello.txt

    将文件追踪到暂存区


  12. git commit -m "first commit" hello.txt

    提交第一个版本到本地仓库


  13. git reset --hard 7位版本号


    穿梭回对应版本(head指针指向该版本)



Git的分支

命令 function

git branch 分支名
创建分支

git branch -v
查看分支

git checkout 分支名
切换分支

git merge 分支名
把指定分支合并到当前分支


e.g. 我在master分支上创建并commit了第一个版本,在hot-fix分支上修改了这个版本


当master分支只有一个版本时

此时创建新分支

hot-fix

,版本信息中

head

指针变为指向两个分支,个人认为此时两个分支下共享同一个版本

在这里插入图片描述

此时在

hot-fix

分支下进行文件内容修改,是可以切换回

master

分支的,且

master

分支下文件内容改变,查看版本信息,两个分支下的版本相同,

head

指针仍然指向两个分支。

在这里插入图片描述


git add

后,修改后的文件被送入暂存区,版本信息不变,

此时仍然可以

git checkout

切换分支

在这里插入图片描述

切换到

hot-fix

后,

commit

之后,

hot-fix

视角下查看版本信息,发现版本改变,共有两个版本,当前

head

指向

hot-fix

下的新版本

在这里插入图片描述

而当我们再次切换回

master

分支,查看版本信息时,该分支只显示最初

commit

的**“first commit”**版本,

head

指向

master

分支下的该版本。

在这里插入图片描述

此时在

master

分支下,我们再次修改文件,并尝试

git checkout

切换,结果如下,这时已不能切换,提示信息要求我们在修改信息后

git commit



git stash

才能切换。

在这里插入图片描述

我们

commit

文件后,

master

显示两个版本:

在这里插入图片描述

切换到

hot-fix

,依然显示之前的两个版本:

在这里插入图片描述


个人理解与不懂的地方


head

是一个指向分支的指针,当

master

只有一个版本时创建新分支,此时显示的是**

HEAD ->master,hot-fix

,这点是不太理解的**,指针不该只指向一个分支嘛,此时的版本是两个分支共享的,在一个分支修改文件后可以不经过

add,commit

便切换到另一个分支,且分支的文件同步改变,难道是在

master

分支时指针指向为

head->master->hot-fix->commit的文件

,当切换到

hot-master

分支后改变指针指向为

head->hot-fix->master->commit的文件

搜素相关内容,发现

工作区和缓存区内容是公共的,不从属于任何一个分支

,所以可以理解切换分支时内容同步改变,但是当再次

commit

一个版本后,两个分支便不再“共享”最初的版本,此时再尝试在一个分支中修改但不

add,commit

文件,便无法切换分支。

看了看四个工作区域的图,感觉又理解了一些,

个人理解

每次

git checkout

时都会从对应分支读取文件到工作区,起初时刚创建新分支时,由于新分支没有文件,此时两个分支的版本是“共享”的,切换分支时不会覆盖掉工作区文件;而在新的分支

commit

新版本后,两个分支开始独立,每次切换分支会将该分支的当前版本读取到工作区进行覆盖,所以在工作区修改文件但未

commit

就进行

checkout

时会进行判断和阻拦。(不知道对不对,并且还是不清楚最初”共享”的机制是不是上文理解的改变指针指向)



版权声明:本文为SwaggyYhy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。