Git 基础

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

Git 安装

安装包下载地址: http://git-scm.com/downloads

安装方法:

MacOS:

# homebrew
brew install git
# XCode: builtin

Linux:

# debain, ubuntu
apt-get install git

# rhel, centos, ... 源码安装
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.xz
tar xf git-2.9.5.tar.xz
cd git-2.9.5
./configure --prefix=/usr/local/git-2.9.5
make -j8
make install
# add to path
echo 'PATH=$PATH:/usr/local/git-2.9.5/bin' > /etc/profile.d/git-2.9.5.sh
. /etc/profile

Windows:

# download the binary file and install

Git 工作流程

  1. 创建本地工作环境: 本地 git init, 远程 git clone xxx.git
  2. 本地文件修改
  3. 设置本地文件追踪: git add xxxx
  4. 提交本地修改 git commit -m 'xxxx'
  5. *远程推送: 远程环境 git push ...

Git 基本概念

  • 工作区: 修改代码的地方
  • 索引: 记录git add 后的文件目录状态
  • 仓库: 记录git commit 后的文件目录
  • HEAD: 当前仓库指向的commit

Git 基本操作

# 创建本地仓库
git init

# 工作目录与索引之间的操作
git add file...
git rm file...
git mv file file

# 提交索引内容到本地仓库
git commit -m message

# 查看工作区状态: 
# Changes to be committed: 已经在索引,等待提交
# Untracked files: 仅在工作区,未被索引跟踪
git status

# 重置 HEAD 
git reset --soft <commit-id, default HEAD>     # change HEAD
git reset [--mixed] <commit-id, default HEAD>  # change HEAD & index
git reset --hard <commit-id, default HEAD>     # change HEAD & index & working dir

Git 远程管理

# 从远程仓库克隆
git clone url [name]

# 查看远程仓库信息
git remote -v

# 为本地仓库添加一个远程仓库
git remote add name url

# 远程仓库的一些操作
git remote rename old new
git remote remove name

# 获取/设置远程仓库的url
git remote get-url name
git remote set-url name newurl
git remote set-url --add name newurl
git remote set-url --delete name newurl

# 提交/拉取 远程仓库内容
git fetch
git push
git pull

Git 分支管理

# 分支操作
git branch
git branch -d
git branch -D

# 切换分支
git checkout <branch>
git checkout -b <new branch>

# 从分支提取文件到工作目录
git checkout [branch] -- filename

# 合并分支
git merge

# 合并提交
git rebase [-i]

# 撤销
git revert

Git 提交历史

# git 提交历史
git log
# git ref 历史记录
git reflog

Git 标签

# tag 操作
git tag
git tag tag-name
git tag -d tag-name

# 远程 tag 
git push origin tag-name  ## 推送远程tag
git push origin :refs/tags/tag-name ## 删除远程tag

.gitignore

# 仓库忽略文件, git 索引,仓库忽略下列文件/目录的检查
# vscode 文件夹, / 开头代码当前目录, / 结尾代表屏蔽目录文件
/.vscode/
# bazel 软链接,
/bazel-bin
/bazel-ipcnt_trpc
/bazel-out
/bazel-testlogs
# 当前目录的idea.iml 文件
/idea.iml
# 匹配 .iml 结尾的所有文件
*.iml

git 配置

# local, 存储在 `仓库目录/.git/config`, 优先级高
git config user.name NAME
git config --local user.email EMAIL

# user, 存储在 `$HOME/.gitconfig`, 优先级中
git config --global user.name NAME
git config --global user.email NAME@domain.com
# 替换 `http(s)://xx/` 为 `git@xxx:`,注意/到:的替换
git config --global url.git@xxx.git:.insteadOf http://xxx.git/
git config --global url.git@xxx.git:.insteadOf https://xxx.git/

# system, 优先级低, 存储 /etc/gitconfig 或 $PREFIX/etc/gitconfig
git config --system $sec.$key $val