一、前言
这里包含了我平时用到的一些 Git 使用方式,大家可作为参考。
二、操作
✪ 同步多个远程仓库分支
将一个远程仓库(例如 gi
)中的所有分支推送到另一个远程仓库(例如 xi
)。
-
首先,确保本地仓库与远程仓库
gi
同步。 如果没有克隆仓库,使用以下命令来克隆:git clone <gi-repository-url>
如果已经克隆了仓库并添加了
gi
作为远程仓库,确保本地仓库包含了gi
中的所有分支:git fetch gi
-
查看所有从
gi
获取的分支(本地分支和远程跟踪分支):git branch -a
-
添加远程仓库
xi
。 使用以下命令:git remote add xi <xi-repository-url>
-
推送所有分支。 对于每一个
gi
的分支,需要先检出该分支,然后推送到xi
。可以使用如下的shell命令(Linux 或 MacOS,Windows 下记得使用Git Bash
):for branch in $(git branch -r | grep 'gi/' | sed 's/gi\///'); do git checkout $branch; git push xi $branch; done
脚本说明:
$(git branch -r | grep 'gi/' | sed 's/gi\///')
列出所有从远程gi
获取的分支,移除gi/
前缀,得到纯分支名。for branch in ...; do ...; done
对每一个分支执行循环:git checkout $branch
检出每一个分支。git push xi $branch
将检出的分支推送到远程仓库xi
。
-
最后,确保
xi
中的所有分支都已经更新。 你可以通过查看xi
的仓库(一般在网页上,当然可能有些大佬会做成 app 也不一定),或者运行:git fetch xi git branch -r
来确认所有分支都已被推送。
✪ 删除一个远程仓库及其对应的远程分支缓存
-
查看当前的远程仓库列表:
git remote -v
-
删除指定的远程仓库:
使用以下命令删除指定的远程仓库(假设要删除的远程仓库名为origin2
):git remote remove origin2
-
清理远程分支缓存:
由于Git会在本地缓存远程分支信息,因此需要手动清理这些缓存。
git fetch --prune
-
确认远程分支已删除:
git branch -r
这里应该看不到与
origin2
相关的任何远程分支。
✪ .gitignore
文件中各种格式写法
.gitignore
文件用于指定 Git 在提交时应忽略的文件和目录。以下是各种格式写法的详细举例:
-
通配符匹配:
-
*
匹配零个或多个字符。*.log # 忽略所有 .log 文件
-
?
匹配单个字符。?.txt # 忽略所有单个字符命名的 .txt 文件,如 a.txt, b.txt
-
[abc]
匹配方括号中的任意单个字符。[abc].txt # 忽略 a.txt, b.txt, c.txt
-
-
目录匹配:
-
斜杠
/
表示目录。/build/ # 忽略根目录下的 build 目录 logs/ # 忽略任何位置的 logs 目录
-
-
递归匹配:
-
**
表示递归匹配任意数量的目录。**/temp # 忽略所有 temp 目录,无论其位置 **/*.bak # 忽略所有 .bak 文件,无论其位置
-
-
注释:
-
以
#
开头的行是注释。# 这是一个注释
-
-
否定模式:
-
以
!
开头的模式表示例外。*.log # 忽略所有 .log 文件 !important.log # 但不忽略 important.log
-
-
文件匹配:
-
直接指定文件名。
secret.txt # 忽略 secret.txt 文件
-
-
多层目录匹配:
-
以斜杠
/
开头表示根目录。/debug/ # 忽略根目录下的 debug 目录
-
-
组合使用:
-
可以组合使用各种规则。
*.tmp /build/ !/build/important.txt
-
-
空行:
-
空行被忽略,可以用于提高可读性。
*.log /build/
-
以下是一个综合例子:
# 忽略所有 .log 文件
*.log
# 忽略根目录下的 debug 目录
/debug/
# 忽略所有 temp 目录
**/temp/
# 忽略所有 .bak 文件
**/*.bak
# 忽略单个字符命名的 .txt 文件
?.txt
# 忽略特定文件
secret.txt
# 忽略所有以 a 或 b 或 c 开头的 .txt 文件
[abc].txt
# 例外规则,不忽略 important.log
!important.log
# 空行被忽略
# 忽略任何位置的 logs 目录
logs/
✪ 更改 Git 子模块(submodule)的 URL
假设有一个子模块位于 path_to/submodule
,原来的 URL 是 https://old.url/repo.git
,需要更改为 https://new.url/repo.git
。
-
进入子模块目录:
cd path_to/submodule
-
更改子模块的远程 URL:
git remote set-url origin https://new.url/repo.git
-
返回到主仓库目录:
cd ../..
-
更新
.gitmodules
文件:
编辑.gitmodules
文件,将 URL 更新为新的 URL:[submodule "path_to/submodule"] path = path_to/submodule url = https://new.url/repo.git
-
更新 Git 配置:
git submodule sync
-
提交更改:
git add .gitmodules git add path_to/submodule/.git git commit -m "Update submodule URL"
✪ 从某次历史记录(commit)中提取某个文件
在 Git 中,要从某次历史记录(commit)中提取某个文件(即使这个文件在那次提交中未被修改)。
假设要提取的文件是 src/main.c
,目标提交的哈希值是 abc123
:
-
找到目标提交的哈希值:
git log
输出类似如下:
commit abc123 Author: Your Name <your.email@example.com> Date: Tue May 14 2024 Commit 很多 message commit def456 Author: Another Name <another.email@example.com> Date: Mon May 13 2024 Commit 一些 message
-
使用
git show
命令提取文件:git show abc123:src/main.c > dir/main.c
-
使用
git checkout
命令提取文件:git checkout abc123 -- src/main.c
第二步和第三步一般任选其一,具体取决于需求和习惯:
两者的区别在于:
git show
只显示文件内容,不会修改工作目录中的文件。git checkout
会直接将文件从指定提交中恢复到当前工作目录,并且这个文件会被标记为已修改(未提交状态)。选择使用哪一个命令取决于具体需求:
- 如果只需要查看或保存文件内容,建议使用
git show
。- 如果需要将文件恢复到工作目录中以便进一步操作,建议使用
git checkout
。