Git异常处理(1)

    Git异常在这里泛指在本地个人仓库中发生的错误提交或者移除,虽然在个人仓库,但你处理错误的方式将会影响到其他人与代码库的交互。

1.使用分支进行试验性的工作

    最简单的方式是隔离修改,确保修改正确后在合并到主分支。我们知道工单可以作为创建和删除分支的起点,但如果你在一个工单上进行工作,但不确定应该使用这两种方法的哪一个,在这种情况下,你可以从你的工单上创建一个新的分支,在新分支上进行试验性的修改,如果你想要保存这些修改,在将试验性的分支并入你的工单分支。

#使用试验性的分支来测试修改
git checkout -b experimental_idea
(完成工作)
git add --all
git commit
#将试验型分支并回主分支
git checkout master
git merge experimental_idea --squash
git commit
#删除试验性分支
git branch --delete experimental_idea

       需要注意:

    a. squash(压缩),指当在试验性分支上有多次提交时,将所有提交并入一个提交,通过这种方式合并分支的一个缺点是以后不能撤销分支合并.

    b. delete, 如果要舍弃试验性的修改,删除一个未合并的分支则使用 --D 参数。

2. 变基

     变基指的是使用父分支上的提交更新一个分支的过程。假设父分支(master),需要更新的分支feature. rebase 是唯一不局限于撤销工作的命令。当你在想要更新的分支上,运行rebase命令并使用父分支的名字作为参数。Git作为一个简单的内容跟踪工具,Git将你的提交从工作所在的子分支上移除,并将父分支上产生的新的提交添加到你的分支顶端。这样做看上去你的提交被放在了父分支中新增的修改后(我的理解:将父分支和子分支中所有的差异,放在子分支顶端形成子分支上的提交)

#保证父分支的本地副本与项目主仓库中最新的提交同步。
git checkout master
git pull
#当前分支上的修改与主项目不同步,而主项目中的新工作尚未被引入
git checkout feature
#开始变基
git rebase master

  文件删除造成的变基冲突

#使用git status 询问Git工作的线索
git status
#如果是主仓库已经删除的文件则需要重新提交。rebase过程中需要将删除的文件取消暂存(unstage)
git reser HEAD 文件名称
git add 文件名称
3. 定位历史记录

    在Git中完全舍弃某个提交过的工作是非常困难的,但是弄丢自己的工作是很容易的事。如果认为丢失了一些工作,首先应该找到保存之前工作的提交。 log命令显示某个分支上使用init命令创建仓库后的所有历史提交,relog命令则列出起始于你把远程仓库克隆到本地环境时的那一刻。这两个命令都会显示仓库中的某个状态的提交ID,只要找到了ID,就可以签出这个提交,及时将代码库的版本临时恢复到那个节点。

git log
git log --oneline
git relog
#在仓库中签出特定历史提交
git checkout commit

    当签出一个提交时,你将与某个分支相连的历史记录分离,处于暂停状态即代表你与分支的线性历史记录暂时失去连接。具体如下图所示:


#创建一个新分支,将你的状态记录在新的分支上,可以做出一些修改
git checkout -b restoring_old_commit
#之后在将其合并到本地仓库
git checout working_branch
git merge restoing_old_commit
#合并完成之后,删除临时分支
git branch --delete restoing_old_commit
#如果已经发布了临时分支,并希望从远端仓库删除它
git push -- delete restoing_old_commit
#使用cherry-pick将提交复制到新的分支上
git cherry-pick -x commit
    cherry-pick(拣选),使用我想要复制到当前分支的提交ID,可选的-X参数在提交消息后新增了一行,告诉你这个提交是从别处拣选的,而不是当前分支上原创的。
4. 还原文件或回到上一个提交的版本
    首先一点要遵循Git的指示来操作。例如,工作中不小心删除了某个文件,而又想恢复这个文件,或者你修改了一个不该修改的文件,在这些修改被锁定(或commit)之前,你可以签出这些文件。你可以将文件内容恢复到当前所在分支中最新的已知提交,并存储这个文件。
rm README.md
git status  #查看Git的操作提示
git checkout --README.md

    如果你已经暂存了也就是使用了git add filename命令,你需要使用reset命令在恢复之前将它取消暂存。

rm README.md
git add README.md
git status
#取消暂存
git reset HEAD README.md
#一旦取消暂存,就可以使用checkout命令恢复被删除的文件
git checkout --README.md
#以上两个命令可以合并为一个
git reset --hard HEAD --README.md

    如果你想撤销工作目录中所有的变更,将所有文件恢复到上一个提交版本。则批量完成命令如下

git reset --hard HEAD

猜你喜欢

转载自blog.csdn.net/Ljfzhifuwa/article/details/80563210