Git的奇技淫巧

取消跟踪文件

顾名思义也可以理解为:从 Git 中删除文件夹但本地保留

1
2
3
4
5
6
7
git rm -r --cached FileName  ## 这个命令用于从 Git 的版本控制中删除文件,但保留在工作目录中。它会将文件从暂存区(索引)中删除,但不会删除实际的文件。这意味着文件不再被跟踪,但仍然存在于你的工作目录中。
git commit -m "Remove FileName folder from Git" ## 提交删除文件夹的更改到Git历史记录中
git push origin <branch-name> ## push到远程分支


## 扩展
git rm FielName ## 执行命令之后,会将git暂存区文件和本地的彻底清除,慎用!

当你运行 git rm --cached 命令时,Git 会将你指定的文件或文件夹从 Git 仓库中删除,但不会删除实际的文件或文件夹。这意味着文件或文件夹将不再被 Git 跟踪,但仍然存在于你的本地文件系统中。如下图,仓库中存在一个Nginx目录,我不想让他在远程仓库中展示出来但本地又需要用到他,则我可以执行上述命令将它移除git,在提交至远程分支

image-20231120153511097

回滚

保留历史记录

1
git revert
  • 如果想要撤销某个或某些提交的更改,但保留这些提交的历史记录,可以使用 git revert 命令。
  • 运行 git revert <commit>,其中 <commit> 是你想要回滚的提交的标识符(commit identifier)。
  • Git 将创建一个新的提交,该提交将撤销指定提交的更改。这样可以保留原始提交的历史记录,并且其他人在拉取你的更改时不会受到影响。

不保留历史记录

1
git reset
  • 如果需要彻底删除某个或某些提交,并且不保留它们的历史记录,可以使用 git reset 命令。
  • 运行 git reset --hard <commit>,其中 <commit> 是你想要回滚到的目标提交的标识符。
  • Git 将移动当前分支的 HEAD 指针和分支引用到目标提交,并重置工作目录和暂存区以匹配目标提交的状态。这将丢失目标提交之后的所有提交。

请注意,在使用 git revertgit reset 进行回滚之前,确保你理解了回滚操作的影响,并且已经备份了重要的代码。如果你在一个共享的代码库中工作,最好在与团队讨论后再进行回滚操作,以确保不会对其他人的工作产生不良影响。

救命操作

如果你向我一样,没备份文件就直接执行了git reset,那请按照如下找回在 回滚

  1. 使用 git reflog 查找被重置的提交的标识符:

    1
    git reflog

    这将显示你的仓库历史中的操作记录,包括重置操作。查找之前的提交的标识符(commit identifier),它应该类似于 HEAD@{n},其中 n 是一个数字。

  2. 使用 git reset 恢复到之前的提交:

    1
    git reset --hard HEAD@{n}

    <n> 替换为你在第一步中找到的数字。这将移动当前分支的 HEAD 指针和分支引用到之前的提交,并恢复工作目录和暂存区的状态。

image-20231120155916245

撤销提交

在本地执行了git add 及 git commit 操作后,想撤销这两步

  1. 撤销 git add 操作:

    • 执行 git reset 命令可以将暂存区的文件撤销到工作区。例如,如果你执行了 git add file1.txt 将文件添加到暂存区,可以使用命令 git reset file1.txt 将其撤销。
    • 如果你想要撤销所有的 git add 操作,可以使用 git reset 或者 git reset . 命令。
  2. 撤销 git commit 操作:

    • 如果你想要撤销最近一次的 git commit,可以使用 git reset HEAD^ 命令进行撤销。这将撤销最后一次提交,并将暂存区的文件移回到工作区,以便你可以重新修改和提交。

    • 如果你想要完全删除最后一次提交,包括提交的文件内容,可以使用 git reset --hard HEAD^ 命令进行撤销。请注意,这个操作是不可逆的,会永久删除最后一次提交。