本篇,我们来讲一下Git的相关概念以及基本使用方法。
什么是Git?简单来说,Git是一个开源的分布式版本控制系统,可以高效的解决项目版本管理的问题。
基本概念
Git中的区域划分:
- Workspace:工作区,就是平时进行开发改动的地方,是当前看到最新的内容。开发的过程也就是对工作区的操作。
- Index:暂存区,暂时存放未提交的内容。当执行
git add
的命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中哪些内容是被 Git 管理的。当完成某个需求或者功能后想要提交代码,第一步就是通过git add
添加到暂存区。 - Repository:本地仓库,位于自己的电脑上。通过
git commit
提交暂存区的内容,会进入本地仓库,并生成一个版本。 - Remote:远程仓库,即用来托管代码的服务器。远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改,本地仓库的代码可以通过
git push
命令同步到远程仓库。
常用命令
注: 相关命令均为在项目根路径(即.git文件夹所在路径)下使用
注:git <命令> --help
查看指定命令的帮助文档
基本配置
首次使用,要全局配置用户名及邮箱信息(仅配置一次即可)
- 配置用户名:
git config --global user.name '用户名'
- 配置用户邮箱:
git config --global user.email '邮箱'
注:全局配置文件位置:C:\Users\用户\.gitconfig
git config --list
列出所有配置项
本地操作
注:git stash中临时保存的修改
,工作区、暂存区的修改
,以及本地仓库中的内容
在电脑关机重启后都仍然存在。它们都是保存在当前项目下,不同的项目之间都是相互独立的。
基本操作
初始化项目
git init
在项目中初始化Git,让Git管理当前项目
查看状态
git status
检查当前文件状态
# 工作区新建的文件,还没有被git管理(需要add到暂存区后才被git管理)
Untracked files
# 文件位于工作区
Changes not staged for commit
# 文件位于暂存区
Changes to be committed
# 工作区及暂存区都没有修改后未提交的文件
nothing to commit, working tree clean
git add
git add <file1> <file2> ...
将工作区的指定文件添加到暂存区git add .
将工作区更改的所有文件都添加到暂存区
注:git add
后,工作区和暂存区的内容是一致的
git commit
git commit
提交暂存区的改动到本地仓库,生成版本(会新开编辑器来输入描述信息)git commit -m '描述信息'
提交暂存区的改动到本地仓库,生成版本git commit <file1> <file2> ... -m '描述信息'
提交暂存区的指定文件到本地仓库,生成版本git commit -am '描述信息'
等同于git add . && git commit -m '描述信息'
git commit --amend -m <描述信息>
使用一次新的commit,替代上一次提交(如果代码没有任何新变化,则用来改写上一次commit的提交信息)git show <版本号>
显示某次提交的内容变化
注:git commit
后,暂存区和本地版本库的内容是一致的
查看记录
git log
查看提交记录git log --oneline
以一行的方式查看提交记录git log --oneline --graph
以一行、图形化的方式查看提交记录git reflog
查看全部历史操作记录(包括被git reset
“丢弃”的版本)
差异比较
git diff
比较当前工作区与暂存区的差异git diff <filename>
比较指定文件在工作区与暂存区的差异git diff HEAD
比较工作区与当前分支最新commit(即本地库最近一次版本)之间的差异git diff --cached
比较暂存区与本地库最近一次版本的差异git diff --cached <filename>
比较指定文件在暂存区与本地库最近一次版本的差异
撤销更改&版本重置
git checkout .
撤销所有工作区的修改,使之与恢复到与暂存区一致的状态git checkout <filename>
撤销指定文件在工作区的修改,使之与恢复到与暂存区一致的状态git reset
撤回所有暂存区的文件到工作区git reset <filename>
撤回指定的暂存区的文件到工作区git reset --soft <版本号>
重置本地仓库中的代码到指定版本git reset --mixed <版本号>
重置本地仓库和暂存区的代码到指定版本。为默认行为,等价于git reset <版本号>
git reset --hard <版本号>
重置本地仓库、暂存区和工作目录的代码到指定版本。注意:会覆盖正在开发的代码
分支操作
使用多分支可以同时推进任务的开发,提高开发效率;并且即使某一个分支开发出现问题,也不会对其他分支产生影响。如下表示当前处于master分支。
查看分支
git branch
查看本地分支git branch -r
查看远程分支git branch -a
查看本地和远程分支git branch -v
查看分支及各个分支最后一个提交对象的信息(同样可以-va
、-vr
等命令连用)
创建&切换&删除分支
git branch <分支名>
在当前分支的节点上创建新的分支git checkout <分支名>
切换到指定分支git switch <分支名>
切换到指定分支,v2.23.0版及以后可用git checkout -b <分支名>
创建并切换到新建分支git branch -d <分支名>
删除指定分支
合并分支
git merge <分支名>
将指定分支合并到当前分支
注: 合并分支时,要先切换到最终要合并到的分支,再合并。
注: 在两个不同的分支中,如果对同一个文件的同一个部分进行了不同的修改,则合并分支时会产生冲突。此时需要人为解决冲突后再重新提交一次。
stash临时存储
如果当前工作区或暂存区存在未提交的修改,则无法切换分支。所以当我们想把当前修改应用到其他分支时或当我们需要切换到其他分支完成某些任务但又不想立即提交眼前已经修改的代码时,可以先用git stash
命令先把工作区及暂存区已经修改的文件临时保存起来,然后再进行分支切换。之后再根据具体情况,在合适的时机从stash
中恢复刚刚保存的内容。
git stash
把本地的改动(工作区或暂存区的改动)临时存储起来git stash pop
应用最近一次临时存储的修改,并删除存储记录git stash save "message"
执行存储时添加备注git stash list
查看stash的存储列表git stash apply
应用最近一次存储的修改,但不会把存储从存储列表中删除git stash apply stash@{index}
应用stash中标号为index的修改,不会把存储从存储列表中删除git stash clear
清空stash缓存
对于分支的推荐使用方式
- master分支: 在master分支上只保留完全稳定的代码,一般不直接修改其代码;
- dev分支: 在dev分支上做开发,一般保存最新完成及bug修复后的代码,最终合并到master分支上;
- hotfix分支: 在hotfix分支上做紧急修复,最终合并到master分支及dev分支上;
- feature分支: 在feature分支上开发新功能,一般以dev分支为基础创建feature分支;
- …: 还可以有更多分支。
远程操作
注: 如果还没有远程仓库,则需要先在远程仓库服务器上创建一个远程仓库;常用的远程仓库服务器有GitHub、Gitee。也可以使用开源项目GitLab搭建自己的远程仓库服务器。
git clone
远程操作的第一步,通常是从远程主机克隆一个版本库,这时就要用到git clone
命令。
git clone <版本库URL>
在本地主机生成一个目录,与远程主机的版本库同名git clone <版本库URL> <本地目录名>
在本地主机生成一个目录,指定与远程主机的版本库不同的目录名
git remote
为了便于管理,Git可以为远程主机指定主机名。git remote
命令就用于管理主机名。
使用git clone
命令克隆版本库时的远程主机会默认被Git命名为origin。
主机名与URL的对应关系存储在当前项目的.git/config
文件中。
git remote
列出所有远程主机git remote -v
查看远程主机的网址git remote show <主机名>
查看指定主机的详细信息git remote add <主机名> <网址>
添加远程主机git remote rm <主机名>
移除远程主机git remote rename <原主机名> <新主机名>
对远程主机进行重命名
git fetch
一旦远程主机的版本库有了更新,需要将这些更新取回本地,这时就要用到git fetch
命令。git fetch
命令通常用来查看其他人的进度,因为它取回的代码对你本地的开发代码没有影响。
git fetch <远程主机名>
将某个远程主机的所有更新,全部取回本地。git fetch <远程主机名> <分支名>
取回某个远程主机的指定分支的更新
git fetch
取回的更新,在本地主机上要用远程主机名/分支名
的形式读取。比如origin主机的master分支,就要用origin/master
读取。
$ git branch -r
origin/master
$ git branch -a
* master
remotes/origin/master
# 以上结果表示:本地主机的当前分支是master,远程分支是origin/master。
$ git checkout -b newBrach origin/master
# 在远程分支origin/master的基础上,创建一个新的本地分支newBranch
$ git merge origin/master
# 在当前分支上,合并远程分支origin/master
git pull
git pull
命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull <远程主机名> <远程分支名>:<本地分支名>
取回远程主机某个分支的更新,再与本地的指定分支合并。比如git pull origin next:master
表示 取回origin主机的next分支,与本地的master分支合并。如果远程分支是与当前分支合并,则冒号后面的部分可以省略,写成git pull origin next
实质上,git pull
等同于先做git fetch
,再做git merge
。比如git pull origin next
相当于git fetch origin next && git merge origin/next
注:没有本地仓库的时候,用git clone
;已经有本地仓库,更新的时候用git pull
git push
git push
命令用于将本地分支的更新,推送到远程主机。它的格式与git pull
命令相仿。
git push <远程主机名> <本地分支名>:<远程分支名>
将本地指定分支的更新,推送到远程主机指定分支git push <主机名> --delete <远程分支名>
删除指定主机的指定分支
注:将本地仓库推送到远程仓库需要权限。仓库创始人默认有权限,其他人需要先加入团队,才能推送。
- 注意:如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,
- 注意:分支推送顺序的写法是
<来源地>:<目的地>
,所以git pull
是<远程分支>:<本地分支>
,而git push
是<本地分支>:<远程分支>
。
追踪关系
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone
的时候,所有本地分支默认与远程主机的同名分支建立追踪关系,比如本地的master
分支自动追踪origin/master
分支。
如果当前分支与远程分支存在追踪关系,git pull
就可以省略远程分支名。
比如git pull origin
表示本地的当前分支与origin主机上相对应的"追踪分支"(remote-tracking branch)进行合并。
git push
如果省略远程分支名,则表示将本地分支推送至与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
比如git push origin master
表示将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all
选项。
比如git push --all origin
表示,将所有本地分支都推送到origin主机。
推荐做法
- 每天开始工作时,都应该从远程仓库拉取最新的代码
- 每天工作完,都应该把代码推送到远程仓库
- 如果使多人协作开发,则每次推送前需要先拉取
为他人的项目贡献代码
- 把想贡献代码的仓库
fork
到自己的远程仓库; - 在自己的远程仓库做提交;
- 完成后通过Pull Request向对方贡献代码(需对方审核)
.gitignore文件
.gitignore
文件是一个用于指定哪些文件不需要Git管理(即Git要忽略哪些文件)
的文件。示例如下。
# 此为注释
# 忽略指定文件,不让Git管理
test.html
# 忽略所有文件名是test的文件,不管后缀是什么
test.*
# 忽略所有后缀名为.a的文件
*.a
# 但lib.a除外
!lib.a
# 忽略node_modules目录下的所有文件
node_modules/
# 忽略doc/目录下的所有后缀名为.a的文件(会忽略doc/abc.txt但不忽略doc/server/abc.txt)
doc/*.txt
# 仅仅忽略项目根目录下的abc.def文件,不包括subdir/abc.def
/abc.def
# 注:Git管理的是文件,空目录会自动被Git忽略掉
至此,Git的一些基本使用就介绍完了,希望大家看了后有所收获 ~
如有疏漏之处欢迎评论区留言指正哦 ~