回溯历史版本
回溯到feature-A之前
命令git reset
&emps;&emps;&emps;&emps;借助分散仓库的优势,可以在不影响其他仓库的前提下对历史版本进行操作。在这里,为了让各位熟悉对历史版本的操作,我们先回溯历史版本,创建一个名为 fix-B 的特性分支,如下图:
&emps;&emps;&emps;&emps;要让仓库的 HEAD、暂存区、当前工作树回溯到指定状态,需要用到 git rest --hard命令
需要注意的是回到某个时间点,需要那个时间的哈希值,这个可以通过上一节的笔记git log --graph查询到,如下
R@R MINGW64 ~/gitlearn (master)
$ git log --graph
* commit e1e5b99846f148f04f0cc87a0a75bbf442937f3f (HEAD -> master)
|\ Merge: 0bffe81 6c64c8c
| | Author: RR <xxxxxxxxx@qq.com>
| | Date: Mon Oct 24 20:01:18 2022 +0800
| |
| | Merge branch 'feature-A'
| |
| * commit 6c64c8c35152e33e478a24fed2e3851ffb7d6577 (feature-A)
|/ Author: RR <xxxxxxxxx@qq.com>
| Date: Mon Oct 24 19:37:37 2022 +0800
|
| Add -feature-A
|
* commit 0bffe81fd4a24b84f11b05515962211229b65ae1
| Author: RR <xxxxxxxxx@qq.com>
| Date: Mon Oct 24 10:41:15 2022 +0800
|
| add a title to README.md
|
* commit d07f69bc0e3f3d4268bd377f9585e80718756c62
Author: RR <xxxxxxxxx@qq.com>
Date: Sat Oct 22 18:15:55 2022 +0800
可以看到在我创建feature-A之前的master的哈希值是0bffe81fd4a24b84f11b05515962211229b65ae1
R@R MINGW64 ~/gitlearn (master)
$ git reset --hard 0bffe81fd4a24b84f11b05515962211229b65ae1
HEAD is now at 0bffe81 add a title to README.md
现在我们查看一下README.md是否回到了初始的状态
创建fix-B
使用以前提到的命令
git checkout -b fix-B
R@R MINGW64 ~/gitlearn (master)
$ git checkout -b fix-B
Switched to a new branch 'fix-B'
R@R MINGW64 ~/gitlearn (fix-B)
$
现在的状态如下:
我们修改一下当下的README.md做个标记
R@R MINGW64 ~/gitlearn (fix-B)
$ git status
On branch fix-B
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
R@R MINGW64 ~/gitlearn (fix-B)
$ git add README.md
R@R MINGW64 ~/gitlearn (fix-B)
$ git commit -m "fix-B"
[fix-B f311c00] fix-B
1 file changed, 3 insertions(+), 1 deletion(-)
进行提交
推进至feature-A后的状态
如下图:
使用git log 命令只能看到以当前为止的日志
看不见feature-A分支的日志
如下:
R@R MINGW64 ~/gitlearn (fix-B)
$ git log --graph
* commit 0bffe81fd4a24b84f11b05515962211229b65ae1 (HEAD -> fix-B, master)
| Author: RR <97416032@qq.com>
| Date: Mon Oct 24 10:41:15 2022 +0800
|
| add a title to README.md
|
* commit d07f69bc0e3f3d4268bd377f9585e80718756c62
Author: RR <97416032@qq.com>
Date: Sat Oct 22 18:15:55 2022 +0800
my first commit
&emps;&emps;&emps;&emps;要想看到当前仓库的操作日志需要git reflog命令,找到回溯之前的哈希值,调用==git reset --hard 哈希值 ==回到回溯之前
R@R MINGW64 ~/gitlearn (fix-B)
$ git reflog
f311c00 (HEAD -> fix-B) HEAD@{0}: commit: fix-B
0bffe81 (master) HEAD@{1}: checkout: moving from master to fix-B
0bffe81 (master) HEAD@{2}: reset: moving to 0bffe81fd4a24b84f11b05515962211229b65ae1
e1e5b99 HEAD@{3}: merge feature-A: Merge made by the 'ort' strategy.
0bffe81 (master) HEAD@{4}: checkout: moving from feature-A to master
6c64c8c (feature-A) HEAD@{5}: checkout: moving from master to feature-A
0bffe81 (master) HEAD@{6}: checkout: moving from feature-A to master
6c64c8c (feature-A) HEAD@{7}: commit: Add -feature-A
0bffe81 (master) HEAD@{8}: checkout: moving from master to feature-A
0bffe81 (master) HEAD@{9}: commit: add a title to README.md
d07f69b HEAD@{10}: commit (initial): my first commit
&emps;&emps;&emps;&emps;在日志中,我们可以看到 commit、checkout、reset、merge 等 Git 命令的执行记录。只要不进行 Git 的 GC(Garbage Collection,垃圾回收),就可以通过日志随意调取近期的历史状态,就像给时间机器指定一个时间点,在过去未来中自由穿梭一般。即便开发者错误执行了 Git 操作,基本也都可以利用 git reflog命令恢复到原先的状态。
&emps;&emps;&emps;&emps;可以看到==e1e5b99==就是我们merge feature-A后的哈希值。
现在我们回去
先回到master !!!
R@R MINGW64 ~/gitlearn (fix-B)
$ git checkout master
Switched to branch 'master'
R@R MINGW64 ~/gitlearn (master)
$ git reset --hard e1e5b99
HEAD is now at e1e5b99 Merge branch 'feature-A'
这时我们查看一下README.md是否回到了feature-A与master合并后的状态
合并fix-B
合并fix-B
R@R MINGW64 ~/gitlearn (master)
$ git merge --no-ff fix-B
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
&emps;&emps;&emps;&emps;这时,系统告诉我们 README.md 文件发生了冲突(Conflict)。系统在合并 README.md 文件时,feature-A 分支更改的部分与本次想要合并的 fix-B 分支更改的部分发生了冲突。不解决冲突就无法完成合并,所以我们打开 README.md 文件,解决这个冲突。
查看冲突部分并将其解决
======== 以上的部分是当前 HEAD 的内容,以下的部分是要合并的 fix-B 分支中的内容。我们在编辑器中将其改成想要的样子
&emps;&emps;&emps;&emps;如上所示,本次修正让 feature-A 与 fix-B 的内容并存于文件之中。但是在实际的软件开发中,往往需要删除其中之一,所以各位在处理冲突时,务必要仔细分析冲突部分的内容后再行修改。
提交解决后的结果
R@R MINGW64 ~/gitlearn (master|MERGING)
$ sublime README.md
R@R MINGW64 ~/gitlearn (master|MERGING)
$ git add README.md
R@R MINGW64 ~/gitlearn (master|MERGING)
$ git commit -m "fix conflict"
[master a0ff067] fix conflict
修改提交信息
要修改上一条提交信息,可以使用 git commit --amend命令
R@R MINGW64 ~/gitlearn (master)
$ git commit --amend
hint: Waiting for your editor to close the file...
将其修改为merge branch ‘fix-B’
R@R MINGW64 ~/gitlearn (master)
$ git commit --amend
[master 8bce967] merge branch 'fix-B'
Date: Tue Oct 25 21:08:44 2022 +0800
使用git log --graph查看一下现在的分支情况
R@R MINGW64 ~/gitlearn (master)
$ git log --graph
* commit 8bce9671a0f731b93c79d953e3152b58f98de379 (HEAD -> master)
|\ Merge: e1e5b99 555b9ec
| | Author: RR <xxxxxxxx2@qq.com>
| | Date: Tue Oct 25 21:08:44 2022 +0800
| |
| | merge branch 'fix-B'
| |
| * commit 555b9ec58987a460414e4fd3b164f3fcfba1263c (fix-B)
| | Author: RR <xxxxxxxx@qq.com>
| | Date: Tue Oct 25 20:53:38 2022 +0800
| |
| | fix-B
| |
* | commit e1e5b99846f148f04f0cc87a0a75bbf442937f3f
|\ \ Merge: 0bffe81 6c64c8c
| |/ Author: RR <xxxxxxxx@qq.com>
|/| Date: Mon Oct 24 20:01:18 2022 +0800
| |
| | Merge branch 'feature-A'
| |
| * commit 6c64c8c35152e33e478a24fed2e3851ffb7d6577 (feature-A)
|/ Author: RR <xxxxxxxx@qq.com>
| Date: Mon Oct 24 19:37:37 2022 +0800
|
| Add -feature-A
|
* commit 0bffe81fd4a24b84f11b05515962211229b65ae1
| Author: RR <xxxxxxxx@qq.com>
| Date: Mon Oct 24 10:41:15 2022 +0800
|
| add a title to README.md
|
* commit d07f69bc0e3f3d4268bd377f9585e80718756c62
Author: RR <xxxxxxxx@qq.com>
Date: Sat Oct 22 18:15:55 2022 +0800
my first commit
下次见!