1.git merge
git merge用于将一个分支(branch)的修改应用到另一个分支(branch)上。git merge包含两种类型:fast-forward和no-fast-forward。
1.1 Fast-Forward merge
当目标分支(branch)相对于源分支(branch)没有额外的修改时,git不会创建额外的commit,直接进行merge。
![eecaf6d0aeaf0423c0862e0902967df7.gif](https://i-blog.csdnimg.cn/blog_migrate/73157557305342d10ae450fe68b30bc7.gif)
1.2 No-Fast-Forward merge
当目标分支(branch)相对于源分支(branch)都有修改时,git会在目标分支(branch)上创建新的merging commit。
![0346a7d9588c8b380c0230a94c7981ec.gif](https://i-blog.csdnimg.cn/blog_migrate/5e9325a6e2ae6d66cdb0220fc798db2d.gif)
Merge Conflicts
git能够解决一部分合并冲突的问题,但当我们想要合并的两个分支(branch)的同一文件中的同一行代码上有不同的修改,或者一个分支删除了一个文件而另一个分支修改了这个文件时,git就不知所措了。
如下图所示,我们同时修改了README.md文件的同一行:
![ba7651ce32fe557de39e43c8df51409a.png](https://i-blog.csdnimg.cn/blog_migrate/49750a80c7d0472ecb373aa50b1dae9b.png)
git在merge时,会告知冲突位置以及冲突的内容。这时候需要手动解决冲突,并手动提交commit。
2. git rebase
git rebase拷贝当前分支的提交,然后将这些提交放在目标分支的顶部。
![1cc38ca2838175fdca8c04b5567dceb3.gif](https://i-blog.csdnimg.cn/blog_migrate/dbd2a66cd23e6a6333d279923139c719.gif)
Interactive Rebase
Interactive Rebase允许我们在rebase过程中对commit内容进行一些修改。
reword: Change the commit message
edit: Amend this commit
squash: Meld commit into the previous commit
fixup: Meld commit into the previous commit, without keeping the commit's log message
exec: Run a command on each commit we want to rebase
drop: Remove the commit
移除一个commit:
![a595357cb9cb2bd64d084008903a9cf5.gif](https://i-blog.csdnimg.cn/blog_migrate/d06c9f7f09ff960ac603e6c840e1c8da.gif)
合并两个commit:
![f260088353284add43799cc1e76f6f27.gif](https://i-blog.csdnimg.cn/blog_migrate/b7beda71e8d276d34e2c5bce5acdacc6.gif)
3. git reset
当我们想丢掉之前提交的修改内容时,就可以使用git reset。
3.1 Soft Reset
Soft Reset将HEAD移至指定的commit,但不会移除该commit之后加入的修改。
Hard Reset除了将HEAD移动到指定的commit外,还重置了该commit之后的所有修改,包括暂存区和工作区的所有修改。
4.git revert
另一种回退commit的方法是使用git revert。git revert创建了一个新的commit,该commit包含了reverted changes。
如下所示,在commit ec5be增加了一个index.js文件,然后我们想要回退该Commit:
![c61eecebd8e3a3e722c88fc919a5b3b4.gif](https://i-blog.csdnimg.cn/blog_migrate/622f4024ecfecc9c60d1818f44a09b94.gif)
5. git cherry-pick
cherry-pick将其它分支(branch)的某个commit拿过来,合并到当前分支(branch)。
比如我们在dev分支修改了index.js文件,增加了一个commit 76d12,我们需要这个commit应用到master分支:
![ce9441a188e37f334694f0684b6485a9.gif](https://i-blog.csdnimg.cn/blog_migrate/a60a4f8ba5b17e717ffd6d9826fad209.gif)
6. git fetch
git fetch从远程分支拉取数据,但不修改本地的状态。
![4634e61b02f1d6f63cf004d88ac32a09.gif](https://i-blog.csdnimg.cn/blog_migrate/f9114abd66980c3ccb5b29a4d3e2cea5.gif)
7. git pull
git pull相当于git fetch + git merge。
![a51c7719f8cfa5a500aee1496f345dea.gif](https://i-blog.csdnimg.cn/blog_migrate/94082ecc7ca41fc1d0461e4cd3042dbd.gif)
8. git reflog
git reflog是一个非常有用的命令,可以展示已经执行过的所有动作的日志,括合并、重置、还原,基本上包含你对你的分支所做的任何修改。通过它几乎可以还原你所做的所有修改。
![63dea33f309c3d8eb9c14e666442f856.gif](https://i-blog.csdnimg.cn/blog_migrate/a7adc5817c1e26b428f5bec9dd20ccd1.gif)
假设我们要回退分支merge操作。当我们执行git reflog命令时,我们可以看到当前repo的状态在合并前位于HEAD@{1}。我们就执行一次git reset,将HEAD重新指向在HEAD@{1}的位置,就可以实现回退merge的功能了。
![60ab8c6d87c9b5d3f1aa996b2a6f3c2d.gif](https://i-blog.csdnimg.cn/blog_migrate/c2069d4d4466b0e36844b146782c3ee0.gif)
参考材料
1.https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1