基础知识

四个分区

工作区:默认位置,最新修改所在位置
暂存区:当在工作区执行 git add .后将代码添加到暂存区,这时工作区和暂存区的代码一致
本地仓库:当执行 git commit 后将代码添加到本地仓库,这时工作区、暂存区和本地仓库一致
远程仓库:当在本地仓库执行 git push 后将代码添加到远程仓库,这时工作区、暂存区、本地仓库和远程仓库一致

使用技巧

  1. 如果是要开发新分支的话,一定要从 master 分支切出来一个新的分支,因为 master 上的代码都是已经上线了的

  2. 公共分支(master develop 等)合并代码时推荐使用merge,尤其是在多人开发

  3. 在公共分支上开发时,先把本地的代码 stash,然后 pull,在stash pop有冲突的话合并冲突

  4. 一般在把代码合并到 master 之前,会把本地的 commit 进行整理,合并成一个 commit 或者多个,这样 master 就不会有过多的无用 commit

  5. 在往 master 合并代码遇到冲突的解决方案

  6. 可以先 checkout 到本地的 master 分支,pull 最新的代码,在 checkout 到自己的分支,然后 rebase master 分支,解决冲突,然后再次提交合并 master 的 merge request

常用命令

clone

将远程库克隆到本地库,默认会创建一个和远程库相同名称的目录,也可以手动修改

1
2
3
4
5
# git clone <版本库地址> <本地项目目录名>
git clone https://github.com/jquery/jquery.git myJquery

# 克隆的时候指定主机名
git clone -o name https://github.com/jquery/jquery.git myJquery

add

将工作区的代码添加到暂存区

1
2
3
4
5
# 将指定的文件添加到暂存区
git add 文件路径

# 将当前目录下的所有修改添加到暂存区
git add .

commit

将暂存区的代码提交到本地库

1
2
3
4
5
6
7
8
9
10
11
# 提交,会弹出编辑界面输入提交描述
git commit

# 提交,不弹出编辑界面,直接在-m 后添加提交描述
git commit -m 'message'

# 将代码添加到暂存区,然后在提交到本地库.相当于git add . git commit -m
git commit -am 'message'

# 修改最近的一条commit的提交信息,会改变commitID
git commit --amend

remote

为了方便管理,每一个远程主机都需要有一个主机名(对应一个地址),remote 命令就是用来管理主机名的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 列出所有主机名
git remote

# 列出主机名和相应的网址
git remote -v

# 查看主机详情信息
git remote show <主机名>

# 添加远程主机
git remote add <主机名> <主机地址>

# 删除远程主机
git remote rm <主机名>

# 修改主机名称
git remote rename <原主机名> <新主机名>

fetch

将远程库的更新取回到本地库

取回后的更新,在本地主机上要用‘远程主机名/分支名’的形式读取
fetch 只是将更新取回本地,不进行合并操作,可以手动进行合并,与‘远程主机名/分支名’进行合并

1
2
3
4
5
6
7
8
# 取回所有远程库分支的更新
git fetch

# 取回指定分支的更新
git fetch <远程主机名> <分支名>

# 合并取回的更新 origin/master
git merge origin/master

pull

取回远程仓库的某个分支,并与本地库的指定分支进行合并

git pull相当于git fetch + git merge,先将远程分支拉到本地,在与指定的本地分支进行合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# git pull <远程主机名> <远程分支名>:<本地分支名>
# 取回远程库的master分支与本地的develop分支进行合并
git pull origin master:develop

# 如果远程分支名和本地分支名一样,可以简写
git pull origin master
# 上面的命令与以下的命令效果一样
git fetch master
git merge origin/master

# 本地分支和远程分支已经建立了追踪关系的话,可以直接pull,不需要带主机名
git pull

# 使用rebase的方式进行合并
git pull --rebase

branch

对分支进行管理

1
2
3
4
5
6
7
8
9
10
11
12
13
# 建立追踪关系
git branch --set-upstream master origin/master

# 基于当前所在分支创建新分支
git branch branchName

# 基于远程分支创建新分支
git fetch
git branch branchName 主机名/远程分支名
git branch master origin/master

# 删除本地分支,切换到除被删除分支的其他分支
git branch -D branchName

push

将本地库的更新推送至远程库的指定分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 命令格式与pull类似
git push <远程主机名> <本地分支名>:<远程分支名>

# 本地和远程分支名一样
git push origin master

# 删除远程的指定分支
git push origin :develop
git push origin --delete develop

# 指定默认的主机名,指定origin为默认的主机名
git push -u origin master

# 将本地的所有分支都推送到远程主机
git push --all

# 强制推送
git push --force

rebase

和 merge 类似,也是用来合并代码的

1
2
# 合并提交,将这个commitID后的所有提交进行合并
git rebase -i commitID

stash

保存未提交到本地库的修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 保存当前修改,提交的描述信息自动生成
git stash

# 保存当前修改,添加描述信息
git stash save 'save message'

# 查看存储的列表
git stash list

# 应用某个存储,不加参数默认应用最近的一个,也可以加参数指定应用第几个
git stash apply
git stash apply stash@{1} # 应用第二个

# 应用某个存储并删除掉,默认第一个,也可指定
git stash pop
git stash pop stash@{1}

# 删除某个存储
git stash drop stash@{1}

# 删除所有的存储
git stash clear

# 显示存储的改动
git stash show -p
git stash show stash@{1} -p

reset

diff

用来比较代码差异

1
2
3
4
5
6
7
8
9
10
11
12
13
# 比较工作区和暂存区的差别
git diff

# 比较工作区和本地仓库的差别
git diff HEAD

# 比较暂存区和本地仓库的差别
git diff --cached

# 当修改提交后,以上三种方法得到的结果是一样的,因为这时工作区 暂存区 本地仓库的代码都是一样的,这时就可以用下面这个命令

# 比较当前版本和上几个版本的差别
git diff HEAD~n

revert

cherry-pick

checkout

切换分支,创建分支(相当于先使用 branch 命令创建分支,在使用 checkout 命令切换到新分支)

1
2
3
4
5
6
7
8
# 基于当前分支创建新分支,并切换到新分支
git checkout -b newBranch

# 基于远程分支创建新分支,并切换到新分支
git checkout -b newBranch 主机名/远程分支

# 丢弃工作区的改动
git checkout -- 文件路径

config

配置 git 的命令

1

status

查看状态

1
2
# 基本使用
git status

tag