Git实用技巧:打包、补丁、环境切换、修改记录和加速
Git是一个非常强大和灵活的分布式版本控制系统,它可以帮助我们高效地管理代码,协作开发,追踪变更,解决冲突等。但是Git也有一些不太常用或者不太熟悉的功能和技巧,如果掌握了这些技巧,可以让我们的Git使用更加方便和高效。
本文将介绍以下几个Git实用技巧:
- Git打包差异化:如何使用Git打包不同版本或者不同分支之间的差异文件或者补丁文件。
- Git环境和Repo环境切换:如何在使用Repo工具同步代码时,切换到Git管理环境,以便使用Git命令。
- Git批量修改Git Commit记录里的用户名和邮箱:如何在提交历史中批量修改错误的用户名或者邮箱信息。
- Git命令别名设置:如何为常用的Git命令设置简短的别名,以便快速输入。
- Git下载很慢问题解决方案:如何使用镜像链接或者浏览器插件来加速Git下载速度。
- Github/googlesource/chromium下载Timed out解决办法:如何在终端中设置代理来解决下载超时的问题。
一、Git打包差异化
有时候我们需要把不同版本或者不同分支之间的差异文件或者补丁文件打包成一个压缩文件,以便于传输或者备份。Git提供了一些命令来实现这个功能。
差异文件打包
如果我们想要打包当前工作区与暂存区之间的差异文件,可以使用以下命令:
git diff --name-only | xargs zip dmtseic.zip
这个命令会把git diff --name-only
输出的文件名作为参数传递给xargs
命令,然后用zip
命令把这些文件压缩成一个名为dmtseic.zip
的文件。
两次提交差异文件打包
如果我们想要打包两次提交之间的差异文件,可以使用以下命令:
git diff f8a726 909e0e --name-only | xargs zip consumer_vstorage.zip
这个命令会把两次提交f8a726
和909e0e
之间的差异文件名输出,并用zip
命令把这些文件压缩成一个名为consumer_vstorage.zip
的文件。
最后一次提交文件打包
如果我们想要打包最后一次提交所涉及的文件,可以使用以下命令:
git show --name-only | xargs zip last.zip
这个命令会把最后一次提交所修改或者添加的文件名输出,并用zip
命令把这些文件压缩成一个名为last.zip
的文件。
打包指定的commit_id
如果我们想要打包指定提交所修改或者添加的文件,可以使用以下命令:
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf mytarfile.tar
这个命令会把指定提交所修改(M)、添加(A)、复制(C)、重命名(R)或者修改类型(T)的文件名输出,并用tar
命令把这些文件压缩成一个名为mytarfile.tar
的文件。其中,$commit_id
是要打包的提交的ID,可以是完整的40位哈希值,也可以是简写的前几位。
差异补丁打包
如果我们想要打包不同版本或者不同分支之间的差异补丁,可以使用以下命令:
git format-patch -M master
这个命令会把当前分支与master
分支之间的差异补丁打包成一个或者多个以.patch
为后缀的文件。我们可以使用不同的选项来指定打包的范围,例如:
git format-patch -s 3005d6bfce45321dab853a3fa3724469acc84df7
:打包从指定提交到最新提交之间的补丁。git format-patch --root 3005d6bfce45321dab853a3fa3724469acc84df7
:打包从根提交到指定提交之间的补丁。git format-patch 3005d6..1f1342
:打包两次提交之间的补丁。git format-patch –n 3005d6
:打包指定提交(含)之前的n次提交。
我们还可以使用其他参数来修改打包的结果,例如:
--numbered-files
:只使用编号作为文件名,不包含提交信息。--stdout
:指定输出位置,例如当所有补丁输出到一个文件。-o <dir>
:指定补丁的存放目录。
检查和应用补丁
如果我们想要检查或者应用已经打包好的补丁文件,可以使用以下命令:
git apply --stat 0001-limit-log-function.patch #查看补丁的情况 git apply --check 0001-limit-log-function.patch #检查补丁是否能够应用成功,如果没有任何输出,则说明无冲突,可以应用 git apply 0001-limit-log-function.patch #应用补丁,但不会自动提交 git am 0001-limit-log-function.patch #应用并提交补丁,会保留原来的提交信息
二、Git环境和Repo环境切换
Repo是一个基于Git的工具,它可以帮助我们管理多个Git仓库。它常用于Android开发中,因为Android系统由很多个Git仓库组成。当我们使用Repo工具同步代码时,我们需要切换到Repo管理环境,以便使用Repo命令。当Repo同步完成后,我们需要切换到Git管理环境,以便使用Git命令。
切换到Repo环境
当我们需要用Repo同步最新的代码时,可以使用以下脚本切换到Repo环境:
#! /bin/sh gits=`find . -name .git` for git in $gits do mv $git ${git}-bak done gitignores=`find . -name .gitignore` for gitignore in $gitignores do mv $gitignore ${gitignore}-bak done
这个脚本会把所有.git
和.gitignore
文件重命名为.git-bak
和.gitignore-bak
,这样就可以避免Git干扰Repo的操作。
切换到Git环境
当Repo同步完成后我们需要切换到Git管理环境,可以使用以下脚本切换到Git环境:
#! /bin/sh gits=`find . -name .git-bak` for git in $gits do mv $git ${git%-bak*} done gitignores=`find . -name .gitignore-bak` for gitignore in $gitignores do mv $gitignore ${gitignore%-bak*} done mv .git-bak .git mv .gitignore-bak .gitignore
这个脚本会把所有.git-bak
和.gitignore-bak
文件恢复为.git
和.gitignore
,这样就可以使用Git命令来管理代码了。
三、Git批量修改Git Commit记录里的用户名和邮箱
有时候我们可能会在提交代码时,使用了错误的用户名或者邮箱信息,这样会导致提交历史中显示不正确的作者信息。如果我们想要批量修改提交历史中的用户名或者邮箱信息,可以使用以下脚本:
#!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="旧邮箱地址" CORRECT_NAME="新用户名" CORRECT_EMAIL="新邮箱地址" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' -f --tag-name-filter cat -- --branches --tags
这个脚本会使用git filter-branch
命令来遍历所有的分支和标签,并修改所有匹配旧邮箱地址的提交者和作者的用户名和邮箱为新的用户名和邮箱。需要注意的是,这个操作会重写提交历史,所以在执行之前最好做好备份,并且在执行之后需要强制推送到远程仓库。
四、Git命令别名设置
Git提供了一种别名设置功能,可以简化命令的输入。例如,我们可以设置"st"为"status"的别名,如下:
git config --global alias.st status
这样,我们就可以用git st
来代替git status
了。我们还可以为其他常用的Git命令设置别名,例如:
git config --global alias.df diff git config --global alias.co checkout git config --global alias.br branch git config --global alias.cm commit git config --global alias.cfg config
这些别名设置会保存在用户目录下的.gitconfig
文件中,我们可以随时修改或者删除它们。
五、Git下载很慢问题解决方案
有时候我们在使用Git下载代码时,可能会遇到速度很慢或者无法连接的问题,这可能是因为网络环境或者服务器的原因。我们可以使用以下方法来加速Git下载速度:
镜像链接修改
如果我们要下载的代码是托管在Github上的,我们可以把原链接中的github.com
替换为一些镜像网站的域名,例如:
- 原链接是
https://github.com/aaron201912/UuidSSDPlayer.git
- 可以替换为:
https://github.com.cnpmjs.org/aaron201912/UuidSSDPlayer.git
https://hub.fastgit.org/aaron201912/UuidSSDPlayer.git
这样就可以利用镜像网站来加速下载速度了。
使用浏览器插件
如果我们不想每次都修改链接,我们也可以使用一些浏览器插件来自动替换链接。例如,我们可以安装一个名为"Github 加速"的插件,它可以自动把Github上的链接替换为镜像网站的链接,并提供一些其他功能,如克隆、下载、查看等。
六、Github/googlesource/chromium下载Timed out解决办法
如果我们在下载Github/googlesource/chromium等网站上的代码时,出现了Timed out(超时)的错误,这可能是因为终端没有走代理流量。我们可以使用以下命令来设置代理:
git config --global http.proxy "localhost:port"
其中,localhost:port
是我们本地代理的地址和端口,例如localhost:1080
。这样,我们就可以让Git通过代理来下载代码了。
总结
本文介绍了以下几个Git实用技巧:
- Git打包差异化:如何使用Git打包不同版本或者不同分支之间的差异文件或者补丁文件。
- Git环境和Repo环境切换:如何在使用Repo工具同步代码时,切换到Git管理环境,以便使用Git命令。
- Git批量修改Git Commit记录里的用户名和邮箱:如何在提交历史中批量修改错误的用户名或者邮箱信息。
- Git命令别名设置:如何为常用的Git命令设置简短的别名,以便快速输入。
- Git下载很慢问题解决方案:如何使用镜像链接或者浏览器插件来加速Git下载速度。
- Github/googlesource/chromium下载Timed out解决办法:如何在终端中设置代理来解决下载超时的问题。
如果有其他的Git实用技巧,欢迎在评论区分享给大家。谢谢!