【Git 教程】Git 进阶使用方法

本文介绍了Git中的Stash、Cherry-pick、Reflog等核心命令,以及如何修改历史提交、使用别名、管理子模块、设置钩子、浅克隆、Bisect、归档、撤销、清理和使用.gitignore。
摘要由CSDN通过智能技术生成

一、Stash 使用

git stash 命令用于临时保存和恢复未完成的工作。

  • 保存当前工作状态:

    git stash save "stash message"
    

    最新的建议写法:

    git stash puth -m "stash message"
    

    这会创建一个新的 stash,你可以提供一个消息来进行描述。

  • 查看所有保存的 stash:

    git stash list
    
  • 恢复最近的 stash:

    git stash pop
    

    这会将最近的 stash 应用到当前分支,并从 stash 列表中删除它。

  • 恢复指定的 stash:

    git stash apply stash@{n}
    

    其中 n 是你想要应用的 stash 的索引。

该功能我常用于分支间临时更改的切换,例如我在 A 分支更改了很多内容,后面发现这些更改本应在 B 分支进行处理的,此时这个功能就非常有用。

二、Cherry-pick 使用

git cherry-pick 命令用于选择一个或多个提交并应用到当前分支。

  • 应用单个提交:

    git cherry-pick <commit-hash>
    

    这会将指定的提交应用到当前分支,当然它们的哈希值会不一样

  • 应用多个提交:

    git cherry-pick <commit-hash1> <commit-hash2> <commit-hash3>
    

    你可以一次应用多个提交。

  • 解决 cherry-pick 冲突:

    如果在 cherry-pick 过程中发生冲突,你需要手动解决它们,然后执行以下命令完成 cherry-pick

    git add <冲突文件>
    git cherry-pick --continue
    

三、Reflog 使用

git reflog 命令显示当前分支的最近操作日志。

  • 查看当前分支的 reflog:

    git reflog
    

    这将显示当前分支的提交历史,包括已经被删除的提交。

  • 恢复已删除的提交:

    如果你想恢复一个已经被删除的提交,你可以使用 git cherry-pick 或者 git reset 命令。

四、修改历史提交

有时候你可能需要修改历史提交。

  • 修改最近一次提交:

    git commit --amend
    

    这会打开编辑器让你修改提交信息,并且可以添加或修改此次提交的文件。

  • 修改历史中的多个提交:

    git rebase -i <commit-hash>^
    

    在交互式 rebase 界面中,你可以选择要修改的提交,并将其更改为 edit 状态。然后使用 git commit --amend 修改提交,接着使用 git rebase --continue 继续执行 rebase。

    看不懂 ^ 符号的可以去看 【Git 教程】Git 基本使用方法

五、使用别名

为了提高命令行操作的效率,可以为常用的 Git 命令设置别名(在 【Git 教程】Git 基本使用方法 中我们也已经展示了一下,不过那是通过直接更改配置文件来达到目的的)。

  • 设置别名:

    git config --global alias.co checkout
    git config --global alias.br branch
    git config --global alias.ci commit
    

    .gitconfig 文件中配置这些别名,以便它们在所有仓库中生效。

六、Submodule 使用

git submodule 命令用于管理子模块。

此命令可以达到 svn目录权限效果。

  • 添加子模块:

    git submodule add <repository> <path>
    

    这会在指定的路径下添加子模块。

  • 更新子模块:

    git submodule update --init --recursive
    

    这会初始化、递归地更新所有子模块。

七、钩子(Hooks)使用

Git 钩子可以在 Git 操作的特定阶段运行自定义脚本。所有钩子均被放置在 Git 目录下的一个特定子目录,即我们通常在大多数项目中看到的 .git/hooks 目录。在通过 git init 命令创建新的版本库的时候,Git 会自动在这个位置部署一些示范脚本。这些脚本不仅具备可执行性,还会展示当它们激活时传递的参数。虽然这些示例脚本主要是用 shell 编写的,部分还包含了 Perl 代码,但实际上,只要脚本命名得当且具备可执行属性,可以使用任何编程语言来编写,无论是 RubyPython 或者其他你所擅长的语言皆可。

  • 安装钩子:

    将自定义脚本放在 .git/hooks 目录下的相应位置。例如,pre-commit 钩子在提交之前运行。

  • 示例 pre-commit 钩子:

    #!/bin/bash
    # 检查代码风格
    if ! git diff-index --cached --name-only HEAD | grep -E '\.jsx\?$' | xargs eslint; then
        exit 1
    fi
    

    在这个例子中,钩子会在提交前运行 ESLint 检查。

八、浅克隆(Shallow Clone)

git clone 命令的 --depth 选项用于创建浅克隆。

  • 创建浅克隆:

    git clone --depth=1 <repository>
    

    这会克隆仓库的最新一次提交,而不包括完整的历史记录。

九、Bisect 使用

git bisect 命令用于在 Git 历史中查找引入 bug 的提交。(这个功能我自己也少用,没法解说的太详细,大家凑合看看吧。。。)

  • 启动 bisect:

    git bisect start
    
  • 标记一个已知包含 bug 的提交:

    git bisect bad <commit-hash>
    
  • 标记一个已知不包含 bug 的提交:

    git bisect good <commit-hash>
    
  • 使用 gitk 查看当前 bisect 过程中剩余的提交信息:

    git bisect visualize
    

十、Archive 使用

git archive 命令用于将 Git 仓库打包成一个归档文件。

  • 创建归档文件:

    git archive --format zip --output archive.zip HEAD
    

    这将创建一个名为 archive.zip 的归档文件,其中包含当前提交(HEAD)的代码。

    据我使用经验所知,打包成的归档文件并不会包含 .gitignore 中忽略的文件。

十一、Revert 使用

git revert 命令用于撤销 Git 仓库中的提交。

  • 撤销单个提交:

    git revert <commit-hash> -m 1
    

    这将撤销指定提交(<commit-hash>)的一个父提交。

  • 撤销多个提交:

    git revert <commit-hash1>..<commit-hash2> -m 1
    

    这将撤销指定提交范围(<commit-hash1><commit-hash2>)的一个父提交。

  • 撤销提交并保留更改:

    git revert -n <commit-hash>
    

    这将撤销指定提交(<commit-hash>),但不会提交更改。相反,它会将更改留在工作目录中,以便你进行下一步操作。

十二、Clean 使用

git clean 命令用于删除 Git 仓库中未跟踪的文件。

  • 强制删除未跟踪的文件:

    git clean -f
    

    这将强制删除所有未跟踪的文件。

  • 强制删除未跟踪的目录:

    git clean -fd
    

这将强制删除所有未跟踪的文件和目录。

十三、Grep 使用

git grep 命令用于在 Git 仓库中搜索字符串。

  • 搜索当前提交中的字符串:

    git grep "string"
    

    这将搜索当前提交中包含指定字符串(string)的文件。

  • 搜索历史提交中的字符串:

    git grep "string" <commit-hash>
    

    这将搜索指定提交(<commit-hash>)中包含指定字符串(string)的文件。

十四、Rm 使用

git rm 命令用于从 Git 仓库中删除文件或目录。

  • 删除文件:

    git rm <file>
    

    这将删除指定文件(<file>)并从 Git 仓库中移除。

  • 删除目录:

    git rm -r <directory>
    

    这将删除指定目录(<directory>)及其所有子目录和文件,并从 Git 仓库中移除。

  • 强制删除文件或目录:

    git rm -f <file>
    

    这将强制删除指定文件(<file>)或目录(<directory>),而不进行任何确认。

  • 从 Git 仓库中删除文件但不删除文件内容

    如果你只想从 Git 仓库中删除文件,但不删除文件内容,可以使用 git rm --cached 选项。

    git rm --cached <file>
    

    这将从 Git 仓库中删除指定文件(<file>),但不会删除文件内容。

  • 撤销 Git rm 操作

    如果你在执行 git rm 后发现误删了文件,可以使用 git checkout 命令撤销操作。

    git checkout -- <file>
    

    这将撤销对指定文件(<file>)的删除操作。

十五、.gitignore 相关

  • 检查文件是否被 Git 忽略:

    git check-ignore <file>
    

    如果想看所有被 .gitignore 匹配到的忽略的文件/目录,可以这样写:

    git check-ignore *
    
  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Xiao_Ley

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

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

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

打赏作者

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

抵扣说明:

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

余额充值