Git 常见问题与异常处理清单!

一、基本概念

使用 Git 首先要弄清楚一些概念,从网上找了一张图:

 

xxx.png

 

Git 简化版操作过程模型

最常用的就是图中的 6 个命令,但在使用之前首先要弄清楚几个名词概念:

  • Remote:远程仓库;
  • Repository:本地仓库;
  • Index/Stage:Git 追踪树,暂存区;
  • workspace:本地工作区(即你编辑器的代码)

二、git commit 修改提交信息

1. 已 commit 未 push

已经执行 commit,要想更改 commit 信息(修改最近一次提交)。

bash
git commit --amend

执行上述命令后,进入注释页面进行修改,修改后保存退出。

然后使用 git log --pretty=oneline 查看内容,可以发现已经成功修改了。

需要注意的是此项命令会修改提交时的 commit_id,即会覆盖原本的提交,需要谨慎操作。

2. 已 commit 已 push

已经执行 commit,且已经 push 的提交(修改最近一次提交)。

bash
git commit --amend

执行上述命令后,进入注释页面进行修改,修改后保存退出。

然后执行强制推送命令:

bash
git push --force-with-lease origin master

三、git commit 漏提交文件

commit 时,遗漏提交部分更新,有两种解决方案:

方案一:再次 commit

bash
git commit -m "提交消息"

此时,git 上会出现两次 commit。

方案二:遗漏文件提交到之前 commit 上

bash
git add <missed-file> # missed-file 为遗漏提交文件
git commit --amend --no-edit

--no-edit 表示提交消息不会更改,该操作会修改上一次提交的内容,但不会要求你编辑提交信息,仍保持上一次 commit 的 message。

四、git commit 提交错误文件

提交错误文件,需要回退到上一个 commit 版本,再重新 commit。

方案一:git reset

直接删除指定的 commit。

bash
# 修改版本库,保留暂存区,保留工作区
# 将版本库软回退 1 个版本,软回退表示将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区。
git reset --soft HEAD~1

# 修改版本库,修改暂存区,修改工作区
# 将版本库回退 1 个版本,不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码也回退到这个版本
git reset --hard HEAD~1
# Git 版本回退,回退到特定的 commit_id 版本,可以通过 git log 查看提交历史,以便确定要回退到哪个版本(commit 之后的即为ID);
git reset --hard <commit_id> 

# 如果需要撤销已经 push 到远端的 commit,使远端的仓库也回退到相应的版本,需要在 push 时加上参数 --force:
git push origin <分支名> --force

方案二:git revert

撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。

bash
# 撤销前一次 commit
git revert HEAD

#  撤销前前一次 commit
git revert HEAD^

# 撤销指定的版本,撤销也会作为一次提交进行保存
git revert <commit_id>

git revert 是提交一个新的版本,将需要 revert 的版本的内容作为一次新的 commit 再反向修改回去,版本会递增,不影响之前提交的内容。

区别:git revert 和 git reset

相对之下,git revert 更加优雅,以前的一篇博客对比过两个命令。

  • git revert 是用一次新的 commit 来回滚之前的 commit,git reset 是直接删除指定的 commit。
  • 在回滚这一操作上看,效果差不多。但是在日后继续 merge 以前的老版本时有区别。因为 git revert 是用一次逆向的 commit「中和」之前的提交,因此日后合并老的 branch 时,导致这部分改变不会再次出现,但是 git reset 是直接把某些 commit 在某个 branch 上删除,因而和老的 branch 再次 merge 时,这些被回滚的 commit 应该还会被引入。
  • git reset 是把 HEAD 向后移动了一下,而 git revert 是 HEAD 继续前进,只是新的 commit 的内容和要 revert 的内容正好相反,能够抵消要被 revert 的内容。

来源:百度云盘资源

posted @ 2021-01-11 21:57  风吹头蛋凉嗖嗖  阅读(182)  评论(0编辑  收藏  举报