在使用git过程中记录的一些小技巧,希望对大家能有所帮助。


一、彻底删除仓库中的无效文件

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch path/to/your/file' HEAD
git push origin master --force
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now


二、解决 Agent admitted failure to sign using the key 问题 with ssh

之前如果建立 ssh 连接,只要將公钥复制到 ~/.ssh/authorized_keys 就可以利用公钥登入,而不需要建立密码。
现在的 ssh 使用同样的方法会出現错误信息:
Agent admitted failure to sign using the key
解決方法:
使用 ssh-add 指令將私钥加进来(根据个人的密匙命名不同更改 id_rsa)
# ssh-add   ~/.ssh/id_rsa
如果遇到错误:Could not open a connection to your authentication agent.
请先执行:ssh-agent bash

使用putty进行OSChina的SSH登录

1、安装putty完整安装包;
2、使用puTTygen生成puTTY格式的私钥,Load->选择私钥文件->另存为.ppk文件,启动Pageant,将生成的私钥加到代理中Add Key;
3、设置cygwin的环境变量:export GIT_SSH=/cygdrive/e/Program\ Files/PuTTY/plink.exe;
4、先使用plink.exe命令缓存一下SSH连接:/cygdrive/e/Program\ Files/PuTTY/plink.exe -T -i F:/Tools/Programs/Git/cygwin/home/Administrator/.ssh/ddkangfu.ppk git@git.oschina.net;
5、使用clone命令克隆代码:git clone git@git.oschina.net:ddkangfu/evaluation.git
6、如果pull一个分支的时候遇到如下错误时:
$ git pull develop origin/develop
fatal: 'develop' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
执行命令:
git branch --set-upstream develop origin/develop
然后再pull。
7、在使用git时,在未添加.ignore文件前使用 git add . 将所有文件添加到库中,不小心将一些不需要加入版本库的文件加到了版本库中。由于此时还没有提交所以不存在HEAD版本,不能使用 git reset HEAD命令。
解决:(1)使用git rm -r --cached .
        (2)可以运行git reset FILE`, 他可以将File从当前要提交的文件集合中移除(未验证), git reset HEAD yourfile


四、git-flow --> 一个成功的Git分支模型

介绍:http://nvie.com/posts/a-successful-git-branching-model/
翻译:http://www.juvenxu.com/2010/11/28/a-successful-git-branching-model/
工具:https://github.com/nvie/gitflow
git-flow备忘清单:http://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html

wKiom1MA0v-horoSAAS4v41ef_U068.jpg


五、git diff用法解释

git diff 比较的是工作目录树与暂存区之间的区别。
git diff --cached 比较的是暂存区和版本库最后一个版本的区别。
git diff HEAD 比较的是工作目录树(包括暂存的和未暂存的修改)与版本库最后一个版本的差别。
git diff v1.6.0 -- README 从一个特定点开始文件的修改情况(查看创建v1.6这个标签之后README文件所发生的修改)
git diff v1.0 v1.1 两次提交的差异比对(对两次快照做差异比对,也即项目的两个版本之间比对--直接在git diff后跟上要比对的两个版本号即可)
git diff v1.6.1.1 v1.6.1.2 --stat 显示v1.6.1.1和v1.6.1.2两个版本之间差异的统计数字,还可以深入查看某个具体文件的变更比对:git diff v1.6.1.1 v1.6.1.2 -- sha1_file.c
git diff ...(branch) 在合并某分枝前查看变更内容(举例来说,如果你创建了一个'dev'的分枝,进入这个分枝给lib/simplegit.rb添加了一个函数,然后回到了'master'分枝,删除了README文件的一行,然后运行:
    git diff master dev 结果会显示你给某个文件中添加了方法,还往README文件添加了一行内容。为什么会这样?因为对'dev'分枝来说,README文件还是原样,而在'master'上,你已经删掉了一行,这样直接对两个快照进行对比就好似'dev'分枝添加了一行进去一样。你想查看的实际上是在创建dev分枝之后在这条分枝上的差异对比,所以应该执行这样的命令:git diff master...dev 这就不会拿master分枝上最后一个快照和dev分枝上最后一个快照进行比对--而是用dev与master所交的那个分歧点和现在的dev分枝上最后一个快照进行比对。在我们这个例子中,这样比对的结果是显示对那个文件添加了一个函数。如果你目前正处在master分枝上,你可以运行:git diff ...dev跟上面的结果是一样的。所以,如果你想查看将要合并的某个分枝会有什么样的变化,可以执行:git diff ...(branch)将branch替换为你想要合并的分枝名即可。