文章目录
- 前言
- 1.git的理解
- 2.git的版本管理
- 3. git的分支管理
- 3.1 git branch
- 3.2 git branch [BranchName]
- 3.3 git checkout [BranchName] :切换分支
- 3.4 git switch (-c [BranchName])
- 3.5 git merge [BranchName]
- 3.6 git branch -d [BranchName]
- 3.7 git stash
- 3.8 git stash list
- 3.9 git stash apply [stashID]
- 3.10 git stash drop [stashID]
- 3.11 git stash pop [stashID]
- 3.12 git log --graph --all
- 3.13 git cherry-pick [commitID]
- 4. git的远程管理
- 5. git的标签管理
前言
本篇文章记录常用的git指令,并列出相应的使用示例。
该文章的主要目的是作为查询字典,随时通过目录查找对应指令,并从示例中了解使用方式。文章不涉及复杂指令以及指令中的各种复杂参数,仅记录常用且简单的git指令。
各位读者如果觉得整理的还可以,可以点赞收藏,方便随时打开查找指令。(●’◡’●)
本文内容:
- git的理解
- git的版本管理
- git的分支管理
- git的远程管理
- git的标签管理
1.git的理解
我个人对于git有以下几点的理解,分别是:
- git本身不存储全部代码,而是保存每次提交的代码快照(代码改变的内容),通过恢复快照来实现代码的版本管理。
- git中存在四个区域,分别是本地工作区(WorkSpace),缓存区(Index),本地仓库区(Repository),远程仓库区(Remote),其中本地工作区就是本地代码所在位置,缓存区用来存储修改后的代码快照,本地仓库区用来存储缓存区递交过来的代码快照,远程仓库区是用来在远程服务器存储自己代码,并进行版本控制。
- 切换分支的时候,本地工作目录的文件和代码是会变的。
- git四个区域的相互转化可以通过下图中的命令来实现,(图片来自网络):
- git clone指令和pull指令的区别,clone是本地没有repository时,将远程repository整个下载过来。pull是本地有repository时,将远程repository里最新的commit数据下载过来,并且与本地分支合并。
- git用来控制版本主要通过HEAD指针来实现,其中HEAD指针会指向当前分支最新的提交。默认分支为master。具体理解可以如下图所示:
2.git的版本管理
2.1 git config 配置/查看
git config 配置文件共有三个,分别对应三个等级。位置如下(在windows下):
软件配置文件:(git的安装位置)/Git/etc/gitconfig
全局配置文件:C:user/(用户名)/.gitconfig
项目配置文件:(项目位置)/.git/config
软件配置文件针对全局用户,全局配置文件针对当前用户,项目配置文件针对当前项目。
当使用git时,配置文件会逐级覆盖,项目配置文件的内容覆盖全局配置文件的内容,然后再覆盖软件配置文件的内容。(重复内容覆盖,不重复内容增添)
2.1.1 git config --global user.name [userName]
-
作用:
在全局配置文件中添加git用户名字。[userName]表示用户设定的名字。
全局配置文件位于C:user/(用户名)/.gitconfig。 -
示例:
在C:user/(用户名)/.gitconfig文中的展示如下(这是我已经添加好的,读者主要参考name那一栏)。
2.1.2 git config --global user.email [Email]
-
作用:
在全局配置文件中添加git用户邮箱。[Email]表示用户设定的邮箱。
全局配置文件位于C:user/(用户名)/.gitconfig。 -
示例:
在C:user/(用户名)/.gitconfig文中的展示如下(这是我已经添加好的,读者主要参考email那一栏)。
2.1.3 git config --list
-
作用:
查看当前全部的配置内容(覆盖后的结果)。 -
示例:
2.1.4 git config --list --show-origin
-
作用:
查看当前配置文件的内容以及其文件所在位置 -
示例:
2.1.5 git config --global alias.[anotherName] “[orgCommandLine]”
-
作用:
给已知的命令起别名,[anotherName]是用户设定的别名,[orgCommandLine]是需要改名的命令。 -
示例:
用字符"l"来代替,config --list命令。使用方法如下图:
此时,修改后的配置文件也更新为:
2.2 git 项目的建立和管理
2.2.1 git init
-
作用:
对项目进行git初始化,即当前路径下添加git服务,实现对当前路径下文件的版本控制。 -
示例:
此时,在当前路径下就会出现.git文件夹(里面存储了项目配置,快照,指针等相关文件)。
2.2.2 git status
-
作用:
查看当前项目的状态。
包含index区中的内容,被修改的内容,没有被追踪的内容。 -
示例:
为了更好的理解,用我另一个项目中的git status进行解释:
2.2.3 git add [fileName]
-
作用:
添加文件到index工作区。[fileName]是需要被添加的文件名。 -
示例:
2.2.4 git commit (-m “此次提交的描述”)
-
作用:
将index区中的内容一次性提交到本地仓库中。-m参数后为此次commit的描述,建议写上。 -
示例:
2.2.5 git log (- [num])
-
作用:
显示之前commit命令的历史记录。如果后面加 - [num],则只展示倒数第 [num]次的提交记录。
只显示当前分支的历史记录,其他分支的历史记录不显示。分支的概念见 "3.git的分支管理"
-
示例:
此时,为了显示更多历史记录,我们创建一个readme.md文件,并进行commit。
当在git log 后添加 - [num]指令后,示例如下:
2.2.6 git reflog
-
作用:
记录git的每一次commit命令. -
示例:
2.2.7 git diff
-
作用:
如果被追踪过的文件(包含被add到index区的文件和被commit后的文件)发生修改,则可以通过git diff命令查看修改的内容。 -
示例:
此时readme.md中的文件内容如下图:
我们对其内容进行修改,结果如下图:
通过git diff命令查看修改内容,示例如下:
2.2.8 git reset
-
作用:
用来重置到指定版本。
方式有两种,分别如下:
1 git reset --hard HEAD^
(^表示上个版本, ^^表示上上个版本,以此类推。当然如果回退版本过多,则使用~[num]的形式,例如回退100个版本,则为HEAD~100)
2 git reset --hard [CommitID]
[CommitID]指的是commit提交时的ID
-
示例:
首先,将修改readme.md进行commit。
但是,此时发现最新commit提交的内容有问题,则进行上个版本回退:
也可以通过commitID回退到指定版本,如下图所示:
2.2.9 git checkout [fileName]
-
作用:
将版本库中的 [fileName]文件覆盖当前工作区中的 [fileName]文件(没有会重新创建),无论是当前工作区的 [fileName]文件是被修改还是被删除,都会被还原。
注意这个命令很危险,当前文件的任何修改都会被复原,需要慎重。
-
示例:
把readme.md中添加新的一行。
通过checkout来一键还原。
2.2.10 git commit --amend
-
作用:
这个命令同样会将index区的内容提交,但是不会显示上次commit的历史。
这个命令的作用就是保证commit的历史记录不会太乱。
-
示例:
原始log记录为:
通过commit --amend 来提交,其中通过git log不会显示上个commit的记录,如下图所示:
但是git reflog可以完全显示所有的log
2.2.11 git rm [fileName]
- 作用:
将指定文件从暂存区和工作区中删除,[fileName]为文件名。
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f。
[未被追踪的文件,无法被git删除。]
- 示例:
3. git的分支管理
3.1 git branch
- 作用:
查看分支状况。
当前分支前面会标一个*号。
- 示例:
3.2 git branch [BranchName]
-
作用:
如果在git branch后添加[BranchName],则代表创建名字为[BranchName]的新分支。 -
示例:
3.3 git checkout [BranchName] :切换分支
-
作用:
切换指定分支。 -
示例:
3.4 git switch (-c [BranchName])
-
作用:
切换指定分支。
如果添加(-c [BranchName]),则表示创建新分支并切换。
checkout不仅具有切换分支功能,还具有回溯文件的功能,为了避免误用,才有switch这个新命令。
-
示例:
切换分支功能。
创建分支并切换。
3.5 git merge [BranchName]
- 作用:
git merge命令用于合并 指定分支到当前分支。默认是fast forward模式。
git合并分支很快,就改指针指向,工作区内容也不变。合并后原始分支还存在。
不使用Fast forward模式,merge合并不会指向被合并的分支,而是重新创见一个新的合并后分支。
git merge bug2 --no-ff, 其中--no-ff指的是强行关闭fast-forward方式。
- 示例:
先创建新的分支。
切换到master分支,如下图所示:
合并指定分支(下图中指的是bug2)到当前分支中。
3.6 git branch -d [BranchName]
-
作用:
删除指定分支。 -
示例:
3.7 git stash
-
作用:
保存工作现场。当需要临时切换分支来解决别的问题,但本地工作还未完成无法提交时,可以通过git stash命令来临时保存工作现场。等处理完分支内容后,再恢复现场继续工作。
切换分支后,本地临时修改的文件或者添加的文件都会丢失(除非commit),所以需要存储现在的工作环境。
-
示例:
当前的工作环境如下图所示:
此时readme.md被修改了,我们就需要通过git stash来存储工作环境,如下图所示:
3.8 git stash list
-
作用:
查看被存储的工作环境。 -
示例:
其中stash@{0}为存储现场的ID。
3.9 git stash apply [stashID]
-
作用:
恢复被存储的工作环境。 -
示例:
3.10 git stash drop [stashID]
-
作用:
删除被存储的工作环境。
通过git stash apply恢复后,原本被存储的stash@{0}还存在。
-
示例:
3.11 git stash pop [stashID]
-
作用:
恢复工作现场,并删除stash中存储的工作现场。 -
示例:
3.12 git log --graph --all
-
作用:
以树状图的形式,查看全部分支的记录。
切换分支后,工作区的文件也会改变。
-
示例:
3.13 git cherry-pick [commitID]
- 作用:
git cherry-pick命令的作用,就是将指定的commit内容合并到当前分支中。可以参考下图来理解:
a=>b=>c (HEAD=>master)
|
d=>e=>f (feature)git cherry-pick e
a=>b=>c=>e (HEAD=>master)
|
d=>e=>f (feature)
- 示例:
4. git的远程管理
4.1 git remote -v “查看远程库的信息。”
-
作用:
查看远程库的信息。 -
示例:
4.2 git remote rm [branchName] “删除现有的远程仓库。”
-
作用:
删除现有的远程仓库。 -
示例:
如果出现error: remote origin already exists.
则表示远程仓库分支存在,需要删除后再进行后续操作。
4.3 git remote add [branchName] [url]
-
作用:
添加远程仓库。 -
示例:
首先,在github上创建一个空的repository。
然后,通过git remote add添加远程仓库,如下图所示:
4.4 git push [远程分支名] [本地分支名]
- 作用:
将本地仓库的内容推送给远程服务器中。
orgin是远程仓库分支名字
master是本次仓库分支名字
- 示例:
此时远程仓库的内容为空。
推送完后,远程仓库的就会保存当前分支下最新commit的结果,如下图所示:
4.5 git clone [url]
-
作用:
把远程仓库中的代码clone到本地工作区上。clone指的是本地没有repository时,将远程仓库中的所有内容(日志,分支等)下载到本地。 -
示例:
创建一个空的文件夹,如下图:
通过git clone指令把远程仓库中的内容全部下载下来,首先找到对应远程仓库的url,如下图:
通过git clone命令进行下载,如下图:
clone后的仓库中,包含之前所有的commit版本。
4.6 git pull [url]
-
作用:
从远程仓库中的代码拉到本地工作区上。与clone不同的是,pull指的是本地有repository时,将远程仓库中的最新的commit内容下载到本地,并合并到当前分支。 -
示例:
我们把clone的内容全部删掉,并使用git init进行初始化。
然后通过git pull来下载远程仓库中最新的commit数据,如下图:
4.7 git checkout -b [本地分支] [远程分支]
-
作用:
创建本地分支,并合并远程分支到本地。 -
示例:
5. git的标签管理
5.1 git tag [tagName] [commitID]
-
作用:
给最新提交commitID进行一个重命名,方便管理。 -
示例:
5.2 git show [tagName]
-
作用:
查看标签的文字说明。 -
示例:
5.3 git tag -d [tagName]
-
作用:
删除标签
创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
-
示例:
5.4 git push origin [tagName]
- 作用:
推送某个标签到远程仓库中。
git push origin --tags
一次性推送全部尚未推送到远程的本地标签
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d remove
然后,从远程删除。删除命令也是push,但是格式如下:
git push origin :refs/tags/remove
- 示例:
此时远程仓库中就存在了新的tag,如下图所示: