Git教程

Git基本理论

1. Git工作区域

不同工作区域文件交换的命令

  • Workspace:工作区,平时存放项目代码存放的区域。
  • Index/Stage:暂存区,用于临时存放代码的改动,实际为一个文件,保存即将提交到文件列表的信息。
  • Repository:仓库(本地仓库),保存了所有提交版本的数据。其中HEAD指向最新放入仓库的版本。
  • Remote:远程仓库,托管代码的服务器。

2. Git文件操作

文件的四种状态

  • Untracked:未跟踪,此文件在文件夹中,但未加入到git库,不参与版本控制,通过命令git add将状态变为staged
  • Unmodify:文件已入库,未修改,即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种去处,如果它被修改,则变为Modified;如果使用git rm则移出版本库,则成为Untracked文件。
  • Modified:文件已修改,仅仅是修改,并没有进行其他的操作。这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout则丢弃修改,返回到unmoidify状态,其中git checkout即从库中取出文件,覆盖当前修改。
  • Staged:暂存状态。执行git commit则将修改同步到库中,这是库中的文件和本地文件一致,文件为unmodify状态。执行git reset HEAD filename取消暂存,文件状态变为Modified
1
2
3
4
# 查看文件状态
git status [filename]
# 查看所有文件状态
git status

忽略文件

在主目录下建立.gitignore文件,此文件规则如下:

Git基础命令

  1. 克隆代码
1
2
3
4
5
6
git clone <url>
# 克隆指定分支
git clone -b branchName <url>

# 初始化git项目
git init
  1. 拉取(更新)代码,命令形式:git pull <远程主机名> <远程分支名>:<本地分支名>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git pull origin
git pull origin branchName

# 变基(避免出现merge commit记录)
git pull --rebase origin branchName

# 存在代码冲突时,拉取代码步骤
# 1. 拉取代码
git pull --rebase # 或者全局修改配置git config --global pull.rebase true
# 2. 处理冲突文件
vim test.txt # 例如冲突文件为test.txt
# 3. 添加修改文件到暂存区
git add .
# 4. 继续变基
git rebase --continue
  1. 提交代码
1
2
git add .
git commit -m "message"
  1. 推送远程分支,命令形式:git push <远程主机名> <本地分支名>:<远程分支名>
1
2
3
4
5
git push origin head:branchName
# 强制推送
git push -f origin head:branchName
# 合并分支
git merge [branchName]

git pull可以理解为git fetch+git merge,详细说明如下:

1
2
git fetch origin master  # 从远程主机的master分支拉取最新内容
git merge FETCH_HEAD # 将拉取下来的最新内容合并到当前的分支中

在merge的时候,会将有冲突不能合并的内容进行提示。

  1. 合并提交记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 本次修改合并到上次提交
git commit --amend # 会通过core.editor指定编辑器进行编辑
git commit --amend --no-edit # 不打开命令行,直接提交

# 合并近k条提交记录
git rebase -i head~k

# 一般pick第一条,后面都squash

# 从HEAD版本开始往过去数3个版本
$ git rebase -i HEAD~3

# 合并指定版本号(不包含此版本)
$ git rebase -i [commitid]

说明:

  • -i(--interactive):弹出交互式的界面进行编辑合并
  • [commitid]:要合并多个版本之前的版本号,注意:[commitid] 本身不参与合并

指令解释(交互编辑时使用):

  • p, pick = use commit
  • r, reword = use commit, but edit the commit message
  • e, edit = use commit, but stop for amending
  • s, squash = use commit, but meld into previous commit
  • f, fixup = like “squash”, but discard this commit’s log message
  • x, exec = run command (the rest of the line) using shell
  • d, drop = remove commit
  1. 查看配置信息
1
2
3
4
5
6
7
8
9
10
11
12
git config [<options>]
# list all
git config -l
# 查看系统配置信息
git config --system --list
# 查看个人配置信息
git config --global --list

# 设置用户名
git config --global user.name "Ysfun"
# 设置邮箱
git config --global user.email ""
  1. 分支命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看所有分支
git branch -a
# 查看本地分支
git branch # '*'表示当前分支,并以绿色标识
# 查看远程分支
git branch -r
# 查看所有分支详细信息
git branch -vva
# 删除分支
git branch -d [branchName]

# 切换分支
git checkout <branch>
# 创建分支并切换到该分支
git checkout -b <branch>
  1. 代码冲突

代码冲突的解决步骤:

  1. 使用git pull拉取远程代码
  2. 本地处理冲突文件
  3. add -> commit -> push提交冲突,并推送至远程
  1. 查看历史
1
2
3
git log
git log -2 # 显示最近两条日志
git log --oneline # 日志单行显示
  1. 版本回退
1
2
3
4
5
6
7
# 语法格式
git reset [--soft | --mixed | --hard] [HEAD]

# 示例
$ git reset HEAD^ # 回退所有内容到上一个版本
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git reset 052e # 回退到指定版本
  1. pull rebase
1
2
3
4
# 修改配置
git config pull.reabse true
# 修改全局配置
git config --global pull.rebase true