介绍
git是一个版本控制系统,是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。它可以做到让你的文件或者整个项目回到某个时间点时的状态、比较文件修改的差异细节,知道具体是谁更改了文件等功能。常用的代码管理仓库如gitee、github。
安装
mac环境下安装:
- 使用homebrew,直接在命令行跑
brew install git
; - 使用 Xcode Command Line Tools安装,在 Terminal 里运行 git 命令
git --version
,如果没有安装过命令行开发者工具,将会提示你安装;
win环境直接去官网下载安装包可能会很慢不过还是放在这git官网,这里提供一个下载源git安装包选择合适的版本下载就行,速度比较快。
初始配置
// git命令查阅,介绍两种方式
$ git help <verb> // ===> 如git help config 获取config命令的使用手册
$ git <verb> --h // ===> 如git add --h 获取add命令的快速使用参考
// 第一步需要配置名字和邮箱(对应你绑定的gitee或者github账号),--global是全局
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
// 检查你的配置列表
$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...
// 查看单个配置
$ git config user.name
John Doe
复制代码
流程
一张nice的图(讲git的文章随处可见我也是窃的)清晰的解释了git的工作流程:
Remote(远程仓库)
- 我们存储代码的远程仓库,本地仓库修改好代码后推送(git push)到远程仓库;
- 克隆(git clone)别人的项目仓库到本地
- fetch拉取远程的仓库更新本地仓库
Repository(本地仓库)
- 通过commit将本地代码的修改存储到本地仓库
index(暂存区)
- 通过add提交改动的文件临时存储地,可撤销可存入本地仓库
woekspace(工作区)
- 我们在本地进行开发,修改时操作的就是工作区
生成git仓库
想玩git,肯定先得有个仓库,一般生成git仓库就2种情况:
-
将尚未进行版本控制的本地目录转换为 Git 仓库;
- 在当前目录路径下用命令行工具执行
git init
初始化,会生出一个.git文件 - 然后就可以执行git命令追踪你的文件修改
- 再关联到远程分支就可以直接提交
- 在当前目录路径下用命令行工具执行
-
从网上克隆一个已存在的仓库。
- 命令行使用git clone //url就是远程仓库的地址
- https地址直接就clone,ssh地址需预先配置ssh key(后面会说)
基操
日常操作也就酱紫:
- 初始化git仓库(git init)
- 本地开发,修改;
- 添加本次改动到暂存区(git add)
- 提交改动到本地仓库(git commit)
- 拉取远程仓库的代码(git pull拉取与本地合并)
- 推送到远程仓库(推送到远程仓库)
然后举个?,实操一下,顺带具体说下每个命令的日常使用
git init(初始化一个git本地仓库)
打开命令行工具进入你的工作目录下,这时候有人要说了诶我没有,就是玩儿wdnmd。
没有就直接新建(建议先搞练手的文件)
如图我首先是建了个空文件夹git-test,然后进入文件夹执行git init
,执行完命令会告诉你已将创建好了一个空的git本地仓库,然后生成一个隐藏的.git文件夹,我这边直接命令行查看了,当然如果你的文件夹里面已经有内容操作也是一样的。接下来我们开始对新建或者修改文件夹里面的内容并使用git status
命令查看我们workspace(工作区)的状态:
创建一个test.txt文件,然后输入git status
回车,会显示你当前所在的分支(分支后面会说),和你刚添加的文件,此时git会告诉你index(暂存区)啥都还没添加,但是有一个还没追踪的文件就是我们刚才创建的文件,要你赶紧添加对文件的追踪。
git add(添加改动到暂存区)
现在我们已经完成了创建任务,直接执行命令添加到暂存区。git add
这样使用:
//添加当前目录的所有文件到暂存区
$ git add .
//添加指定文件 testFile
$ git add testFile
复制代码
具体指不指定文件夹看自己的需求,我们这就直接执行git add test.txt
,然后再来git status
查看一下:
现在可以看到我已经将test.txt放到暂存区了,上面有个提示git rm --cached
是让撤销添加的,执行之后就回到git add
之前的状态了。
git commit(提交修改到本地仓库)
git commit -a -m ‘message’(git add 和git commit的合并版)
添加完文件,自然就往仓库推:
// 要想混得好注释少不了,每次提交都简洁写明这个版本改动了什么,保持一个好习惯,同事的刀也不会天天磨...
$ git commit -m '提交注释'
复制代码
这就整个commit,执行git commit -m 'commit测试'
,再查看状态:
结果很清晰,一个文件修改,并已经推送到本地仓库的master分支,此时git状态是工作区无任何需要提交的,干净的一匹,本地操作就完了,接下来需要将改动推送到远程仓库。
git push(推送到远程仓库)使用https方式
这里拿gitee来做测试,注册好账号(注册的邮箱和账户需要对应配置到本地去,见初始配置)之后点头像旁边的+号创建仓库:
创建成功后你就拥有了这东西:
reademe文件是项目的说明文件,如果你在远程仓库加了东西,那本地仓库提交时就需要先拉取同步,最好不要本地一个readme远程一个readme一上来就冲突。我没截完整图,下面还有一些git的基础教程,可以自行去看。接下来我们复制https的地址,粘贴到命令行工具,执行git remote add origin 复制的地址
链接远程的库,然后git remote -v
查看链接信息:
这样就可以推送了,第一次推送执行:
$ git push -u origin master
// 等价于 git push --set-upstream origin master ,将本地分支和远程master分支关联,接下来就可以直接git pull、git push不用指定分支了
复制代码
第一次推送是需要输入用户名和密码的也就是注册账号,结果如图:
推送成功后去网页远程仓库刷新即可看见你的推送。使用https的方式,不想每次拉取或者推送就添加凭证,存储账户和密码下一次就像我这样直接push了。配置方法:
// 先执行这个命令再pull或者push,就只用输入一次账户和密码
$ git config --global credential.helper osxkeychain // mac
$ git config --global credential.helper store // win
复制代码
第二种方式,配置ssh key
由于我的电脑已经配置上key了,如果重新生成key覆盖掉我原来的key,公司的项目处理起来比较麻烦,所以我就贴下gitee官网的文档地址,操作很简单聪明的你一看就会。
注意:我不是偷懒~
分支
以上我们的操作,都是基于单master的分支进行操作的,但是企业项目是多人协作的,会分master(生产分支),测试分支以及开发分支之类的,大多数企业做法大同小异。所以熟练分支操作是必要的,不必废话直接开始。
先来一梭子命令(后面例子里使用的都在这里能找到):
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branchname]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建立追踪关系,在指定的远程分支与现有分支之间
$ git branch --set-upstream-to=origin/[branchname] [branchname]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
复制代码
一样的,还是使用上一个?做示例:
用git branch -a
查看本地和远程所有分支可见我们就一个master主线在操作,现在git checkout -b
整一个分支出来玩玩,也可以先git branch newbranch
创建分支再git checkout newbranch
切换过去,效果如下:
注意:如果你在切换分支的时候当前分支工作区或者暂存区有改动,那么这个改动会被带到你的新分支。
现在我们已经有了一个从master迁出来的本地分支dev并且处于这个分支,可以愉快地在这个分支上玩自己的东西,然后直接推送到远端仓库:
将修改提交到本地仓库之后就可以直接git push origin dev
推送到远程仓库,此时查看所有分支可以看到本地和远程都多了一个dev分支。新建分支与远程分支建立追踪关系后可使用git push、git pull
,找到其对应分支,例如git branch --set-upstream-to=origin/[branchname] [branchname]
或者直接git push -u origin [branchname]
。还有一种是在远程仓库已经有多个分支的情况,当我们把项目clone下来时本地是只有一个默认主分支的,如果想要在某个远程分支基础下操作,需要在本地创建分支之后关联上对应分支再进行推送,否则如果你创建了一个名字不重复的分支,推送将会创建一个新的分支。
撤销修改
提交了commit之后,撤销可以用git reset --soft HEAD^
,如果想要连同add一起撤销则将--soft
改为--hard
。
// HEAD^表示上一个版本即上一次的commit,也可以写成HEAD~1,回退两次commit即HEAD~2
// --soft 会保留当前工作区的改动
// --hard 会删除工作空间的改动(谨慎使用)
复制代码
合并分支
在其他分支上一顿操作提交了之后,如果需要合并到master主分支,使用git merge [branchName]
:
合并成功之后直接push到远端就好。如果合并的时候有冲突,需要去解决冲突内容再提交commit。
最后
说几点小东西:
- 如果想要排除一些文件不纳入git管理,可配置.gitignore文件,但只能忽略掉未被建立追踪的文件,建议项目一开始就配置。
# #号表示这是一条注释
# 忽略文件/文件夹
build/
target/1.txt
# Editor directories and files
.idea
.vscode
*.suo
# !表示不忽略,如在指定文件夹里不忽略指定的文件
targetFile/*
!targetFile/readme.md
# 一些符号
# []表示匹配括号内的单个字符 => targetFile[0-9]/ 或者 targetFile[a-z]
# ?表示一个占位符 => text1?.txt
复制代码
- 每次push之前先pull一下
- 一波vscode的简便操作: