说明

Git 提供了很多命令来完成相应的操作。在此记录一些常用的命令,方便以后查阅。

环境配置

当安装 Git 后首先要做的事情是设置用户名称和邮箱地址。这是非常重要的,因为每次 Git 提交都会使用该用户信息。

# 设置用户信息
git config --global user.name "shironekoa3"
git config --global user.email "shironekoa3@qq.com"

# 查看用户信息
git config --list
git config user.name
git config user.email

通过上面的命令设置的信息会保存在 ~/.gitconfig 文件中。

获取Git仓库

要使用 Git 对代码进行版本控制,首先要获得 Git 仓库。

本地仓库

使用此命令来将当前目录初始化成本地 Git 仓库。

git init

远程仓库

git clone ${url}

${url} 为远程仓库地址。

一些概念

版本库

Git 目录里面的 .git 隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息、文件版本等。

工作目录(工作区)

包含 .git 文件夹的目录就是工作目录,主要用于存放开发的代码。

暂存区

.git 文件夹中有很多文件,其中 index 文件就是暂存区,也可以叫做 stage 。暂存区是一个临时保存修改文件的地方。如果要提交某个文件,就必须先将文件添加到暂存区。

文件的两种状态

Git 工作目录下的文件存在两种状态:

  • untracked:未跟踪(未被纳入版本控制)
  • tracked:已跟踪(被纳入版本控制)
    • Unmodified 未修改状态
    • Modified 已修改状态
    • Staged 已暂存状态

这些文件的状态会随着我们执行Git的命令而发生变化。

可以通过命令来查看文件的状态:

# 查看详细信息
git status
# 查看简洁信息
git status -s

本地仓库操作命令

操作命令

# 将未跟踪文件添加到暂存区,文件变为已跟踪状态
git add hello.txt

# 将所有文件添加到暂存区
git add .

# 将暂存区文件取消暂存,文件变为未跟踪状态
git reset HEAD hello.txt

# 将暂存区文件提交到仓库 m:message
git commit -m "init"

# 添加并提交可以合并
git commit -a -m "hello.txt"

# 删除文件。此方式会自动添加到暂存区。
git rm hello.txt

# 查看 Git 日志
git log

忽略列表

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志、临时文件等。在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件,列出要忽略的文件列表。下面是一个示例:

# 忽略所有 .a 结尾的文件
*.a

# 排除(不忽略) lib.a 文件
!lib.a

# 忽略 /TODO 这个文件
/TODO

# 忽略 build 目录下的所有文件
build/

# 忽略 doc 目录下的所有 .txt 结尾的文件,不包括子目录
doc/*.txt

# 忽略 doc 目录下的所有 .pdf 结尾的文件,包括子目录
doc/**/*.pdf

在 Windows 环境中,无法直接创建 .gitignore 文件,需要在 linux 命令行中用 touch 命令来创建。

远程仓库操作命令

查看远程仓库

如果想查看已经配置的远程仓库服务器,可以运行 git remote 命令。它会列出指定的每一个远程服务器的简写。如果已经克隆了远程仓库,那么至少应该能看到 origin ,这是 Git 克隆的仓库服务器的默认名字。

# 查看远程仓库
git remote

# 查看详细仓库
git remote -v
git remote show origin

添加远程仓库

运行如下命令来添加一个新的远程 Git 仓库,同时指定一个可以引用的简写。

git remote add origin ${url}

一个本地仓库可以关联多个远程仓库。

克隆远程仓库

可以将所有内容从远程仓库克隆下来。

git clone ${url}

移除远程仓库

如果因为一些原因想要移除一个远程仓库,可以使用如下命令:

git remote rm ${name}

${name} 为远程仓库的名字,比如 origin

此命令只是从本地仓库移除远程仓库的关系记录,并不会影响到远程仓库。

从远程仓库拉取

git fetch 是从远程仓库获取最新版本到本地仓库,但是不会自动 merge

git pullgit fetch 作用相同,但是会自动 merge

# 拉取数据到本地仓库,不会自动合并到工作区
git fetch
git fetch origin master

# 手动合并本地仓库和工作区的文件
git merge origin/master

# 拉取数据到本地仓库,并自动合并
git pull
git pull origin master

如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错 (fatal: refusing to merge unrelated histories),解决此问题可以在 git pull 命令后加入参数 “–allow-unrelated-histories”。

推送到远程仓库

当你想分享你的代码时,可以将其推送到远程仓库。命令如下:

git push
git push origin master

Git 分支

查看分支

# 查看本地分支
git branch

# 查看远程分支 (r: romate)
git branch -r

# 查看所有本地分支和远程分支
git branch -a

创建&切换分支

# 创建分支
git branch ${branch-name}

# 切换分支
git checkout ${branch-name}

合并分支

在 master 分支下合并其他分支,命令如下:

git merge ${branch-name}

如果遇到文件冲突,则需要手动修改冲突文件,然后使用 git add 命令来标识冲突已解决。

删除分支

# 删除分支
git branch -d ${branch-name}

# 强制删除分支
git branch -D ${branch-name}

# 删除远程分支
git push origin -d ${branch-name}

Git 标签

操作命令

# 查看所有标签
git tag

# 添加新的标签
git tag ${tag-name}

# 查看标签信息
git show ${tag-name}

# 推送到远程仓库
git push origin ${tag-name}

# 检出标签
git checkout -b ${branch-name} ${tag}

# 删除标签
git tag -d ${tag-name}

# 删除远程仓库标签
git push origin :refs/tags/${tag-name}

命令汇总

git config --global user.name "shironekoa3"
git config --global user.email "shironekoa3@qq.com"
git config --list
git config user.name
git config user.email
git init
git clone ${url}
git status
git status -s
git add hello.txt
git add .
git reset HEAD hello.txt
git commit -m "init"
git commit -a -m "hello.txt"
git rm hello.txt
git log
git remote
git remote -v
git remote show origin
git remote add origin ${url}
git clone ${url}
git remote rm ${name}
git fetch
git fetch origin master
git merge origin/master
git pull
git pull origin master
git push
git push origin master
git branch
git branch -r
git branch -a
git branch ${branch-name}
git checkout ${branch-name}
git merge ${branch-name}
git branch -d ${branch-name}
git branch -D ${branch-name}
git push origin -d ${branch-name}
git tag
git tag ${tag-name}
git show ${tag-name}
git push origin ${tag-name}
git checkout -b ${branch-name} ${tag}
git tag -d ${tag-name}
git push origin :refs/tags/${tag-name}