1. Git 简介
Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
1.1 两种版本控制系统
1.1.1 集中式版本控制
集中式版本控制有一个集中管理的服务器,然后开发人员通过客户端的形式拉取文件或者提交更新。
集中式版本控制存在一个问题,单点故障:
- 服务器宕机,会导致开发人员无法及时进行版本控制。
- 磁盘损坏,丢失所有的数据。
1.1.2 分布式版本控制
分布式版本控制是在每个客户端上保存完整的代码仓库,称为本地库。这样开发人员就可以在自己的电脑上进行版本控制,同时可以通过和服务器进行交互,从而完成团队工作。因为每个客户端保存的都是完成的代码仓库,所以不存在单点故障。
1.2 Git 的工作机制
1.2.1 用户签名区分客户端
Git 安装完成后需要设置用户名和邮箱,自报家门,来表明开发人员所用的客户端。
该信息所有的 Git 本地库共用,只需设置一次。
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
1.2.2 Git 的三个区域
使用Git首先要创建本地库
本地库可以理解为一个目录,里面所有的文件都被Git管理,可以跟踪所有文件的版本。
创建本地库的方法是:
- 创建一个目录
- 在该目录中鼠标右键,点击
Git Bash Here,打开Git Bash命令行 - 通过
git init命令把这个目录变成Git可以管理的仓库,会发现该目录中多了一个隐藏文件夹.git
三个区域
-
工作区
工作区就是我们平时写代码的地方,只能看到当前的使用版本。
-
暂存区
工作区修改的代码可以提交到暂存区。
-
本地库
暂存区的代码可以提交到本地库。
使用示例:
-
修改文件
file1.txt,file2.txt,file3.txt -
将修改的文件通过
git add命令添加到暂存区 -
将暂存区的文件通过
git commit命令添加到本地库-
-m "add 3 files."是对本次提交的说明 -
后面不跟文件名表示将所有暂存区的文件提交;跟文件名表示提交指定文件
-
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
2. Git 常用命令
| 命令 | 作用 |
|---|---|
git config --global user.name "Your Name" | 设置用户名 |
git config --global user.email "email@example.com" | 设置邮箱 |
git init | 创建本地库 |
git add file.txt | 添加到暂存区 |
git commit -m "message" | 提交到本地库 |
git status | 查看工作状态 |
git diff | 查看修改内容 |
git log | 查看提交历史 |
git reflog | 查看命令历史 |
git reset hard commit_id | 版本穿梭 |
git checkout --file | 丢弃工作区的修改 |
git reset HEAD <file> | 丢弃暂存区的修改 |
git rm file.txt | 删除文件 |
git config --global user.xxx
-
git config --global user.name "Your Name"设置用户名
-
git config --global user.email "email@example.com"设置邮箱
一个电脑只需设置一次,用于标识各个客户端。
git init
初始化本地库
git add file.txt
将工作区的文件添加到暂存区,可在其后跟多个文件一次性添加
git commit -m "message"
将暂存区的文件添加到本地库
git status
查看工作区以及暂存区的状态
git diff
-
比较工作区与缓存区
git diff
-
比较缓存区与本地库最近一次commit内容
git diff --cached
-
比较工作区与本地最近一次commit内容
git diff HEAD
-
比较两个commit之间差异
git diff commit_id1 commit_id2
git log
只能看到当前版本之前的提交历史
git reflog
可以看到所有的命令历史
git reset hard commit_id
可以用版本号,也可以用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
git reset --hard HEAD^就是回退到上一个版本。
git checkout --file
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout --file。
git reset HEAD file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
在回退工作区的文件时用
git restore <file>、git checkout --<file>效果一样当回退暂存区时(此时文件已经add到暂存区,还未进行commit),使用
git restore --staged <file>、git reset HEAD <file>效果一样。
git restore是git 2.23版本新增的命令
git rm file.txt
先手动删除文件,然后使用git rm <file>和git add<file>效果是一样的。
3. Git 分支
3.1 分支简介
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。
同一分支内的版本切换、各分支之间的切换都是通过指针来实现的。
master、dev是两个分支的指针,HEAD是当前版本的指针。
HEAD会指向某一分支的指针。
3.2 常用命令
| 命令 | 作用 |
|---|---|
git branch <name> | 创建分支 |
git branch v | 查看分支 |
git checkout <name> | 切换分支 |
git merge <name> | 把指定的分支合并到当前分支上 |
git branch -d <name> | 删除分支 |
git branch name
- 创建分支
git branch v
- 查看分支
git checkout name
- 切换分支:
git checkout <name>或者git switch <name>
- 创建+切换分支:
git checkout -b <name>或者git switch -c <name>
git merge name
- 合并某分支到当前分支:
git merge <name> - 可能存在合并冲突
git branch -d name
- 删除分支:
git branch -d <name>
4. 远程仓库
4.1 常用命令
| 命令 | 作用 |
|---|---|
git remote v | 查看当前所有关联的远程地址 |
git remote add 别名 远程地址 | 关联远程库,并起别名 |
git push 远程地址别名 本地分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程地址别名 远程分支 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
4.2 本地库与远程库交互
4.2.1 推送到远程库
本地生成ssh密钥,并把公钥放在Github上;
在Github创建一个远程库;
要关联这个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改
ssh方式不需要输入用户名密码或者令牌,很方便
4.2.2 克隆远程库
在需要存放克隆下来的项目的文件夹中鼠标右键,点击 Git Bash Here,打开Git Bash命令行
然后 git clone 远程地址: 1、拉取代码。 2、初始化本地仓库。 3、创建别名
4.2.3 拉取远程库最新内容
git pull 远程地址别名 远程分支 :将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并
4.2.4 fork 与 Pull request
5. 其他重要命令
git stashgit cherry-pick <commit>git fetchgit rebasegit revert