原文出自:https://www.pandashen.com
什么是 Git?
Git 是一个免费的开源分布式版本控制系统,它的设计目的是为了速度和效率的处理从小型到大型的项目;Git 可以帮我们管理我们的代码,记录历史,只要代码提交到 Git 上就永久不会丢失,可以随时 “穿越”(回到之前的某一个版本);可以多端共享,团队协作中,多个人操作了同一个文件时,可以实现自动合并(模块化,组件化)、标记冲突,拥有强大的分支管理系统。
Git 与 SVN 的区别
SVN:集中式,需要一台中央服务器,所有代码的拉取和提交都是在中央服务器,一旦中央服务器或者网络出现故障,则不能拉取和提交代码,需要不断去备份中央服务器,防止代码丢失。
Git:分布式,有一个中央服务器的同时,每个开发者本地都有自己的本地仓库,拥有完整的版本库,不用担心代码丢失,Git 存储的是代码变化的快照,更新代码的速度要比 SVN 更快。
Git 安装
Windows
Mac
- 如果安装过 Xcode 自带 Git,<a>https://developer.apple.com/xcode/</a>
- 可以安装 Homebrew,是 wmac 的包管理器,<a>https://brew.sh/</a>,下面是两款界面美化插件:
- Oh My ZSH:<a>http://ohmyz.sh/</a>
- iTerm2:<a>https://www.iterm2.com/</a>
Linux 命令
1、打印工作目录
pwd
2、创建文件夹
mkdir 文件夹名
3、改变路径
进入盘符:
cd d:
进入文件夹:
cd 文件夹名
回上一级目录:
cd ..
进入某一个路径:
cd 路径
想要进入某一个不知道路径的文件夹中,可以直接拖拽该文件到命令窗口,会自动识别路径。
4、查看文件列表
ls
ls -al
下面命令加了 -al
参数可以查看隐藏文件。
5、创建文件
touch 文件名
6、移动文件
mv 文件/文件夹 路径
将文件或者文件夹移动到所输入的路径下。
7、查看文件内容
cat 文件名
8、删除文件 / 文件夹
rm -rf 文件夹名
rm 文件名
-rf
为递归删除,后面加上 *
为参数会递归删除整个文件夹的内容,rm -rf *
(慎用)。
9、清空命令窗口
clear
10、查看命令历史
直接在命令行中查看:
history
将当前 Git 的命令历史写入文件中:
history > 文件名
11、使用 vi 编辑器编辑文件
vi 文件名
进入编辑模式:
i
进入命令模式:
Esc
保存并退出:
:wq
强制退出:
:q!
12、使用命令编辑文件
向文件输入内容:
echo 内容 > 文件名
向文件追加内容:
echo 内容 >> 文件名
当使用 echo
编辑了一个不存在的文件时,会创建一个新文件并将内容编辑到文件中,而 touch
创建的是空文件。
Git 的本地操作
Git 在管理文件时,所有文件都具有三种状态,已修改、已暂存、已提交。
Git 在本地仓库中由三部分组成,工作区、暂存区、版本库。
Git 管理的文件夹下都有一个名为 .git
的隐藏文件夹。
对应关系如下:
- 已修改 → 工作区
- 已暂存 → 暂存区(
.git
文件夹下的index
文件中) - 已提交 → 版本库
1、配置用户
不配置用户无法提交代码。
查看配置信息:
git config --list
配置用户名:
git config --global user.name "你的名字"
配置邮箱:
git config --global user.email "你的邮箱"
2、初始化 Git 仓库
在要初始化的文件夹下执行下面命令,告诉 Git 哪个文件夹被 Git 所管理,一个项目初始化一次,不能嵌套。
git init
3、查看 Git 状态
git status
文件为红色,代表有修改,文件名为绿色,代表已经加入暂存区。
4、添加到暂存区
git add 文件名
git add .
git add -A
.
和 -A
两个参数均为全部提交到暂存区,.
只监控修改、添加文件的变化,-A
监控修改、添加、删除文件。
5、删除暂存区
git rm --cached 文件名
git rm --cached . -r
第一个命令是删除某一个文件的暂存区,当参数为 .
的时候删除全部暂存区,所以需要加上代表递归删除的参数 -r
。
6、提交到版本库
从暂存区提交到版本库:
git commit -m "版本信息"
从工作区直接提交到版本库(需要之前添加过暂存区):
git commit -a -m "版本信息"
7、查看提交日志
git log
8、比较工作区、暂存区、版本库
工作区和暂存区比较:
git diff
工作区和版本库比较:
git diff 分支名
暂存区和版本库比较:
git diff --cached
9、撤销操作
git checkout 文件名
git checkout .
撤销操作是将暂存区覆盖到工作区,会放弃掉当前工作区修改的内容,. 参数是将整个暂存区覆盖当前工作区,一旦撤销就回不到之前的工作区了。
当不小心将当前工作区错误的代码提交到暂存区,可以使用下面命令将暂存区回滚到上一个暂存区,只可回滚一次。
git reset HEAD 文件名
10、回退版本
查看所有的版本号:
git reflog
按版本号回退版本:
git reset --hard 版本号
回退到上一个版本:
git reset --hard HEAD^
回退某一个版本的文件到工作区:
git checkout 版本号 文件名
回退版本会将当前版本库选中的版本重新覆盖暂存区和工作区。
11、分支操作
查看分支:
git branch
Git 刚刚初始化管理的的文件夹必须有一次提交到版本库(root-commit:根提交)以后才会有主分支 master,否则即使创建了新分支也无法切换回 master。
创建分支:
git branch 分支名
切换分支:
git checkout 分支名
创建并切换分支:
git checkout -b 分支名
删除分支(需切换出要删除的分支):
git branch -D 分支名
新创建的分支和主分支 master 还是同一个区域,新建的文件只有提交到新分支的版本库才真正脱离关系。
分支工作区有更改不能直接切换其他分支,可以提交更改或者暂存更改,若暂存更改(使用暂存区覆盖掉工作区),等待重新切回分支时,还原暂存。
此处所说的暂存不是之前的将代码提交到暂存区,因为当前分支工作区的代码会变成要切换分支工作区的代码,而导致当前分支工作区的更改丢失,此处的暂存类似于将修改寄存,重新切回该分支时再还原。
暂存更改:
git stash
还原暂存的内容:
git stash pop
合并分支:
将指定分支合并到当前所在的分支,所以,在分支开发完毕后,合并分支需要先切换回 master 主分支。
git merge 指定的分支名
查看分支合并的图谱:
git log --graph
git log --graph --oneline
红色线代表主分支,绿色线代表新创建的分支,分支上的 *
代表提交到版本库的节点。--oneline
参数表示提交信息显示为一行。
12、解决冲突
当创建分支后,分支和 master 主分支分别提交代码到版本库,此时切换回 master 主分支,合并分支会出现冲突,需手动处理后,重新提交到暂存区并提交到版本库。
// 代码冲突
<<<<<<< HEAD (当前更改)
master 分支代码
=======
开发分支的代码
>>>>>>> 开发的分支 (传入的更改)
Git 操作远程仓库
远程仓库可以是 Github、Gitee(码云)、Coding 或者中央服务器等等。
以下是常用免费仓库的地址,可以在首页注册账号:
- Github: <a>https://github.com</a>
- Gitee: <a>https://gitee.com</a>
- Coding: <a>https://coding.net</a>
1、处理需要过滤和提交的文件夹
使用 WebStrom 编辑器编辑代码时,会自动在根目录生成 .idea
文件夹,使用 Mac 开发时根目录下的 .DS_Store
文件夹,以及在项目开发时会安装依赖存放在 node_modules
文件夹中,此类文件夹都是在把代码上传到远程仓库或中央服务器时不应该上传的,因此应该在上传之前过滤掉。
在根目录创建
.gitignore
文件用于记录上传时被忽略的文件夹,内容(可根据需要自行配置)如下:
文件:.gitignore
.idea
.DS_Store
node_modules
Git 上传时会自动忽略空文件夹,假设想要上传一个名为 public
的空文件夹,需要在文件夹内新建一个名为 .gitkeep
的文件(名字随意,最好有语义化),目的是使要提交的空文件夹不再为空。
2、关联远程仓库
git remote add origin 远程仓库地址
3、查看关联的远程仓库
git remote -v
4、删除远程仓库的关联
git remote rm 地址别名
地址别名指的是上面的 origin
,也可以是其他名称,必须对应要删除关联的地址别名。
5、推送代码到远程仓库
git push origin master
git push -u origin master
如果加上了 -u
参数,以后再次提交时可省略地址别名和分支名称,直接执行下面命令进行提交。
git push
6、拉取远程仓库的代码
在提交代码时,如果直接提交到远程仓库,会将当前代码覆盖到远程仓库,如果别人之前也向远程仓库提交了代码,会在远程仓库中造成冲突,所以一般在提交代码之前先拉取远程仓库的代码与本地代码进行合并,并产生一个新的历史记录,若出现冲突,手动处理冲突后再统一提交到远程仓库。
拉取但不合并代码(与 merge 配合,不常用):
git fetch origin master
拉取并合并代码(常用):
git pull origin master
7、创建 gh-pages 分支来发布静态页
涉及到远程仓库网站上的操作均以 Github 为例,其他仓库大同小异:
- 在项目中创建一个名为
gh-pages
的分支; - 将分支提交到线上仓库;
- 找到提供给你的仓库网站的
Settings
切换到github-pages
; - 点击该栏顶端的地址可以访问我们的静态页。
git checkout -b gh-pages
touch index.html
git add .
git commit -m "提交信息"
git push origin gh-pages
8、拉取别人的项目到本地
git clone 项目地址 项目别名
上面命令项目别名是可选的,相当于给项目根文件夹重命名。
9、向别人的项目提问
- 在远程仓库网站进入别人的项目页面;
- 点击
Issue
选项; - 输入问题标题和问题描述并点击提交;
- 项目所有者可以回复或关闭问题。
10、更改别人的项目代码
- 在别人项目的主页上有一个叉子的图标,操作名为
Fork
; -
Fork
是在当前项目下克隆了一份,如果代码更新,不会随之更新; - 使用
clone
命令克隆自己的地址将项目拉到本地,进行操作; - 默认就是 Git 仓库而且有
origin
地址,修改后可以将代码提交到自己的仓库上; - 只有
Fork
关系才能修改别人代码后点击New pull request
发送提交请求; - 点击
Create pull request
按钮,填写提交标题,和提交详情,确认提交; - 项目所有者可以在自己的项目页面中
Pull request
菜单中查看提交并处理; - 点击
Close pull request
关闭,点击Merge pull request
同意提交并合并。
如果是一个团队的其他人需要操作同一个项目,上面的过程显得很繁琐,项目所有者可以在 Settings
的 Collaborators
选项中通过添加别人的账号或用户名向项目中添加贡献者,被添加的人拥有最大权限。
GUI 界面化
在当前的前端开发编辑器中,如 VSCode 和 WebStorm 等都集成了 Git,可以直接点击按钮操作,不必使用命令行,这种操作 Git 的界面称作 GUI 界面,个人建议还是尽量少的使用 GUI 界面,命令行是根本,还是多敲命令行,孰能生巧。