Git 的一些小技巧

节省clone体积

有些时候,我们只想简单学习一下项目代码,这个时候,用 git clone rep_address --depth 1 可以只 clone 每个文件最新的一个提交,这样速度会快很多。

强制推送

一旦推送到远程仓库后,就不要用类似 git reset, git ci --amend, git rebase 等破坏性提交了,否则远程仓库会因为你的新推送不是 Fast Forward 而拒绝提交 (关于什么是 Fast Forward 要讲的太多了,自已看书吧)。如果实在不小心做了。在确定别人没有检出前,用 git push -f 可以强制推送到远程仓库中。如下图:


使用 git svn

在公司没有应用 git 前,你可以用 git svn 来做管理。 git svn 相关命令:

git svn clone -r REV1:HEAD svn_addr local_addrgit svn dcommit  提交到 SVNgit svn fetch    从 svn up 信息git svn rebase   将从 svn up 过来的信息,rebase 成 git 提交git svn rebase --continue  冲突后继续 rebase 信息

用 git svn clone 的时候,带上 -r rev1:HEAD 参数,可以省去将 SVN 整个提交历史抓取下来的时间。

设置常用命令的别名

在用户的 home 目录下,有一个 .gitconfig 文件,里面可以配置一些别名,方便平时的 git 操作。
特别是那些平日使用 SVN 的短命令习惯了的同学,配置一下别名后,使用 git 就会相当顺手了。我配置的别名如下。这里特别多说一句,有些人喜欢将 ci 设置成 commit -a,这样就不用 git add 来把需要提交的文件加入到暂存区了。在《Git 权威指南》中,作者极力反对这样做。因为 Git 本身在提交前有 add 这步,就是为了让提交者能够审视自己的提交文件,以防止错误的提交发生。

[alias]
    st = status -s
    ci = commit
    l = log --oneline --decorate -13
    ll = log --oneline --decorate
    co = checkout
    br = branch
    rb = rebase
    dci = dcommit

删除不在 git 管理下的文件

如果你需要删除 Git 下没有加入到版本库中的文件,可以使用:

git clean -nd 测试删除git clean -fd 真实删除

搭建自己的远程仓库

搭建一个 Git 远程仓库相当简单,直接在一台带 SSH 的服务器上用 git init –bare dirname 即可。本地可以用 git remote 命令来设置多个远程分支。另外,第一次提交的时候,因为远程仓库中没有任何分支,需要用如下指令建立 master 分支:

git remote add origin yourname@yourhost.com:~/path/repository_namegit remote add add2 yourname@yourhost.com:~/path/repository_namegit push origin mastergit push add2 master// 如果 git remote add 设置地址写错了,可以用 git remote set-url 更改:git remote set-url origin yourname@yourhost.com:~/path/repository_name

如何用 Git 将一个文件的历史提交恢复?

上次遇到一个问题,我某次提交改动了很多文件,但是其中有一个是不应该改的。所以我需要把这次提交中关于那个文件的改动撤销。直接用 git checkout 命令可以检出某一个文件的历史版本,然后就可以将对这个文件的改动取消了。如下:

git checkout CommitId fileName git ci -m "revert a file modification"

本地工作区还有未提交的内容时,不能 pull?

可以先用 git stash 将内容暂存,然后再 pull,成功后再 git stash pop 将修改恢复。

提交的邮箱错了?

有些时候,因为同时在 github 和公司内部做提交,所以用 2 个不同的邮箱。如果一个新工程 clone 下来,忘了用 git config 来设置提交用户名和邮箱,就有可能用错误的邮箱作为账号名提交。这个时候,如果你只是错了最近的一次提交而已,可以用如下命令来将最近的一次提交作者名和邮箱修改:

git config user.email your-email@163.comgit config user.name your-namegit commit --amend --reset-author

如果等你发现的时候,已经错了很多提交了。可以用如下命令来一次性修改多个提交的用户名和邮箱:

git filter-branch -f --env-filter "    GIT_AUTHOR_NAME='Tang Qiao'    GIT_AUTHOR_EMAIL='tangqiao@fenbi.com'    GIT_COMMITTER_NAME='Tang Qiao'    GIT_COMMITTER_EMAIL='tangqiao@fenbi.com'" HEAD

提交的时候自动去掉源码末尾的空格

源码末尾的空格几乎都是无意义的,应该去掉的。大多数 review 系统,都会将源码末尾的空格标红。所以,我们何不在提交时让 git 自动帮我们去掉这些空格呢?这个可以通过设置 git 的 hook 来实现,具体方法如下:

用 vim 编辑一个名为 pre-commit 的文件:

vim .git/hooks/pre-commit

输入如下代码,保存退出 vim

#!/bin/shif git-rev-parse --verify HEAD >/dev/null 2>&1 ; then   against=HEADelse   # Initial commit: diff against an empty tree object   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904fi# Find files with trailing whitespacefor FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -E 's/:[0-9]+:.*//' | uniq` ; do    # Fix them!    sed -i '' -E 's/[[:space:]]*$//' "$FILE"    git add "$FILE"done

增加 pre-commit 的运行权根:

chmod +x .git/hooks/pre-commit

让常用操作自动带颜色

默认的 git diff, status, log 什么的都是不带颜色的,可以用如下命令让它们都带上颜色。另外还有一些有趣的命令,一并列在下面。

git config --global --add user.email "email@163.com"git config --global --add user.name "your name"git config --global alias.co checkoutgit config --global alias.br branchgit config --global alias.ci commitgit config --global alias.st status -sgit config --global alias.l log --oneline --decorate -12 git config --global color.diff autogit config --global color.status autogit config --global color.branch autogit config --global merge.tool kdiff3git config --global meregtool.kdiff3.path "/usr/bin/kdiff3"  git config --global alias.visual "!gitk"

自动补全 git 命令

安装 bash-completion: brew install bash-completion

按要求把以下代码增加到 .bash_profile 文件中:

if [ -f `brew --prefix`/etc/bash_completion ]; then  . `brew --prefix`/etc/bash_completionfi
  1. 下载 bash-completion 对于 Git 的支持

cd /usr/local/etc/bash_completion.d/sudo curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
文章导航