# 本地创建 git 仓库
在本地创建初始仓库,可以在项目的根路径下使用以下 git 初始化命令,建议在空文件夹下使用。
git init |
初始化后会在项目根路径下生成 .git
文件夹,保存着本地仓库的版本管理信息,在文件管理器中是默认隐藏的。
在 git 仓库中,项目的所有目录及文件可以称之为工作区。
git add . |
只添加修改或者被删除的文件变更到暂存区,不包括新文件:
git add -u |
可以多次向暂存区添加文件,提交到仓库时则只提交暂存区中完成所有变更后的文件内容。
# 提交文件到仓库当前分支
在项目进行到某一开发节点,完成该阶段所有文件的变更并提交到暂存区后,就可以将此刻暂存区的内容提交到 git 仓库的当前使用分支,git 仓库会记录文件的改动情况,并与上一个节点的文件内容进行比较,检查文件中内容变更的位置。
提交时可以附带说明,每次提交时添加说明可以在版本回退时快速找到对应的开发节点。
git commit -m "第一次改动" |
添加参数 -m
表示添加改动说明,后面双引号中的内容即是此次改动的说明内容,双引号不可省略。
# 查看仓库当前状态
仓库当前状态可以显示暂存区内容以及工作区的文件变更情况:
git status |
# 版本回退
如果文件放弃某些修改内容或者被误删,需要恢复到某一个历史版本时,就需要进行版本回退操作。
在进行版本回退前可以先查看仓库的操作历史:
git log |
在输出的 log
日志中,可以找到每次提交操作的 commit id
、说明和提交时间等信息,操作日志按照时间由近到远的顺序输出,最上方的日志显示的就是最近一次提交的信息。日志信息的行数太多时,可以在命令后面加上 --pretty=oneline
参数,每个操作的日志信息就会简化成一行显示。
找到需要回退的版本后,使用版本回退命令恢复项目的文件内容:
git reset --hard 1094ab |
1094ab
就是日志显示中对应提交操作的 commit id
前几位的字符,git 会查找到 commit id
前几位字符与给出的字符匹配的操作进行回退。命令给出的字符不建议太短,否则容易匹配到多条操作,但是 git 也没有输入完整 commit id
的要求。
命令中的 --hard
参数表示回退到对应版本已提交的状态,换成 --soft
参数则会回退到对应版本的未提交状态, --mixed
参数则回退到对应版本已添加但未提交的状态。
如果是回退到最近几次的提交版本,还可以使用版本指针的形式代替提交操作的 commit id
来进行回退。因为 git 使用 HEAD
指针指向了当前版本,如果回退到上一个版本,将版本指针指向上个版本即可,可以使用下面的命令:
git reset --hard HEAD^ |
而上上个版本可以将 HEAD^
参数换成 HEAD^^
,即往上回退多少个版本,在 HEAD
指针后添加多少个 ^
字符即可,回退的版本数较多时,建议使用操作的 commit id
,或者用 HEAD~100
(表示往上回退 100 个版本)格式的参数。
而如果回退后仍有问题,想回到未回退时的版本,这时因为版本指针不能指向回退后被丢弃的版本, git log
命令也不再显示回退后被丢弃版本的 commit id
,所以就需要 git 命令的使用日志来找到被丢弃版本的 commit id
进行恢复,使用以下命令可以查看 git 命令的操作日志:
git reflog |
在输出中找到想要恢复的版本的 commit id
,再使用 git reset
版本回退命令即可恢复。
# 撤销修改
提交到仓库以后的文件需要撤销修改时,可以进行版本回退来实现,而未提交但需要撤销工作区和暂存区的修改时,则分为以下几种情况操作:
若工作区做了修改,但未将这次修改添加到暂存区时,撤销工作区的现有修改可以使用以下命令:
git restore test.txt |
该命令会将该文件恢复到上一次提交后的内容,而工作区中在上次提交后的所有修改都会被丢弃。
而修改已添加到暂存区并需要撤销不再提交时,则需要指定文件从暂存区恢复文件,再按照上一次工作区修改但暂存区未修改的状态恢复:
git restore --staged test.txt |
命令加入 --staged
参数后表示将丢弃该文件提交到暂存区的修改,而工作区中在上次添加之后的修改仍会保留。如果还要回退,则可以使用上一条命令将文件内容继续回退到与仓库相同即可。
而如果只想取消文件在工作区中的修改,但保留暂存区中的修改,可以将 --staged
参数换成 --worktree
,此参数表示只丢弃工作区中的修改,恢复文件内容到上一次提交的状态,而不影响暂存区中已经添加的修改。
git restore --worktree test.txt |
# 删除文件
文件的删除操作在 git 系统中也视为文件的一种变更操作,因此也可以使用 git 命令管理。手动在操作系统的文件管理中将文件删除再添加和提交此次变更,或者使用以下命令来删除文件,均可以被仓库感知和记录。
git rm test.txt |
使用上述命令删除文件的同时,也会将该次删除操作添加到暂存区记录。
同理,需要恢复被删除的文件可以视为撤销该文件的修改,根据删除操作是否被添加或者提交使用对应命令进行撤销修改或者版本回退操作。需要注意的是,如果文件新增后从未添加到暂存区跟踪变更就被手动删除,这种情况下是无法恢复的。
# 绑定远程仓库
本地仓库可以绑定到远程仓库,方便文件的备份和分发。
将本地仓库关联到远程仓库可以使用以下命令:
git remote add origin git@server-name:path/repo-name.git |
其中 origin
参数是本地仓库中使用这个远程仓库时的别名,可以自定义。而 origin
参数后面的则是远程仓库 SSH
格式的 git
地址,使用该命令关联远程仓库时需要将示例地址修改为对应的 git
地址。
第一次绑定后,可以将本地仓库 master(或者 main)主分支的内容推送到远程仓库。
git push -u origin master |
在第一次推送时加入 -u
参数可以将本地仓库与远程仓库的主分支关联起来,也能简化后续的推送命令。而命令中的 master
参数是主分支名称,推送时不仅要切换到对应分支,还要注意本地仓库的分支名称与远程仓库的分支名称最好保持一致。
git 系统也可以解除本地仓库与远程仓库的绑定关系,解绑后可以重新关联其他远程仓库的地址。
在本地先查看仓库已经绑定的远程仓库信息:
git remote -v |
根据远程仓库的名称解除绑定关系:
git remote rm origin |
解除绑定关系后,之前的远程仓库并不会被物理删除,需要去远程仓库的托管平台(如 Github、Gitee 等)删除。
# 克隆远程仓库
当项目需要其他人协作或者更换了设备进行开发时,就可以从远程仓库克隆项目,获取项目的开发记录。
git clone git@server-name:path/repo-name.git |
克隆时将 git 仓库地址替换为对应远程仓库的地址即可,克隆后本地仓库的仅有远程仓库 master 分支的内容。
因为主分支通常是不在本地直接开发的,所以克隆后还需要 dev
等分支进行开发,此时应在本地创建对应分支并指定远程仓库的对应开发分支,使用以下命令:
git switch -c dev origin/dev |
这样就在本地创建并切换到了开发分支,同时还关联了远程仓库对应的开发分支,推送和拉取命令也是修改和获取开发分支的内容。
如果本地已有其他的开发分支并且未与远程仓库的开发分支对应关联,在拉取时会提示 no tracking infomation
,此时需要先建立关联:
git branch --set-upstream dev origin/dev |
# 分支管理
项目开发时,主分支的代码通常需要稳定、安全,所以开发时需要在其他分支上修改、提交,功能完成后再合并到主分支,所以项目的开发进程往往还需要管理许多主分支外的功能分支。
# 分支查看
git 系统中主要使用 git branch
命令管理所有的分支,查看项目中已有的分支可以使用以下命令:
git branch |
## 分支创建
因为 git 新版本引入了新的命令,所有创建分支有几种方式,以创建新的开发分支 dev
为例:
创建新分支:
git branch dev |
切换到新分支
git checkout dev |
也可以一条命令完成创建并切换,在旧版 git 系统中,切换命令中加入 -d
参数:
git checkout -b dev |
新版 git 系统引入了新的分支切换命令,创建并切换到新分支在新的切换命令中加入 -c
参数:
git switch -c dev |
# 分支合并
当开发分支的功能完成后,可以将开发分支的内容合并到主分支中。合并前,需要先切换到主分支:
git switch master |
上面命令是新版 git 系统的分支切换命令,也可以使用旧版命令:
git checkout master |
切换到主分支后,再合并开发分支:
git merge dev |
在合并时,如果两个分支在上一次合并前对同一处文件进行了修改,合并时 git 提示冲突,需要决定当前分支的文件内容将采用当前分支或者合并分支的内容,解决冲突后才能进行合并。
## 分支删除
当某一分支的功能开发完成不再使用时,可以将该分支删除:
git branch -d dev |
# 推送远程仓库
每次提交到本地仓库以后,决定是否推送到远程仓库,推送时必须指定分支,下面的命令表示将本地的 master
分支推送到远程仓库 origin
。
git push origin master |
# 拉取远程仓库
推送到远程仓库前,如果有其他人对远程仓库进行了提交,此时需要先拉取远程仓库的更新内容,解决与本地的冲突后,再进行推送才能成功。
git pull |
# 标签设置
除了使用 commit id
找到对应的提交外,也可以在某个重要时间节点的提交上打上标签,之后用这个标签就可以找到指定的提交。
标签默认与最新提交关联,每个重要节点及时打上标签可以便于日后调整项目内容,如果没有第一时间打上标签,也可以在命令中指定对应提交的 commit id
与标签进行绑定。
# 创建标签
在当前最新的提交上打上版本号 v1.0
,或者指定某个提交创建标签:
git tag v1.0 |
git tag v1.0 f5c6334 |
创建带有说明信息的标签:
git tag -a v1.0 -m "版本1.0" f5c6334 |
参数 -a
后输入标签名称,参数 -m
后输入需要附带的标签说明,最后则是指定标签绑定的提交的 commit id
。
因为标签与提交是绑定的,如果打上标签的提交所在的分支合并到了其他分支,那么其他分支也会出现这个标签。
# 查看标签信息
查看所有标签使用以下命令:
git tag |
查看某个标签的详细信息:
git show <tagname> |
# 推送标签到远程仓库
标签创建后只存储在本地,不会自动随着提交被推送到远程仓库,需要单独推送标签到远程仓库:
git push origin <tagname> |
可以将所有未推送过的标签一起推送到远程仓库:
git push origin --tags
# 删除标签
标签没有推送到远程仓库时,以下命令可在本地安全删除错误或者弃用的标签:
git tag -d v1.0 |
如果标签被推送到了远程仓库,则需要先在本地删除,再将空标签推送到远程仓库上:
git push origin :refs/tags/<tagname> |
命令中冒号不可省略,冒号的左边为空表示本地标签为空,而冒号右边则指定远程仓库中要删除的标签,其中 refs/tags/
为 git系统
中存储标签的路径,使用命令时,将 <tagname>
替换为要删除的标签名称即可。
# 自定义 git 命令
自定义 git 命令是指 git 系统允许为较长的命令设置别名,从而使用简单的命令完成一些常用、或者复杂连续的动作。
注意下面自定义命令的格式:
①需要简化的命令参数中没有空格,可以不用加引号
②命令参数中有引号,必须加引号
③命令参数中含有单引号,则两边加双引号
④命令参数中含有双引号,两边加单引号
当然,设置别名并不是长度越短越好,建议仍然保持简化命令的易读性,比如:
将 status
简化为 st
、 checkout
简化为 co
、 commit
设为 ci
以及 branch
改为 br
等:
git config --global alias.st status | |
git config --global alias.co checkout | |
git config --global alias.ci commit | |
git config --global alias.br branch |
其中 git config
命令就是 git 系统中调整用户或者仓库配置命令。还可以注意到以上命令中都有 --global
参数,表示修改的是全局设置,即配置后可以在当前 git 用户下的所有仓库中生效,如果不加此参数,则配置只对当前仓库生效。
另外别名前面的 alias
指的就是 git 系统配置文件中的 alias
别名配置项,本地仓库的配置可以在 .git
目录下查看 config
文件,用户的全局配置在用户主目录下的 .gitconfig
文件中,该文件是默认隐藏的,查看或者修改时要获取相应的权限。
此处再列举几个推荐设置的简化命令:
显示最近一次的提交信息,原命令为
git log -1
,简化为git last
git config --global alias.last 'log -1'
调整日志中各信息的格式和颜色,使信息更加突出,原命令非常长,可以用简化命令
git lg
代替,以下是别名设置:git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
还有一种日志信息格式和配色的调整命令,日志中将显示每个提交的 6 个信息: commit、parent commit、title、content、author、date,并且每个提交之间存在两行间隔,简化命令为
git plog
git config --global alias.plog "log --graph --date=format:'%Y-%m-%d %H:%M:%S %A' --pretty=format:'%C(bold blue)commit: %C(bold red)%h %C(#00A89A)%d %n%C(bold blue)parent commit: %C(bold red)%p %n%C(bold blue)title: %C(#A477DB)%s %n%C(bold blue)content: %C(#A477DB)%b %n%C(bold blue)author: %C(#1B92D6)%an <%ae> %n%C(bold blue)date: %C(#1B92D6)%ad %C(#4EAB00)(%ar) %n%n'"