Git05-分支进阶与版本回退

171 阅读2分钟

1、fast-forward模式

如果可能的话,合并分支会使用fast-forward模式,而在这种模式下,删除分支会丢掉分支信息。

合并时加上--no-ff参数会金庸fast-forward,这样会多出一个commit id。

git merge -no-ff 分支名

查看log:

git log --graph

2、示例

先创建dev分支,查看log

$ git log --graph
*   commit 83f067ef5a2b7466d21c7dec0845744bed3569d2 (HEAD -> master, dev)
|\  Merge: cfabbb2 c649328
| | Author: Oliver <16140@qq.com>
| | Date:   Fri Jun 3 11:56:26 2022 +0800
| |
| |     fix conflict between master and new branch
| |
| * commit c6493284d1758dbb99e6a5446b23b0fac246c104 (new_branch)
| | Author: Oliver <16140@qq.com>
| | Date:   Fri Jun 3 11:46:04 2022 +0800
| |
| |     new branch fix conflict.txt
| |
* | commit cfabbb2403e9d42c76a39bc16f8660caa933e8db
|/  Author: Oliver <16140@qq.com>
|   Date:   Fri Jun 3 11:44:15 2022 +0800
|
|       master fix confict.txt
|
* commit feb514987dd466d081cc5aa980dc2bac0464f2e4
| Author: Oliver <16140@qq.com>
| Date:   Fri Jun 3 11:25:26 2022 +0800
|
|     new branch add test3.txt

可以看到在confict.txt那次提交分叉了。最后合并到一起了。

dev上修改conflict.txt文件:

16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (dev)
$ vi conflict.txt
​
16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (dev)
$ git status
On branch dev
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:   conflict.txt
​
no changes added to commit (use "git add" and/or "git commit -a")
​
16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (dev)
$ git add .
​
16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (dev)
$ git commit -m "add conflict.txt from dev"
[dev 015e700] add conflict.txt from dev
 1 file changed, 1 insertion(+)

合并到master分支:

16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (dev)
$ git checkout -
Switched to branch 'master'
​
16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ git status
On branch master
nothing to commit, working tree clean
​
16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ git merge --no-ff dev
Merge made by the 'recursive' strategy.
 conflict.txt | 1 +
 1 file changed, 1 insertion(+)

查看日志:

16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ git log --graph
*   commit f6e05f43d17b5e15fe54a8797be7366b540f7542 (HEAD -> master)
|\  Merge: 83f067e 015e700
| | Author: Oliver <16140@qq.com>
| | Date:   Fri Jun 3 13:00:49 2022 +0800
| |
| |     Merge branch 'dev'
| |
| * commit 015e70086f628f9dd829dc616fdf1aa4bf585815 (dev)
|/  Author: Oliver <16140@qq.com>
|   Date:   Fri Jun 3 12:58:10 2022 +0800
|
|       add conflict.txt from dev
|
*   commit 83f067ef5a2b7466d21c7dec0845744bed3569d2
|\  Merge: cfabbb2 c649328
| | Author: Oliver <16140@qq.com>
| | Date:   Fri Jun 3 11:56:26 2022 +0800
| |
| |     fix conflict between master and new branch
| |
| * commit c6493284d1758dbb99e6a5446b23b0fac246c104 (new_branch)
| | Author: Oliver <16140@qq.com>
| | Date:   Fri Jun 3 11:46:04 2022 +0800
| |
| |     new branch fix conflict.txt
| |
* | commit cfabbb2403e9d42c76a39bc16f8660caa933e8db
|/  Author: Oliver <16140@qq.com>
|   Date:   Fri Jun 3 11:44:15 2022 +0800
|
|       master fix confict.txt
|
* commit feb514987dd466d081cc5aa980dc2bac0464f2e4
| Author: Oliver <16140@qq.com>
| Date:   Fri Jun 3 11:25:26 2022 +0800
|
|     new branch add test3.txt
|

3、版本回退

回退版本指令:

git reset --hard HEAD^
​
git reset --hard HEAD~1
​
git reset --hard commit_id

返回到某个版本指令:

git reflog

4、示例

回退到上一个版本

16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ git reset --hard HEAD^
HEAD is now at 83f067e fix conflict between master and new branch
​
16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ cat conflict.txt
hello master
hello new branch

回退两个版本

16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ git reset --hard HEAD~2
HEAD is now at cfabbb2 master fix confict.txt
​
16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ cat conflict.txt
hello master

再前进到某一次的提交上

上面已经记住了log的内容,只需要git reset --hard 版本号前几位,能让git找到相应版本即可。

16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ git reset --hard f6e0
HEAD is now at f6e05f4 Merge branch 'dev'
​
16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ cat conflict.txt
hello master
hello new branch
hello dev

如果没有记录之前的commit id,然后还把版本回退了,怎么找到commit id呢?

这就需要git reflog指令了:

16140@DESKTOP-NF7R8DC MINGW64 /d/笔记和课程/code review/mygit (master)
$ git reflog
​
f6e05f4 (HEAD -> master) HEAD@{0}: reset: moving to f6e0
cfabbb2 HEAD@{1}: reset: moving to HEAD~2
f6e05f4 (HEAD -> master) HEAD@{2}: reset: moving to f6e05
feb5149 HEAD@{3}: reset: moving to HEAD
feb5149 HEAD@{4}: reset: moving to HEAD~2
83f067e HEAD@{5}: reset: moving to HEAD^
f6e05f4 (HEAD -> master) HEAD@{6}: merge dev: Merge made by the 'recursive' strategy.
83f067e HEAD@{7}: checkout: moving from dev to master
015e700 (dev) HEAD@{8}: commit: add conflict.txt from dev
83f067e HEAD@{9}: checkout: moving from master to dev
83f067e HEAD@{10}: checkout: moving from dev to master
83f067e HEAD@{11}: checkout: moving from master to dev
......

\