Skip to content

Git

git config

配置 Git 的相关参数。

Git 一共有 3 个配置文件:

  1. 仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。
  2. 全局配置文件:Mac 系统在 ~/.gitconfig,Windows 系统在 C:\Users\<用户名>\.gitconfig
  3. 系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git)的 etc 文件夹中的 gitconfig
bash
# 查看配置信息
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -l

# 查看当前生效的配置信息
$ git config -l

# 编辑配置文件
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -e

# 添加配置项
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> --add <name> <value>

# 获取配置项
$ git config <--local | --global | --system> --get <name>

# 删除配置项
$ git config <--local | --global | --system> --unset <name>

# 配置提交记录中的用户信息
$ git config --global user.name <用户>
$ git config --global user.email <邮箱地>

# 更改Git缓存区的大小
# 如果提交的内容较大,默认缓存较小,提交会失败
# 缓存大小单位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <缓存大>

# 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态
$ git config --global color.ui true

# 配置可以缓存密码,默认缓存时间15分钟
$ git config --global credential.helper cache

# 配置密码的缓存时间
# 缓存时间单位:秒
$ git config --global credential.helper 'cache --timeout=<缓存时间>'

# 配置长期存储密码
$ git config --global credential.helper store

git clone

从远程仓库克隆一个版本库到本地。

bash
# 默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下
$ git clone <远程仓库的网>

# 指定本地仓库的目录
$ git clone <远程仓库的网> <本地目>

# -b 指定要克隆的分支,默认是master分支
$ git clone <远程仓库的网> -b <分支名> <本地目>

git init

初始化项目所在目录,初始化后会在当前目录下出现一个名为 .git 的目录。

bash
# 初始化本地仓库,在当前目录下生成 .git 文件夹
$ git init

git status

查看本地仓库的状态。

bash
# 查看本地仓库的状态
$ git status

# 以简短模式查看本地仓库的状态
# 会显示两列,第一列是文件的状态,第二列是对应的文件
# 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中
$ git status -s

git remote

操作远程库。

bash
# 列出已经存在的远程仓库
$ git remote

# 列出远程仓库的详细信息,在别名后面列出URL地址
$ git remote -v
$ git remote --verbose

# 添加远程仓库
$ git remote add <远程仓库的别> <远程仓库的URL地>

# 修改远程仓库的别名
$ git remote rename <原远程仓库的别> <新的别>

# 删除指定名称的远程仓库
$ git remote remove <远程仓库的别>

# 修改远程仓库的 URL 地址
$ git remote set-url <远程仓库的别> <新的远程仓库URL地>

git branch

操作 Git 的分支命令。

bash
# 列出本地的所有分支,当前所在分支以 "*" 标出
$ git branch

# 列出本地的所有分支并显示最后一次提交,当前所在分支以 "*" 标出
$ git branch -v

# 创建新分支,新的分支基于上一次提交建立
$ git branch <分支>

# 修改分支名称
# 如果不指定原分支名称则为当前所在分支
$ git branch -m [<原分支名称>] <新的分支名称>
# 强制修改分支名称
$ git branch -M [<原分支名称>] <新的分支名称>

# 删除指定的本地分支
$ git branch -d <分支名>

# 强制删除指定的本地分支
$ git branch -D <分支名>

git checkout

检出命令,用于创建、切换分支等。

bash
# 切换到已存在的指定分支
$ git checkout <分支名>

# 创建并切换到指定的分支,保留所有的提交记录
# 等同于 "git branch" 和 "git checkout" 两个命令合并
$ git checkout -b <分支名>

# 创建并切换到指定的分支,删除所有的提交记录
$ git checkout --orphan <分支名>

# 替换掉本地的改动,新增的文件和已经添加到暂存区的内容不受影响
$ git checkout <文件路>

git cherry-pick

把已经提交的记录合并到当前分支。

bash
# 把已经提交的记录合并到当前分支
$ git cherry-pick <commit ID>

git add

把要提交的文件的信息添加到暂存区中。当使用 git commit 时,将依据暂存区中的内容来进行文件的提交。

csharp
# 把指定的文件添加到暂存区中
$ git add <文件路径>

# 添加所有修改、已删除的文件到暂存区中
$ git add -u [<文件路径>]
$ git add --update [<文件路径>]

# 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录
$ git add -A [<文件路径>]
$ git add --all [<文件路径>]

# 查看所有修改、已删除但没有提交的文件,进入一个子命令系统
$ git add -i [<文件路径>]
$ git add --interactive [<文件路径>]

git commit

将暂存区中的文件提交到本地仓库中。

bash
# 把暂存区中的文件提交到本地仓库,调用文本编辑器输入该次提交的描述信息
$ git commit

# 把暂存区中的文件提交到本地仓库中并添加描述信息
$ git commit -m "<提交的描述信息>"

# 把所有修改、已删除的文件提交到本地仓库中
# 不包括未被版本库跟踪的文件,等同于先调用了 "git add -u"
$ git commit -a -m "<提交的描述信息>"

# 修改上次提交的描述信息
$ git commit --amend

# 合并上一次提交(用于反复修改)
$ git commit --amend -m 'xxx'

git fetch

从远程仓库获取最新的版本到本地的 tmp 分支上。

bash
# 将远程仓库所有分支的最新版本全部取回到本地
$ git fetch <远程仓库的别>

# 将远程仓库指定分支的最新版本取回到本地
$ git fetch <远程主机> <分支>

git merge

合并分支。

bash
# 把指定的分支合并到当前所在的分支下
$ git merge <分支名>

git diff

比较版本之间的差异。

bash
# 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改
$ git diff

# 比较暂存区中的文件和上次提交时的差异
$ git diff --cached
$ git diff --staged

# 比较当前文件和上次提交时的差异
$ git diff HEAD

# 查看从指定的版本之后改动的内容
$ git diff <commit ID>

# 比较两个分支之间的差异
$ git diff <分支名> <分支名>

# 查看两个分支分开后各自的改动内容
$ git diff <分支名>...<分支名>

git pull

从远程仓库获取最新版本并合并到本地。 首先会执行 git fetch,然后执行 git merge,把获取的分支的 HEAD 合并到当前分支。

bash
# 从远程仓库获取最新版本。
$ git pull

git push

把本地仓库的提交推送到远程仓库。

bash
# 把本地仓库的分支推送到远程仓库的指定分支
$ git push <远程仓库的别> <本地分支>:<远程分支>

# 删除指定的远程仓库的分支
$ git push <远程仓库的别> :<远程分支>
$ git push <远程仓库的别> --delete <远程分支>

git log

显示提交的记录。

bash
# 打印所有的提交记录
$ git log

# 打印从第一次提交到指定的提交的记录
$ git log <commit ID>

# 打印指定数量的最新提交的记录
$ git log -<指定的数>

git reset

还原提交记录。

bash
# 重置暂存区,但文件不受影响
# 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件
# 没有指定 commit ID 则默认为当前 HEAD
$ git reset [<文件路径>]
$ git reset --mixed [<文件路径>]

# 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
$ git reset <commit ID>
$ git reset --mixed <commit ID>

# 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
# 相当于调用 "git reset --mixed" 命令后又做了一次 "git add"
$ git reset --soft <commit ID>

# 将 HEAD 的指向改变,撤销到指定的提交记录,文件也修改了
$ git reset --hard <commit ID>

git revert

生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留。

bash
# 生成一个新的提交来撤销某次提交
$ git revert <commit ID>

git tag

操作标签的命令。

bash
# 打印所有的标签
$ git tag

# 添加轻量标签,指向提交对象的引用,可以指定之前的提交记录
$ git tag <标签名> [<commit ID>]

# 添加带有描述信息的附注标签,可以指定之前的提交记录
$ git tag -a <标签名> -m <标签描述信> [<commit ID>]

# 切换到指定的标签
$ git checkout <标签名>

# 查看标签的信息
$ git show <标签名>

# 删除指定的标签
$ git tag -d <标签名>

# 将指定的标签提交到远程仓库
$ git push <远程仓库的别> <标签名>

# 将本地所有的标签全部提交到远程仓库
$ git push <远程仓库的别> –tags

git mv

重命名文件或者文件夹。

bash
# 重命名指定的文件或者文件夹
$ git mv <源文件/文件> <目标文件/文件>

git rm

删除文件或者文件夹。

bash
# 移除跟踪指定的文件,并从本地仓库的文件夹中删除
$ git rm <文件路>

# 移除跟踪指定的文件夹,并从本地仓库的文件夹中删除
$ git rm -r <文件夹路>

# 移除跟踪指定的文件,在本地仓库的文件夹中保留该文件
$ git rm --cached

Git 操作场景示例

1. 删除掉本地不存在的远程分支

多人合作开发时,如果远程的分支被其他开发删除掉,在本地执行 git branch --all 依然会显示该远程分支,可使用下列的命令进行删除:

bash
# 使用 pull 命令,添加 -p 参数
$ git pull -p

# 等同于下面的命令
$ git fetch -p
$ git fetch --prune origin

git 的状态

A: 你本地新增的文件(服务器上没有).

C: 文件的一个新拷贝.

D: 你本地删除的文件(服务器上还在).

M: 文件的内容或者 mode 被修改了.

R: 文件名被修改了。

T: 文件的类型被修改了。

U: 文件没有被合并(你需要完成合并才能进行提交)。

X: 未知状态(很可能是遇到 git 的 bug 了,你可以向 git 提交 bug report)。

Git 二

一、Git GUI 客户端

Git 客户端下载(Windows)

TortoiseGit 客户端下载(Windows)

Sourcetree 客户端下载(Windows、Mac)

Git Extensions 客户端下载(Windows、Mac、Linux)

SmartGit 客户端下载(Windows、Mac、Linux)

GitEye 客户端下载 (Windows、Mac、Linux)

gitg 客户端下载(Windows、Linux)

ungit 客户端下载(Windows、Mac、Linux)

git-cola 客户端下载(Windows、Mac、Linux)

Tower 客户端下载(Windows、Mac)

Gitbox 客户端下载(Mac)

GitUp 客户端下载(Mac)

giggle 客户端下载(Linux)

Pocket Git 客户端下载(Andorid)

Working Copy 客户端下载(IOS)

Git2Go 客户端下载(IOS)

GitDrive 客户端下载(IOS)

Fork 客户端(Windows、Mac)

GitKraken 客户端(Windows、Mac、Linux)

二、Git IDE 插件

Eclipse、Myeclipse 插件下载

Netbeans 插件下载

IntelliJ IDEA 插件下载

Visual Studio 插件下载

Atom 插件下载

Sublime Text 插件下载

三、Git 浏览器插件

Git 浏览器插件下载(Chrome、Firefox、Safari、Opera,支持码云和 Github)

Octotree 浏览器插件下载(Chrome,支持 Github)

GitLab-TreeView 浏览器插件下载(Chrome,支持 GitLab)

四、在线 Git 代码托管平台

码云 Gitee 官网

GitHub 官网

GitLab 官网

Bitbucket 官网

五、搭建 Git 服务

GitLab 开源版本下载

Gitblit 开源版本下载

Gogs 开源版本下载

Gitea 开源版本下载

Gitosis 开源版本下载

Gitolite 开源版本下载

GitStack 开源版本下载

Gidder 开源版本下载

六、Git 教程

廖雪峰 | Git 教程

Git - Book

Pro Git

Git 简易指南

菜鸟教程 | Git 教程

博客园 | 深入浅出 Git 教程

W3Cschool | Git 教程

易百教程 | Git 教程

Backlog | Git 入门

CSDN | Git 使用详细教程

Lufficc | Git 教程

七、Git 常用命令

仓库

bash
# 在当前目录新建一个Git代码库
$ git init

# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

# 下载一个项目和它的整个代码历史
$ git clone [url]

配置

bash
# 显示当前的Git配置
$ git config --list

# 编辑Git配置文件
$ git config -e [--global]

# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

增加/删除文件

bash
# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

代码提交

bash
# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

分支

bash
# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 新建一个分支,指向指定commit
$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

标签

bash
# 列出所有tag
$ git tag

# 新建一个tag在当前commit
$ git tag [tag]

# 新建一个tag在指定commit
$ git tag [tag] [commit]

# 删除本地tag
$ git tag -d [tag]

# 删除远程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

查看信息

bash
# 显示有变更的文件
$ git status

# 显示当前分支的版本历史
$ git log

# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史,根据关键词
$ git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature

# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 显示指定文件相关的每一次diff
$ git log -p [file]

# 显示过去5次提交
$ git log -5 --pretty --oneline

# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过
$ git blame [file]

# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
$ git show [commit]

# 显示某次提交发生变化的文件
$ git show --name-only [commit]

# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]

# 显示当前分支的最近几次提交
$ git reflog

远程同步

bash
# 下载远程仓库的所有变动
$ git fetch [remote]

# 显示所有远程仓库
$ git remote -v

# 显示某个远程仓库的信息
$ git remote show [remote]

# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]

# 上传本地指定分支到远程仓库
$ git push [remote] [branch]

# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force

# 推送所有分支到远程仓库
$ git push [remote] --all

撤销

bash
# 恢复暂存区的指定文件到工作区
$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变d
$ git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

其他

bash
# 生成一个可供发布的压缩包
$ git archive
# 升级 git 版本
$ git update-git-for-windows

version 2.3.3