【Git 教程】Git 实战综合

一、前言

这里包含了我平时用到的一些 Git 使用方式,大家可作为参考。

二、操作

✪ 同步多个远程仓库分支

将一个远程仓库(例如 gi)中的所有分支推送到另一个远程仓库(例如 xi)。

  1. 首先,确保本地仓库与远程仓库 gi 同步。 如果没有克隆仓库,使用以下命令来克隆:

    git clone <gi-repository-url>
    

    如果已经克隆了仓库并添加了 gi 作为远程仓库,确保本地仓库包含了 gi 中的所有分支:

    git fetch gi
    
  2. 查看所有从 gi 获取的分支(本地分支和远程跟踪分支):

    git branch -a
    
  3. 添加远程仓库 xi 使用以下命令:

    git remote add xi <xi-repository-url>
    
  4. 推送所有分支。 对于每一个 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
  5. 最后,确保 xi 中的所有分支都已经更新。 你可以通过查看 xi 的仓库(一般在网页上,当然可能有些大佬会做成 app 也不一定),或者运行:

    git fetch xi
    git branch -r
    

    来确认所有分支都已被推送。


✪ 删除一个远程仓库及其对应的远程分支缓存

  1. 查看当前的远程仓库列表:

    git remote -v
    
  2. 删除指定的远程仓库:
    使用以下命令删除指定的远程仓库(假设要删除的远程仓库名为 origin2):

    git remote remove origin2
    
  3. 清理远程分支缓存:

    由于Git会在本地缓存远程分支信息,因此需要手动清理这些缓存。

    git fetch --prune
    
  4. 确认远程分支已删除:

    git branch -r
    

    这里应该看不到与 origin2 相关的任何远程分支。


.gitignore 文件中各种格式写法

.gitignore 文件用于指定 Git 在提交时应忽略的文件和目录。以下是各种格式写法的详细举例:

  1. 通配符匹配

    • * 匹配零个或多个字符。

      *.log      # 忽略所有 .log 文件
      
    • ? 匹配单个字符。

      ?.txt      # 忽略所有单个字符命名的 .txt 文件,如 a.txt, b.txt
      
    • [abc] 匹配方括号中的任意单个字符。

      [abc].txt  # 忽略 a.txt, b.txt, c.txt
      
  2. 目录匹配

    • 斜杠 / 表示目录。

      /build/    # 忽略根目录下的 build 目录
      logs/      # 忽略任何位置的 logs 目录
      
  3. 递归匹配

    • ** 表示递归匹配任意数量的目录。

      **/temp    # 忽略所有 temp 目录,无论其位置
      **/*.bak   # 忽略所有 .bak 文件,无论其位置
      
  4. 注释

    • # 开头的行是注释。

      # 这是一个注释
      
  5. 否定模式

    • ! 开头的模式表示例外。

      *.log           # 忽略所有 .log 文件
      !important.log  # 但不忽略 important.log
      
  6. 文件匹配

    • 直接指定文件名。

      secret.txt  # 忽略 secret.txt 文件
      
  7. 多层目录匹配

    • 以斜杠 / 开头表示根目录。

      /debug/     # 忽略根目录下的 debug 目录
      
  8. 组合使用

    • 可以组合使用各种规则。

      *.tmp
      /build/
      !/build/important.txt
      
  9. 空行

    • 空行被忽略,可以用于提高可读性。

      *.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

  1. 进入子模块目录

    cd path_to/submodule
    
  2. 更改子模块的远程 URL

    git remote set-url origin https://new.url/repo.git
    
  3. 返回到主仓库目录

    cd ../..
    
  4. 更新 .gitmodules 文件
    编辑 .gitmodules 文件,将 URL 更新为新的 URL:

    [submodule "path_to/submodule"]
        path = path_to/submodule
        url = https://new.url/repo.git
    
  5. 更新 Git 配置

    git submodule sync
    
  6. 提交更改

    git add .gitmodules
    git add path_to/submodule/.git
    git commit -m "Update submodule URL"
    

✪ 从某次历史记录(commit)中提取某个文件

在 Git 中,要从某次历史记录(commit)中提取某个文件(即使这个文件在那次提交中未被修改)。

假设要提取的文件是 src/main.c,目标提交的哈希值是 abc123

  1. 找到目标提交的哈希值

    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
    
  2. 使用 git show 命令提取文件

    git show abc123:src/main.c > dir/main.c
    
  3. 使用 git checkout 命令提取文件

    git checkout abc123 -- src/main.c
    

第二步和第三步一般任选其一,具体取决于需求和习惯:

两者的区别在于:

  • git show 只显示文件内容,不会修改工作目录中的文件。
  • git checkout 会直接将文件从指定提交中恢复到当前工作目录,并且这个文件会被标记为已修改(未提交状态)。

选择使用哪一个命令取决于具体需求:

  • 如果只需要查看或保存文件内容,建议使用 git show
  • 如果需要将文件恢复到工作目录中以便进一步操作,建议使用 git checkout
  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiao_Ley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值