1. 跨分支查找字符串
1 |
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "xxxx" |
解释
git branch -a : 列出所有远程分支,输出格式如下:
1 2 3 4 5 6 7 8 9 |
remotes/origin/trunk/xxx remotes/origin/trunk/xxx remotes/origin/trunk/xxx remotes/origin/trunk/xxx remotes/origin/trunk/xxxxx remotes/origin/trunk/xxxx remotes/origin/trunk/xxxx remotes/origin/trunk/xxxx remotes/origin/trunk/xxxxx |
sed 是一种在线编辑器,它一次处理一行内容。-e :直接在命令列模式上进行 sed 的动作编辑;
grep : 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。-v 反转查找。-e<范本样式> 指定字符串作为查找文件内容的范本样式。
xargs命令 是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。这里用于把前面命令的输出做为git grep的输入
2. git push本地仓库到远端
介绍:
- 首先你需要在远程git分配一个代码仓库,你会获得一个ssh链接或者http链接
- 然后在本地的remote映射表中添加映射:git remote add <待推送本地代码库别名> <远程git仓库分配链接>
- push本地的分支到远程
详细使用步骤:
1 2 3 4 5 |
git init //初始化文件夹为代码仓库 git add . //添加本地所有文件到 git commit -m "你的提交信息" //向本地仓库提交add的所有文件,默认创建本地master分支 git remote add origin <你的远程仓库地址,可以是ssh或者http的> //将OSC的远程分支拉取到本地 git push -u origin master //提交本地仓库的修改到远程master分支。由于是第一次提交,远端还没有创建任何分支,所以使用-u命令,与远端建立联系。 |
不小心将git远程地址配错了,再次配置提示以下错误:
fatal: 远程 origin 已经存在。
此时只需要将远程配置删除,重新添加即可;
1 |
git remote rm origin |
3. git二分法定位问题
1 2 3 |
1).git bisect start //开始使用git bisect命令 2).git bisect bad <commitID> //标记有问题的节点,如果不加commitID,则默认使用当前节点为问题节点 3).git bisect good <commitID> //然后找出最近一个正确版本的记录,基于此版本的commitID执行该命令 |
执行完上面的命令后,会提示剩余多少步
此时验证如果ok,则输入 git bisect good, 反之则是 bad
经过几个步骤后,就可以找到出错的commit了,最后别忘了退出二分查找回到当前的分支
1 |
4).git bisect reset 重置 |
4. git 打patch方法
1 2 |
git diff 04a2b36f > patch.diff //存储两个commit之间的修改记录 git apply patch.diff //此时你可以切换分支或仓库,并应用上面打出的patch |
5. 给某个commit打tag
1 |
git tag -a v1.2 9fceb02 -m "Message here" |
6. 搜索哪些分支包含指定的commit
仅仅列出包含指定commit的branch列表,下面语句是列出本地所有分支中包含指定commit的分支列表
1 |
git branch --contains <commit> |
以下语句列出远程分支中所有包含该commit的分支列表,执行此命令之前最好git fetch一下,保证远程分支最新
1 |
git branch -r --contains <commit> |
例子:
1 2 3 4 5 6 7 8 9 10 |
$ git log -1 tests commit d590f2ac0635ec0053c4a7377bd929943d475297 Author: Nick Quaranto <nick@quaran.to> Date: Wed Apr 1 20:38:59 2009 -0400 Green all around, finally. $ git branch --contains d590f2 tests * master |
7. 查看单个commit修改的文件列表
方法一:
1 2 3 4 |
$ git diff-tree --no-commit-id --name-only -r bd61ad98 index.html javascript/application.js javascript/ie6.js |
方法二:
1 2 3 4 5 |
$ git show --pretty="" --name-only bd61ad98 index.html javascript/application.js javascript/ie6.js |
- –no-commit-id :隐藏commit-id显示
- –pretty :传空串可以避免字符串开始处的多余的显示
- –name-only :仅仅显示文件名
- –name-status:显示新增、修改和删除的文件清单,上面的命令把–name-only改为–name-status,同样会列出文件列表,同时文件列表前面会标记增删改等操作
- -r :递归 sub-trees
8、查看远程代码仓库地址命令
1 |
git remote -v |
例子:
后面括号里面标识了该URL对应的命令,例如:fetch, push
9、从指定commit拉出分支(git checkout branch with a specified commit)
1 |
git checkout -b name-of-new-branch 169d2dc |
10、git 删除本地和远程tag
1. 删除本地tag
1 |
git tag -d <tagname> |
2. 删除远程的tag
1 |
git push origin --delete tag <tagname> |
11、git查看远程和本地tag(git show remote and local tags)
显示远程tag列表命令:
1 |
git ls-remote --tags origin |
显示本地tag列表命令:
1 |
git tag |
12、重命名远程分支
不能直接修改远程分支名,需要先删除远程分支,然后修改本地分支名,再推送本地修改后的分支名到远程。具体操作步骤如下:
1)先删除远程分支
1 |
git push origin :<to-modify-name-branch> |
2) 修改本地分支名
1 |
git branch -m <local_to_modifyname_branch> <local_new_name_branch> |
3) 推送本地分支到远程
1 |
git push origin <local_branch_name>:<remote_branch_name> |
4) commit时会提示上游分支分当前分支不匹配
方法一:指定想推送到的远程分支
1 |
git push origin feature/xxxx |
方法二:所有本地已存在的同名分支到远程仓库
这个方法需要慎用,因为会导致你在push当前分支的时候也推送其它所有的同名分支。导致你不想要的提交push到服务器了。
1 |
git config --global push.default matching |
警告:push.default (默认push)未设置;在Git 2.0 中,push.default 的值从‘matching’改为‘simple’了。消除此警告并保留以前的习惯,可以用上面的命令改为’matching’
13、git 列出2个commit之间修改的文件
a) 列出所有修改的文件列表
1 |
git diff --name-only SHA1 SHA2 |
b) 如果想要知道文件的状态,例如新增,删除,修改的状态
1 |
git diff --name-status SHA1 SHA2 |
File status flags:
M modified – File has been modified
C copy-edit – File has been copied and modified
R rename-edit – File has been renamed and modified
A added – File has been added
D deleted – File has been deleted
U unmerged – File has conflicts after a merge
c) 如果想要了解这些改动文件的一些统计信息
1 |
git diff --stat SHA1 SHA2 |
1 2 3 4 5 6 7 8 9 10 11 |
$ git diff --stat HEAD~5 HEAD .../java/org/apache/calcite/rex/RexSimplify.java | 50 +++++++++++++++++----- .../apache/calcite/sql/fun/SqlTrimFunction.java | 2 +- .../apache/calcite/sql2rel/SqlToRelConverter.java | 16 +++++++ .../org/apache/calcite/util/SaffronProperties.java | 19 ++++---- .../org/apache/calcite/test/RexProgramTest.java | 24 +++++++++++ .../apache/calcite/test/SqlToRelConverterTest.java | 8 ++++ .../apache/calcite/test/SqlToRelConverterTest.xml | 15 +++++++ pom.xml | 2 +- .../apache/calcite/adapter/spark/SparkRules.java | 7 +-- 9 files changed, 117 insertions(+), 26 deletions(-) |
14、查看单个commit修改行数统计
git命令:
1 |
git show <commit-id> --pretty=tformat: --numstat | awk '{inserted+=$1; deleted+=$2; delta+=$1-$2; ratio=deleted/inserted} END {printf "Commit stats:\n- Lines added (total).... %s\n- Lines deleted (total).. %s\n- Total lines (delta).... %s\n- Add./Del. ratio (1:n).. 1 : %s\n", inserted, deleted, delta, ratio }' - |
输出:

15、查看提交历史中哪个commit和哪个文件增加或删除了指定的字符串
1 |
git log -S'search string' --oneline --name-status |

16、index file corrupt
1、如果是staging area的index问题:
在 OSX/Linux:平台
1 2 |
rm -f .git/index git reset |
在Windows平台:
1 2 |
del .git\index git reset |
2、如果是packfile的index问题
1 |
git index-pack |
staging area
staging area 是一个文件,通常包含在您的Git目录中,存储有关将在下一次提交中进行的操作的信息。它在Git用语中的技术名称是“索引”,但是用“staging area”词来描述也是OK的。
基本的git工作流程如下:
- 您修改git工程中的文件
- 您可以选择性地暂存您希望成为下一次提交一部分的更改,这些更改只会将这些更改添加到暂存区域(staging area)。
- 您执行提交,它会将保存在暂存区域(staging area)中的文件快照永久存储到您的Git目录中。
如果文件的特定版本在Git目录中,它被认为是已经committed(已提交)。如果这个文件被修改并添加到暂存区域(staging area),它的状态是已暂存。如果它在被check out(检出)后被修改但是没有被暂存(不是已暂存状态),那么它的状态时已修改。在Git基础里面,您将了解有关这些状态的更多信息,以及如何利用它们或完全跳过分阶段部分。
15、Git 跨仓库 cherry-pick commit
1 2 3 4 5 6 7 8 |
# 将另一个仓库添加到远端分支 git remote add proj https://分支地址.git # 拉取远端仓库的数据 git fetch proj # 合并指定的提交,后面是另一个分支的提交Hash git cherry-pick sjfdishudf877s8df7sdf git cherry-pick fidfjiuhisdu87sdhf7yf |