Git

从工作区去除大量已删除文件

当用 /bin/rm 命令删除了大量文件之后,你可以用下面一条命令从工作区和索引中去除这些文件,以免一个一个的删除:

  1. $ git rm $(git ls-files -d)

例如:

  1. $ git status
  2. On branch master
  3. Changes not staged for commit:
  4. deleted: a
  5. deleted: c
  6. $ git rm $(git ls-files -d)
  7. rm 'a'
  8. rm 'c'
  9. $ git status
  10. On branch master
  11. Changes to be committed:
  12. deleted: a
  13. deleted: c

上一个分支

快速检出上一个分支:

  1. $ git checkout -
  2. # Switched to branch 'master'
  3. $ git checkout -
  4. # Switched to branch 'next'
  5. $ git checkout -
  6. # Switched to branch 'master'

进一步了解 Git 分支.

去除空白

Git Stripspace 命令可以:

  • 去掉行尾空白符
  • 多个空行压缩成一行
  • 必要时在文件末尾增加一个空行

使用此命令时必须传入一个文件,像这样:

  1. $ git stripspace < README.md

进一步了解 Git stripspace 命令.

检出 Pull Requests

对 Github 仓库来说,Pull Request 是种特殊分支, 可以通过以下多种方式取到本地:

取出某个特定的 Pull Request 并临时作为本地的 FETCH_HEAD 中以便进行快速查看更改( diff )以及合并( merge ):

  1. $ git fetch origin refs/pull/[PR-Number]/head

通过 refspec 获取所有的 Pull Request 为本地分支:

  1. $ git fetch origin '+refs/pull/*/head:refs/remotes/origin/pr/*'

或在仓库的 .git/config 中加入下列设置来自动获取远程仓库中的 Pull Request

  1. [remote "origin"]
  2. fetch = +refs/heads/*:refs/remotes/origin/*
  3. url = git@github.com:tiimgreen/github-cheat-sheet.git
  1. [remote "origin"]
  2. fetch = +refs/heads/*:refs/remotes/origin/*
  3. url = git@github.com:tiimgreen/github-cheat-sheet.git
  4. fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

对基于派生库的 Pull Request,可以通过先 checkout 代表此 Pull Request 的远端分支再由此分支建立一个本地分支:

  1. $ git checkout pr/42 pr-42

操作多个仓库的时候,可以在 Git 中设置获取 Pull Request 的全局选项。

  1. git config --global --add remote.origin.fetch "+refs/pull/*/head:refs/remotes/origin/pr/*"

此时可以在任意仓库中使用以下命令:

  1. git fetch origin
  1. git checkout pr/42

进一步了解如何本地检出 pull request.

没有任何改动的提交

可以使用--allow-empty选项强制创建一个没有任何改动的提交:

  1. $ git commit -m "Big-ass commit" --allow-empty

这样做在如下几种情况下是有意义的:

  • 标记新的工作或一个新功能的开始。
  • 记录对项目的跟代码无关的改动。
  • 跟使用你仓库的其他人交流。
  • 作为仓库的第一次提交,因为第一次提交后不能被 rebase: git commit -m "init repo" --allow-empty.

美化 Git Status

在命令行输入如下命令:

  1. $ git status

可以看到:

git status

加上-sb选项:

  1. $ git status -sb

这会得到:

git status -sb

进一步了解 Git status 命令.

美化 Git Log

输入如下命令:

  1. $ git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

可以看到:

git log --all --graph --pretty=format:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

这要归功于 Palesz 在 stackoverflow 的回答。

这个命令可以被用作别名,详细做法见这里

进一步了解 Git log 命令.

Git 查询

Git 查询运行你在之前的所有提交信息里进行搜索,找到其中和搜索条件相匹配的最近的一条。

  1. $ git show :/query

这里 query (区别大小写)是你想要搜索的词语, 这条命令会找到包含这个词语的最后那个提交并显示变动详情。

  1. $ git show :/typo

git show :/query

  • q 键退出命令。*

合并分支

输入命令:

  1. $ git branch --merged

这会显示所有已经合并到你当前分支的分支列表。

相反地:

  1. $ git branch --no-merged

会显示所有还没有合并到你当前分支的分支列表。

进一步了解 Git branch 命令.

修复有问题的提交以及自动合并

如果上一个或多个提交包含了错误,可以在你修复问题后使用下列命令处理(假设要修复的提交版本是abcde):

  1. $ git commit --fixup=abcde
  2. $ git rebase abcde^ --autosquash -i

进一步了解 Git commit 命令.
进一步了解 Git rebase 命令.

以网站方式查看本地仓库

使用 Git 的 instaweb 可以立即在 gitweb 中浏览你的工作仓库。这个命令是个简单的脚本,配置了 gitweb 和用来浏览本地仓库的Web服务器。(译者注:默认需要lighttpd支持)

  1. $ git instaweb

执行后打开:

Git instaweb

进一步了解 Git instaweb 命令.

Git 配置

所有 Git 配置都保存在你的 .gitconfig 文件中。

Git 命令自定义别名

别名用来帮助你定义自己的 git 命令。比如你可以定义 git a 来运行 git add --all

要添加一个别名, 一种方法是打开 ~/.gitconfig 文件并添加如下内容:

  1. [alias]
  2. co = checkout
  3. cm = commit
  4. p = push
  5. # Show verbose output about tags, branches or remotes
  6. tags = tag -l
  7. branches = branch -a
  8. remotes = remote -v

…或者在命令行里键入:

  1. $ git config --global alias.new_alias git_function

例如:

  1. $ git config --global alias.cm commit

指向多个命令的别名可以用引号来定义:

  1. $ git config --global alias.ac 'add -A . && commit'

下面列出了一些有用的别名:

别名 Alias 命令 Command 如何设置 What to Type
git cm git commit git config --global alias.cm commit
git co git checkout git config --global alias.co checkout
git ac git add . -A git commit git config --global alias.ac '!git add -A && git commit'
git st git status -sb git config --global alias.st 'status -sb'
git tags git tag -l git config --global alias.tags 'tag -l'
git branches git branch -a git config --global alias.branches 'branch -a'
git cleanup `git branch —merged grep -v ‘*’ xargs git branch -d` `git config —global alias.cleanup “!git branch —merged grep -v ‘*’ xargs git branch -d”`
git remotes git remote -v git config --global alias.remotes 'remote -v'
git lg git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit -- git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --"

自动更正

如果键入 git comit 你会看到如下输出:

  1. $ git comit -m "Message"
  2. # git: 'comit' is not a git command. See 'git --help'.
  3. # Did you mean this?
  4. # commit

为了在键入 comit 调用 commit命令,只需启用自动纠错功能:

  1. $ git config --global help.autocorrect 1

现在你就会看到:

  1. $ git comit -m "Message"
  2. # WARNING: You called a Git command named 'comit', which does not exist.
  3. # Continuing under the assumption that you meant 'commit'
  4. # in 0.1 seconds automatically...

颜色输出

要在你的 Git 命令输出里加上颜色的话,可以用如下命令:

  1. $ git config --global color.ui 1

进一步了解 Git config 命令.

Git 资源

Title Link
Official Git Site http://git-scm.com/
Official Git Video Tutorials http://git-scm.com/videos
Code School Try Git http://try.github.com/
Introductory Reference & Tutorial for Git http://gitref.org/
Official Git Tutorial http://git-scm.com/docs/gittutorial
Everyday Git http://git-scm.com/docs/everyday
Git Immersion http://gitimmersion.com/
Ry’s Git Tutorial http://rypress.com/tutorials/git/index.html
Git for Computer Scientists http://eagain.net/articles/git-for-computer-scientists/
Git Magic http://www-cs-students.stanford.edu/~blynn/gitmagic/
GitHub Training Kit http://training.github.com/kit
Git Visualization Playground http://onlywei.github.io/explain-git-with-d3/#freeplay

Git 参考书籍

Title Link
Pragmatic Version Control Using Git http://www.pragprog.com/titles/tsgit/pragmatic-version-control-using-git
Pro Git http://git-scm.com/book
Git Internals Pluralsight https://github.com/pluralsight/git-internals-pdf
Git in the Trenches http://cbx33.github.com/gitt/
Version Control with Git http://www.amazon.com/Version-Control-Git-collaborative-development/dp/1449316387
Pragmatic Guide to Git http://www.pragprog.com/titles/pg_git/pragmatic-guide-to-git
Git: Version Control for Everyone http://www.packtpub.com/git-version-control-for-everyone/book