聊聊Git的一些事儿(一)

294 阅读5分钟

Git 是一个分布式版本控制系统,用于跟踪计算机文件的更改,并协调多个用户间的协作工作。它最初由 Linus Torvalds 在 2005 年创建,旨在支持 Linux 内核的开发。Git 已经成为软件开发中最广泛使用的版本控制工具之一,不仅适用于代码,还适用于各种类型的文档和多媒体文件。 如果不是当年BitMover公司对linus的威胁 ,可能我们就没有机会用到这么免费和好用的Git了

接下来 来聊聊Git使用过程中遇到的一些事儿。

git暂存区和commit区

在提交git时,我们需要一步一步地来进行操作,你所做的修改,也是一步一步地从你的文件夹到git暂存区直到git仓库。

暂存区域是您提交和放置更改文件的地方。
commit区域是你即将要推送的到远程仓库的码头

image.png

了解了这两个概念,我们就会出现很多的问题了,请你记住:git永远原谅你向你妥协

如果你埋头写了很多东西,但是不知道自己写了什么?没事,git会提醒你

  1. git diff
    这个命令显示自最后一次提交以来,工作目录中文件的更改。它比较的是暂存区域(staging area)和工作目录中的文件。如果你还没有使用 git add 命令暂存任何更改,这将显示所有未暂存的更改。
  2. git diff <commit>
    这个命令显示指定提交和当前工作目录之间的差异。这可以让你看到从那个特定的提交到当前工作目录的变化。
  3. git diff HEAD
    这个命令显示最后一次提交和当前工作目录之间的差异。这相当于 git diff,因为默认情况下 git diff 会比较 HEAD 提交和工作目录。
  4. git diff --cachedgit diff --staged
    这个命令显示暂存区域和最后一次提交之间的差异。也就是说,它显示的是你已经使用 git add 命令暂存的那些文件的更改。
  5. git diff --name-only
    这个命令只列出有差异的文件名,而不显示具体的差异细节。这对于只想知道哪些文件有更改的场景很有用。
  6. git diff --stat
    这个命令显示每个文件的统计信息,如添加和删除的行数,但不显示具体的更改内容。

如果你不小心使用 git add /git commit命令将文件或修改添加到了暂存区或commit区,但之后又不想将这些改动包含在即将进行的提交中

撤销add
  1. git reset HEAD ./git reset HEAD + 文件名 这可以将暂存区恢复到之前的状态,将文件从暂存区移出,但不会改变工作目录中的文件状态。
  2. git restore --staged +文件名/git restore --staged . 这样也可以撤销你的git add
  3. git checkout -- <file> 这将取消暂存,并将工作目录中的文件恢复到上次提交的状态。如果你想保留工作目录中的改动,不要使用此方法。
撤销commit

git reset --soft HEAD^ HEAD^的意思是上一个版本,也可以写成HEAD ~ 1
如果你进行了2次commit,想都撤回,可以使用HEAD~2

  • --mixed
    不删除工作空间改动代码,撤销commit,并且撤销git add .
    这个为默认参数, git reset --mixed HEAD^git reset HEAD^ 效果是一样的。
  • --hard
    删除工作空间改动代码,撤销commit,并且撤销git add .

如果你今天修改的太乱了,又很难找到你下手点,那么git 依旧允许你回退到你今天刚开始写的状态,再来一次,结局不同。

git reset --hard --HEAD^ 你可以只用这个回退到上一次提交的版本。 git log 如果你并不知道你需要回退到哪一次,因为可能你提交了多次,你可以使用这条指令来查看你的提交日志。其中HEAD的指向就是你当前的版本。

image.png

当然你可能会觉得麻烦所以推荐你使用 git log --pretty=oneline ,这将让log的输出一行一行展示,只显示关键信息。

image.png 你看见一串字符是不是有点纳闷?这哪是关键信息呢? 其实这是版本号的哈希值,它指向了你提交的历史记录版本,后面的是你提交时的修改描述。

通过git reset --hard -- + 哈希值 就可以回退到你的历史版本了。

那么我复合了发现我俩还是不适合咋办?

还是那句话,无论如何,git永远爱你,永远给你留退路。

还记得HEAD 给你指向的版本号嘛~对吧 那现在知道了吧?

但是如果你关闭了终端呢?这可怎么办?
你是真狠啊!不过没关系,git还是给你找了借口

git reflog 这可以帮助你找到你所有的更改记录,包括重置操作

--soft

git reset --soft <commit-hash>

这只会移动 HEAD 指针到指定的提交,但不会改变暂存区或工作目录的状态。

--mixed (默认)

git reset <commit-hash>git reset --mixed <commit-hash>

这会移动 HEAD 指针,并且重置暂存区到指定的提交状态,但不会改变工作目录中的文件。这是 git reset 的默认行为。

git revert + 版本号

相比于git reset,git revert 命令用于撤销某个或某几个提交所带来的更改,但不会改变原有的提交历史。它通过创建一个新的提交来逆向应用指定提交的相反效果。换句话说,git revert 会生成一个新的提交,这个提交包含与被撤销提交相反的改动,从而在保留原有历史的同时,恢复到撤销前的状态。

好啦,个人之前遇到的事儿就基本就是这些啦,稍微总结一下,欢迎各位指正分享。