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
......
\