12

Git常见问题与异常处理清单 - commit提交信息出错_提交错误文件回退版本 - 文渊博客

 3 years ago
source link: https://www.wenyuanblog.com/blogs/git-exception-manual.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

本文整理了我在平时工作中遇到的 Git 问题,针对经常发生的几种异常情况提供一些解决方案。

一、基本概念

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

xxx.png
Git 简化版操作过程模型

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

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

二、git commit 修改提交信息

1. 已 commit 未 push

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

git commit --amend

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

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

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

2. 已 commit 已 push

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

git commit --amend

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

然后执行强制推送命令:

git push --force-with-lease origin master

三、git commit 漏提交文件

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

方案一:再次 commit

git commit -m "提交消息"

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

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

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

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

四、git commit 提交错误文件

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

方案一:git reset

直接删除指定的 commit。

# 修改版本库,保留暂存区,保留工作区
# 将版本库软回退 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 都会保留,并且把这次撤销作为一次最新的提交。

# 撤销前一次 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 的内容。

参考
官方文档:https://git-scm.com/book
《Git权威指南第二版》


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK