Git 简易手册

Git 的有多个配置文件,区别在于作用范围的大小:

  • ~/.gitconfig 针对当前用户,对当前用户的所有仓库有效
  • .git/config 只对当前仓库有效

可以直接编辑配置文件,也可以使用命令来设置。

1
2
3
4
5
6
$ cat ~/.gitconfig
[user]
name = Your Name
email = your@example.com
[push]
default = simple

设置用户名和邮箱,用于代码提交时自动署名,方便查看提交日志时区分开发者。

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "your@example.com"
  • --global 保存到 ~/.gitconfig,而不是当前仓库。

列出配置。

1
$ git config --global -l

设置 Git 的默认推送模式为 simple——当我们执行 git push 而没有指定分支时,自动使用当前分支,而不是报错。

1
$ git config --global push.default simple

常用设置:

1
2
3
4
$ # 不关心文件的权限
$ git config --global core.filemode false
$ # 提交时总是以 `\n` 作为换行符
$ git config --global core.autocrlf true

基本操作

工作流

初始化。

1
$ git init

查看状态。

1
$ git status

添加到快照。

1
$ git add .
  • -A 全部文件。

提交到仓库。

1
$ git commit -m "some text..."
  • -m 简短的文字说明。

列出提交历史。

1
$ git log
  • --pretty=oneline 一行一条。

展示某次提交的详情。

1
$ git show <commit_id>

重命名

mv 修改后提交即可。

1
2
$ git mv
$ git commit

比较

比较工作区和快照。

1
$ git diff

比较快照和仓库。

1
$ git diff --staged

回退

撤回 addcommit 操作。

1
$ git reset <commit_id>

仅撤回 commit 操作。

1
$ git reset --soft <commit_id>

重置整个仓库(包括工作区)。

1
$ git reset --hard <commit_id>

关键字 HEAD 表示当前版本。HEAD^ 表示上一个版本;HEAD^^ 符号则表示上上个版本。HEAD~1 等同于 HEAD^HEAD~2 等同于 HEAD^^。下面的两条命令都可以将项目回退到上上个版本。

1
2
$ git reset HEAD^^
$ git reset HEAD~2

堆栈

切换到其他分支时,工作区(或快照)已经发生变化,但又不想立即提交到仓库,可以将工作区(包括快照)暂时保存到堆栈中:

1
$ git stash

切换到其他分支后,可以弹出堆栈的栈顶元素,覆盖(合并)到当前分支的工作区:

1
$ git stash pop

如果只是想让栈顶元素应用到当前工作区而不要从堆栈中删除:

1
$ git stash apply

管理堆栈中的内容:

1
2
3
$ git stash list
$ git stash drop <stash_id>
$ git stash clear

修订提交

针对最新的提交:

1
$ git commit --amend --message "fix bug" --author "you <your@example.com>" --no-edit
  • --message 修改注释。
  • --author 修改署名。
  • --date 修改提交日期。
  • --no-edit 不使用 vim。

手动处理多个提交,先执行 git rebase -i <commit_id>,这会打开编辑器,在编辑器中把需要改动的提交前面的 pick 改为 edit,然后就可以用 git commit --amend ... 开始逐个修改,每修改完一个,须执行一遍 git rebase --continue 才能继续修改下一个。

针对大量提交:

1
$ git filter-branch -f --env-filter "..." HEAD

其中 "..." 由键值对组成,形如 XXX='xxx';,例如:

1
2
3
4
GIT_AUTHOR_NAME='newName';
GIT_AUTHOR_EMAIL='new@example.com';
GIT_COMMITTER_NAME='oldName';
GIT_COMMITTER_EMAIL='oldEmail@example.com';

日志

列出日志。

1
$ git reflog

清空日志。

1
$ git reflog expire --expire=now --all; git gc --prune=now

标签

列出标签。

1
$ git tag

添加标签。

1
$ git tag <tag_name>

删除标签。

1
$ git tag -d <tag_name>

将本地已有的标签同步到远地仓库。

1
$ git push <repo_name> <remote_branch> <tag_name>

删除远地仓库的指定标签。

1
$ git push <repo_name> <remote_branch> :refs/tags/<tag_name>

分支

列出分支。

1
$ git branch

创建分支。

1
$ git branch <branch_name>

删除分支。

1
$ git branch -d <branch_name>

合并分支。

1
$ git merge <other_branch> # 合并其他分支的提交到当前分支

检出

检出某个标签。

1
$ git checkout <tag_name>

检出某次提交,以此创建新的分支。

1
$ git checkout  <commit_id> -b <branch_name>

检出(切换)分支。

1
$ git checkout <branch_name>

远地仓库

远地仓库的地址有 HTTPS 和 SSH 两种形式:

  • HTTPS 形式
    无需额外的配置,但是在每次推送时都需要输入远地仓库所在平台的账户密码以验证身份。

  • SSH 形式
    只需要把 公钥 提供给远地仓库所在平台,可以用下面命令生成 SSH 公钥:

    1
    $ ssh-keygen -t rsa -C "your_email@example.com"

    或者导入现有的私钥,如果私钥文件位于 ~/.ssh/id_rsa

    1
    2
    3
    $ eval "$(ssh-agent -s)"
    $ chmod 400 ~/.ssh/id_rsa
    $ ssh-add ~/.ssh/id_rsa

远地操作

列出远地仓库。

1
$ git remote -v
  • -v 显示远地仓库的地址。

添加远地仓库。

1
$ git remote add <repo_name> <repo_url>
  • repo_name 远地仓库的别名
  • repo_url 远地仓库的地址

移除远地仓库。

1
$ git remote rm <repo_name>

推送至远地仓库。

1
$ git push <repo_name> <remote_branch>
  • repo_name 远地仓库的别名。
  • remote_branch 推送至远地的 remote_branch 分支。
  • tag_name 根据标签推送。