Git 基础使用

Git 是一个强大而快速的代码版本管理工具. 详细的介绍可以参考 Git历险记(一).

准备 ssh public key

使用 Git 向远程代码仓库提交代码时, 最常用的验证方法是通过 SSH. 这需要先将自己的 SSH public key 传到代码仓库所在的服务器上, 可以通过服务器上安装的 Git 托管软件来配置, 比如 Gitosis 和 Gitolite. 像 GitHub 这种提供网站界面的则在自己的帐号页面进行设置.

SSH public key 通常位于家目录的 .ssh 目录下, 比如: ~/.ssh/id_rsa.pub. 如果还没有 SSH public key, 可以通过 ssh-keygen 命令生成, 例如运行: ssh-keygen -t rsa. 生成过程中会询问是否设置 passphrase, 这个是当使用 SSH key 时需要额外验证的密码, 如果对安全要求特别高可以设置, 否则可以直接按回车忽略.

基本配置

配置用户名和邮箱, 例如:

git config --global user.name "xhh"
git config --global user.email "xhh@xhh.me"

配置常用命令的别名以方便操作, 例如:

git config --global alias.s status
git config --global alias.co checkout
git config --global alias.df diff
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.amend "commit --amend"

其他配置, 例如显示的格式和颜色, 自动处理换行符等

git config --global color.ui auto
git config --global log.date local
git config --global core.autocrlf input

以上的配置都使用了 --global 选项, 这样配置就会写进全局配置文件 ~/.gitconfig, 供所有 Git 项目使用. 也可以直接修改这个文件来添加或修改上述配置.

每个 git 项目都有一个 .git 文件夹, 此文件夹下的 config 文件存储了特定这个项目的 Git 配置, 就是说这些配置会覆盖 ~/.gitconfig 中的配置.

具体配置可以参考 git help config 和我的 .gitconfig 示例.

日常工作流程

克隆项目(用于第一次下载项目)

git clone git@my-git-server:project.git
cd project

从服务器同步分支 (更新本地分支), 例如同步 master 分支:

git co master
git pull origin master

开发新功能/修复bug

# --- 0. 在本地创建并切换到新分支 ---
git co -b my-new-feature
# 如果已经创建过直接用 git co my-new-feature

# --- 1. 编写/修改代码并提交 ---
# 编写/修改代码
# 查看文件修改状态
git s
# 查看本地所做的更改
git df
# 如果已经 add 了更改, 使用
git df --cached

# 添加需要提交的文件
git add file-to-add

# 如果需要提交所有 app 文件夹下新增的文件, 可以使用 git add app
# 如果需要提交当前文件夹下所有新增的文件, 使用 git add .
# 如果 add 了不想提交的文件, 想撤销, 使用 git reset file-not-to-add

# 如果想把文件从版本库里删除, 可以直接删除并在提交是使用 git commit -a
# 或者使用 git rm file-to-remove
# 如果是删除文件夹, 使用 git rm -r folder-to-remove

# 下面是提交并编写提交消息
git commit # 此时会打开编辑器 (例如vim) 供填写提交消息, 即此次提交代码的描述.
# 如果想直接在提交的同时提供提交消息, 使用 git commit -m "my commit message"

# 如果没有新增的文件需要 add, 即刚才仅仅修改或删除了文件, 那么上面两步可以简写为 git commit -a
# 或 git commit -am "my commit message"

# --- 2. 把当前分支推送到到远程仓库 ---
git push -u origin my-new-feature
# 之后再 push 时可以直接用 git push (因为上面用了 -u 选项)
# 同步服务器同名分支到本地直接用 git pull
# 最好经常 push 和 pull, 让其他人看到自己的开发情况,
# 也能让自己的代码在服务器上多个备份

# --- 3. 同步 master 的提交到自己的分支 ---
# (这一步最好也经常执行, 以防冲突过多)
# 首先从服务器上获取 master 分支的最新提交
git fetch origin master # 一般也可以直接用 git pull 或 git fetch 来同步所有分支
# 自己的分支提交次数不多时建议使用 rebase:
git rebase origin/master
#   如果存在冲突, 在解决冲突之后
#     使用 git add conflicted-files
#     然后 git commit
#     然后 git rebase --continue
#     (如果想终止 rebase 操作, 使用 git rebase --abort)
# 自己的分支提交次数很多时, merge 可能比 rebase 好:
# git merge origin/master

# --- 4. 重复 1 ~ 3 步 ---
# 直到功能开发完毕/bug修复完毕

# --- 5.将自己的分支合并回 master ---
# 确保刚刚完成第3步的内容: 同步 master 的提交到自己的分支
# 然后切换到 master 分支
git co master
# 合并分支
git merge my-new-feature
# 然后将本地的提交推送到远程仓库
git push
#   如果提示没有指定 push 到哪个分支, 则使用
#   git push -u origin master
#   以后可以直接使用 git push

# --- 6. 清理分支 ---
# 删除本地分支
git br -d my-new-feature
# 删除远程仓库的分支 (push 时在分支前面加上冒号)
git push origin :my-new-feature

# --- 其他常用命令 ---

# 查考提交记录
git log
# 如果提交记录超过一屏, 会自动使用 less 查看 (按 q 键退出查看)
# less 的使用方法可以用 man less 查看

# 只查看最近3次提交
git log -3

# 同时查看代码行数变化
git log --stat # 使用+-表示
git log --numstat # 使用数字表示

# 同时查看代码详细更改
git log -p

# 按时间顺序显示最近24小时的提交, 并查看行数变化和代码更改
git log -p --since=yesterday --reverse --stat
# 对于选项复杂但经常使用的命令, 可以使用前面说的 alias

# 查看一个文件的每一行的最后修改人
git blame file-to-check