不用害怕的撤销操作 git-revert / git-reset
首先
有时候,在主分支合并了最新版本之后,发现问题并希望在发布之前回退。然而,git-revert/git-reset 这些命令平时不常用,所以可能会有些抵触情绪。这次我们将通过查看简单示例来了解这些命令的使用方法。
git-revert/git-reset是什么?
以下是用于撤销更改的Git命令。让我们看看它们之间的区别。这是官方文档中写的解释。
revert: いくつかの既存のコミットを元に戻します
reset: 現在のHEADを指定された状態にリセットします
だそうです。
首先回顾 git-rebase / git-merge。
git变基
按照时间顺序逐个查看分支起点之前的提交,并逐步合并至分支源。
合并git
将分支点前的差异合并到分支源。
动手实践
我们接下来 ,在查看 git-revert/git-reset 的示例时 ,边动手边观察吧。
git-reset – 重置Git
请复制并运行以下代码。运行后将呈现如下图所示的状态。
# msaterブランチを作成
mkdir gitHandsOn && cd gitHandsOn
git init
echo "A" >> work.txt
git add . && git commit -m "Commit A"
# featureブランチに切り替えてコミットAからコミットDを作成
git checkout -b feature
echo "B" >> work.txt
git add . && git commit -m "Commit B"
echo "C" >> work.txt
git add . && git commit -m "Commit C"
echo "D" >> work.txt
git add . && git commit -m "Commit D"
# git-rebase
git checkout master && git rebase - && git log --oneline
接下来让我们尝试进行git-reset。
首先,我们来尝试撤销之前的提交D。
git checkout master
# コミットログを表示
git log --oneline
---------------------------------------------------------------
8254890 (HEAD -> master, feature) Commit D
5a5afaf Commit C
09d38a1 Commit B
383454e Commit A
---------------------------------------------------------------
# コミットDを打ち消してみましょう
# まずは以下のようにコミットDのコミットログを指定して、git-resetを叩いてください
git reset --hard 8254890
git log --oneline
你觉得怎么样,它消失了吗?
不会消失的呢。
这是什么意思?
git-reset命令是将HEAD移动到指定提交的命令,所以即使指定了提交D,提交D也不会被取消。
让我们重新撤销D提交。
git checkout master
# コミットログを表示
git log --oneline
---------------------------------------------------------------
8254890 (HEAD -> master, feature) Commit D
5a5afaf Commit C
09d38a1 Commit B
383454e Commit A
---------------------------------------------------------------
# コミットDを打ち消してみましょう
# 改めて以下のようにコミットDのコミットログを指定して、git-resetを叩いてください
git reset --hard 5a5afaf
git log --oneline
---------------------------------------------------------------
5a5afaf (HEAD -> master) Commit C
09d38a1 Commit B
383454e Commit A
---------------------------------------------------------------
D 篇的提交已成功撤销。
练习1
请使用最初的复制粘贴代码将其转换为以下状态。
※ 我将答案放在最后。
关于”硬”和”软”的区别
当使用hard参数时,会取消提交并将本地内容回滚到移动之后的HEAD状态。
当使用soft参数时,提交会被取消,但本地内容将保持不变。这适用于想要保留修订内容但删除提交的场景。
Exercise 2: 运动二
请使用最初复制粘贴的代码将其转换为以下状态。
※ 答案将放在最后一项。
撤销git
请复制并运行以下代码。运行后将出现如下图所示的状态。
# msaterブランチを作成
mkdir gitHandsOn && cd gitHandsOn
git init
echo "A" >> work.txt
git add . && git commit -m "Commit A"
# featureブランチに切り替えてコミットAからコミットDを作成
git checkout -b feature
echo "B" >> work.txt
git add . && git commit -m "Commit B"
echo "C" >> work.txt
git add . && git commit -m "Commit C"
echo "D" >> work.txt
git add . && git commit -m "Commit D"
# git-merge
# mergeの際にコミットコメントが必要なのでそのまま保存をしてください
git checkout master && git merge --no-ff - && git log --oneline
git checkout master
# コミットログを表示
git log --oneline
---------------------------------------------------------------
5b96ca7 (HEAD -> master) Merge branch 'feature'
2757f8e Commit A
914017f (feature) Commit D
711f950 Commit C
b66b20c Commit B
---------------------------------------------------------------
# マージコミットを指定してrevertを実行しくてださい
git revert 5b96ca7
你怎么样,已经消失了吗?
不会消失啊。
这是什么意思?
当你想要撤销合并提交时,需要添加一个名为”mainline”的选项。
当取消合并提交时,请确保将mainline指定为1。
主線故事
“mainline”是指Git中的父编号。”git-merge”是将两个分支合并的操作,可以使用以下命令来查找合并了哪个分支的提交记录。
$ git show マージコミットのID
commit 5b96ca711b150aa66108fead2442699f8203ad9d (HEAD -> master)
Merge: 2757f8e 914017f
Author: takiguchi-yu
Merge branch 'feature'
在这里,2757f8e被称为mainline=1,而914017f被称为mainline=2。
让我们再次撤销合并提交。
git checkout master
# コミットログを表示
git log --oneline
---------------------------------------------------------------
5b96ca7 (HEAD -> master) Merge branch 'feature'
2757f8e Commit A
914017f (feature) Commit D
711f950 Commit C
b66b20c Commit B
---------------------------------------------------------------
# マージコミットを指定してrevertを実行しくてださい
git revert --mainline 1 5b96ca7
git log --oneline
---------------------------------------------------------------
ce3046a (HEAD -> master) Revert "Merge branch 'feature'"
5b96ca7 Merge branch 'feature'
2757f8e Commit A
914017f (feature) Commit D
711f950 Commit C
b66b20c Commit B
---------------------------------------------------------------
我成功完成了。与重置不同,还会保留提交记录。
保留提交记录能带来诸如可以在团队内进行审核等优点。
第3个练习
请使用最初的复制粘贴代码,使其达到以下状态。
※答案将在最后给出。
最后
有时候在进行结构性业务时,会产生前进的对策,但是如果知道这些指令,就能轻松地进行回退!
练习答案样本
练习一
git checkout master
git log --oneline
---------------------------------------------------------------
8254890 (HEAD -> master, feature) Commit D
5a5afaf Commit C
09d38a1 Commit B
383454e Commit A
---------------------------------------------------------------
# git-reset はHEADの移動させるコマンドなので、コミットAを指定してあげれば良い
git reset --hard 383454e
git log --oneline
---------------------------------------------------------------
383454e (HEAD -> master) Commit A
---------------------------------------------------------------
练习2
git checkout master
git log --oneline
---------------------------------------------------------------
8254890 (HEAD -> master, feature) Commit D
5a5afaf Commit C
09d38a1 Commit B
383454e Commit A
---------------------------------------------------------------
# softでresetすれば良い
git reset --soft 383454e
git log --oneline
---------------------------------------------------------------
383454e (HEAD -> master) Commit A
---------------------------------------------------------------
第三次演習
git checkout master
git log --oneline
---------------------------------------------------------------
5b96ca7 (HEAD -> master) Merge branch 'feature'
2757f8e Commit A
914017f (feature) Commit D
711f950 Commit C
b66b20c Commit B
---------------------------------------------------------------
# この場合は普通にコミットDのコミットIDを指定してあげれば良いですね
git revert 914017f
git log --oneline
---------------------------------------------------------------
ad37cf4 (HEAD -> master) Revert "Commit D"
76572dd Merge branch 'feature'
8b4e87e Commit A
3912023 (feature) Commit D
7454740 Commit C
99f5f37 Commit B
---------------------------------------------------------------