git 切换分支_Git知识复习和常用命令整理

9e52df671354ce6e46edacc17b3f98ef.png

前置知识:命令行基础、Git的安装与配置。

【本文是个人总结与思考,若有不准确处欢迎指正。本文可能不适合Git纯小白阅读,适合接触过一点Git的人复习与查阅。纯小白可以去看文末的参考资料】

1. Git概述

Git用于版本控制多人协作等情景。

Git开源、免费,是分布式系统(每台设备上都有Git仓库的完整备份)。

2. Git基础知识

2.1 Git仓库结构

随便一个文件夹都可以建立Git仓库以进行管理,在该文件夹下执行该命令即可初始化:

git 

该文件夹下会生成一个.git子文件夹,用以存储所有的管理信息。

Git仓库结构基本如下图所示:

bd28cf6a5c8077e398c7f0433f9aafb2.png
Git仓库结构

工作区:根目录下除了.git文件夹之外的部分,即受Git管理的、实际工作的区域。

暂存区:暂时存放工作区所有的更改。暂存区即.gitindex这个文件。

版本库:记录所有的版本与分支,HEAD指向当前分支。只要Git仓库还在,提交到版本库的数据基本是不会丢失的。

贮藏栈:用于保存/恢复工作区的临时状态。

对象库:记录所有的对象(即所有数据内容。文件会被压缩,重复的文件不会再次放入)。暂存区和版本库实际记录的其实是对象库中文件的索引,即所谓的“快照”。

2.2 Git版本控制

使用Git进行版本控制的基本工作流程是:

  1. 在工作区中增加/更改/删除文件。
  2. 暂存,将文件快照放入暂存区。
  3. 提交,将暂存区的快照永久存入版本库。

版本库可以回滚暂存区和工作区,达到版本控制的目的。版本库还可以上传到远程仓库,如GitHub,以更安全地保存数据,以及方便地分享给其他人。

部分命令的数据流如下图所示:

b89dccd3cf8f1218f8b736c2756e403f.png
部分Git命令的数据流

2.3 Git文件状态

Git仓库中的每个文件有特定的状态,如下图所示:

40bb7076bf5bd7f14af74a3d3ca6dd6e.png
Git文件状态

未跟踪:工作区中的新文件,暂存区和版本库都没有。有可能丢失。所有工作区的文件不是“未跟踪”就是“已跟踪”。

未修改:工作区文件未被修改,暂存区和版本库都有。难以丢失。如果工作区中所有文件均处于“未修改”的状态,则工作区是干净的。

已修改:工作区文件被修改,暂存区和版本库只有老版本。修改部分有可能丢失。文件等待被暂存。

已暂存:工作区文件被修改,暂存区有,版本库只有老版本或没有。修改部分有可能丢失。暂存区等待被提交。

查看所有文件的状态,使用命令:

git status

例如:

f9234c830f52f7f635aa7dbb80a53118.png
文件状态查询

3. Git分支

3.1 分支简介

分支简单来说,就是版本序列的岔路。可以创建、切换、合并分支。

多人协作时,可以每个人分配一个分支,避免频繁地修改主分支。各个分支也可以设计为分管不同的功能,如用于修某个bug的分支、开发某个新功能的分支等等。

3.2 分支原理

版本是用链表的形式串起来的,新的版本指向其基于的老版本。

81316277e193669c1f869865e711b110.png
单分支

如上图所示,不新建分支的时候,版本序列就是一条线,每一个圆圈即一个版本节点,也即一次commit. master是分支名,只是一个指向该分支最终版本的游标。HEAD是指向当前工作区正在修改的版本的游标。

我可以在v4版本新建一个分支dev(developing,开发分支):

5236a04b4c84ce3f64064da93bd15625.png
新建dev分支

然后可以切换到dev分支基于v4开发v4.1(切换分支的时候,工作区必须处于干净的状态。切换分支只是改变HEAD游标):

2688189f51442ae7abc399369e631b26.png
分支切换

也可以切换回master分支基于v4开发v5:

375ff9492b6a1640521474e2a085827f.png
分叉分叉

还可以把dev分支再合并到master分支,使v4.1和v5的修改同时保留在v5.1版本:

cd8409a2aa83437801c7a7110e1657b7.png
分支合并

当然,合并分支的时候,可能会出现冲突。如果v4.1和v5版本对同一个文件的同一处进行了修改,合并的时候Git并不知道应该保留哪个修改,就会通知你去人工操作。

例如,v4.1版本把conflict.txt文件内容改成v4.1,v5版本把conflict.txt文件内容改成v5,现在将v4.1合并到v5,Git发现了冲突,展示在conflict.txt文件中:

a7811968ded811159718eabb1e45d959.png
合并冲突

现在将conflict.txt的内容改成v5.1并保存,然后重新add该文件,并commit,就解决了冲突。打印一下版本网络图,可以看到v5与v4.1合并到v5.1的情况:

d543ae3bcb5cfaca55d244f2337ab0d0.png
解决冲突

4. Git其他常见功能

只记录了几个我大致理解过的功能。(毕竟Git里的东西太多了,我也不是啥都用过或者熟悉。)

在后面的章节中暂不涵盖这些功能的命令,需要者可以自己查阅资料。

4.1 忽略文件(.gitignore)

Git可以忽略一些工作区中不想用Git管理的文件。

在工作区根目录下新建一名为.gitignore的文件,把需要忽略的文件的文件名填在其中即可。

4.2 别名(config)

即自定义以简化git的命令。

比如说,如果你不想每次提交都输入git commit这条命令,你可以定义别名,然后每次只需输入git ci即可。

4.3 标签(tag)

标签有点像一个不能移动的分支游标,用于标记重要的版本节点。版本号是经典的标签,例如v1.0,v4.

4.4 贮藏(stash)

如果工作区正在开发中,还需要很长时间才能commit,此时突然有个修复bug的任务,要求立刻切换到bug分支进行别的开发。如果此时把工作区commit,这将是一次脏的commit,开发到一半意义不明。

Git支持将工作区完整地贮藏起来,贮藏在贮藏栈里面,以后可以恢复。贮藏工作区之后,工作区会回到未曾修改的干净版本,可以切换分支。

4.5 变基(rebase)

变基可以把本地的有分叉的提交历史整理成一条直线。

5. Git常用控制命令整理

关于Git的全局帮助,见章节6. Git常用查询命令整理

命令中尖括号<>内填入相应的名称或内容,方括号[]内可填可不填。

5.1 开始新的Git仓库

新建一个本地的Git仓库:

git init

从GitHub克隆一个现成的Git仓库,远程仓库名称默认为origin:

git clone <url>

5.2 更新与提交

把新文件、已修改的文件添加到暂存区:

git add <file>

把所有被跟踪的文件(被修改、被删除,不包括新建)提交到暂存区:

git add -u
git add -update

把所有被修改以及新建的文件(不包括被删除)提交到暂存区:

git add .

把所有文件(包括新建、被修改、被删除)提交到暂存区:

git add -A
git add -all

a4f6b0eeab3ddf8de4055aaa5e71bfe3.png
多种git add

把暂存区提交到版本库:

git commit -m <message>

把工作区的全部修改提交到暂存区与版本库:

git commit -a -m <message>

把文件从工作区与暂存区删去:

git rm <file>

把文件仅从暂存区删去:

git rm --cached <file>

重命名文件,并暂存该过程:

git mv <old_file> <new_file>

1c892a6c03148b21f33105cc8bcd9339.png
部分更新与提交的数据流

5.3 撤销操作

上次提交少添加文件,或者提交信息写错,覆盖上次提交:

git commit --amend

把暂存区的文件撤回到HEAD中的状态,即取消暂存:

git reset [HEAD] <file>

把当前分支撤回到某个版本,暂存区与工作区不变:

git reset --soft <commit>

把暂存区和当前分支撤回到某个版本,工作区不变:

git reset [--mixed] <commit>

把工作区、暂存区和当前分支全部撤回到某个版本【慎用!】:

git reset --hard <commit>

把工作区的文件撤回到暂存区的状态【慎用!】:

git checkout -- <file>

把工作区和暂存区的文件撤回到某个版本【慎用!】:

git checkout <commit> <file>

16504910c3892b9a20767a29d70d8aca.png
部分撤销操作的数据流

5.4 分支操作

在HEAD处新建分支:

git branch <branch>

在HEAD处新建分支并切换到它:

git checkout -b <branch>

切换到某分支:

git checkout <branch>

把某分支合并到当前分支:

git merge <branch>

删除分支:

git branch -d <branch>

强制删除分支:

git branch -D <branch>

5.5 远程仓库操作

添加远程仓库:

git remote add <remote> <url>

远程仓库重命名:

git remote rename <old_remote> <new_remote>

删除远程仓库:

git remote rm <remote>

从远程仓库抓取所有新内容:

git fetch <remote>

从远程仓库抓取并自动尝试合并到当前所在分支:

git pull

把本地分支<branch>推送到远程仓库的对应分支,选项-u可以指定默认远程仓库:

git push [-u] <remote> <branch>

把当前分支推送到远程仓库的对应分支:

git push <remote>

把当前分支推送到默认远程仓库的对应分支:

git push

让某本地分支跟踪某远程分支:

git checkout --track <local_branch> <remote>/<remote_branch>

创建本地分支并让其跟踪某远程分支:

git checkout -b <local_branch> <remote>/<remote_branch>

删除某远程分支:

git push <remote> --delete <remote_branch>

6. Git常用查询命令整理

获取全局帮助:

git help

获取某条命令的帮助:

git help <verb>
git <verb> --help

6.1 本地

查看工作区与文件的状态:

git status

状态简览:

git status -s

查看工作区与暂存区的具体差别,即未暂存的修改:

git diff [<file>]

查看暂存区与HEAD的具体差别,即已暂存的修改:

git diff --cached [<file>]

查看工作区与HEAD的具体差别,即未暂存和已暂存的全部修改:

git diff HEAD [<file>]

查看提交历史:

git log [选项]

c2d919e0d7e06561977e882d7adaf1fa.png

查看命令历史:

git reflog

6.2 分支

查看所有分支,选项-v可以查看每个分支的最后一次提交:

git branch [-v]

查看所有设置的跟踪分支:

git branch -vv

查看已经合并到当前分支的所有分支:

git branch --merged

查看所有包含未合并工作的分支:

git branch --no-merged

6.3 远程

查看已经配置的远程仓库,选项-v可以查看url:

git remote [-v]

查看远程仓库的更多信息:

git remote show <remote>

参考资料

这个是比较专业的Git仓库结构的整理,想深入了解Git的可以看看:

Git 仓库结构 (一)*** - 江召伟 - 博客园​www.cnblogs.com
ac535c871a038f4d756840c0eb4ea301.png

这个小白有点难以看懂,不过有些东西还是值得参考,里面推荐的一些文章也不错:

Git 教程 | 菜鸟教程​www.runoob.com
cc9c90dbeb4de11d02679f12e417404f.png

这个是Git官方资料,小白可以看,资料最详尽,但是很多功能很少用,重点不突出:

Git - Book​git-scm.com
2d81ca7f896a12e25e9e03302ce9b480.png

这个教程比较通俗易懂,有详细的指导与案例,重点突出,小结也很精简,非常适合小白:

Git教程​www.liaoxuefeng.com
c1027cf16a30a47f2d7d1e24439f8698.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值