git rebase
合并不同分支的提交
将 b 分支上的提交合并到 a 分支上成为一条直线
git checkout b
git rebase a
与 merge 的区别
永远不要在公共项目里使用 rebase
merge 采用的是三方合并的原则,没有公共提交节点就无法进行合并
-
git rebase:
-
git merge:
rebase 和 merge 的另一个区别是 rebase 的冲突是一个一个解决,先解决第一个,然后用命令
git add -u
git rebase --continue
继续后才会出现第二个冲突,直到所有冲突解决完,而 merge 是所有的冲突都会显示出来。另外如果 rebase 过程中,你想中途退出,恢复 rebase 前的代码则可以用命令
git rebase --abort
合并本地的多次提交
合并最新的三次提交
git rebase -i HEAD~3
git reabse -i 合并 commit 之后会出现一个匿名的分支,并不是在原来的分支上把 commit 给合并,而是从合并的 start point 开始新生成一个匿名分支然后把原来分支那几个 commit 作为一个 commit 放到新分支上
cherry-pick
将其他分支上的提交应用于 a 分支
在开源项目里很有用
git checkout a
git cherry-pick <CommitID>
与 rebase 的区别
rebase 相当于剪切粘贴, cherry-pick 相当于复制粘贴
git reset 与 git revert
git reset
回退到指定的提交版本
git revert
用一个新的提交来消除之前的提交,原来的 commit 内容依旧会保存在提交历史中
两者的区别
reset 是在正常的提交历史中,删除了指定的 commit ,HEAD 向后移动,而 revert 是在正常的提交历史中再 commit 一次,只不过是反向提交可以抵消之前的提交,它的HEAD 是一直向前的
git pull 和 git fetch 的区别
打开本地 .git/refs
文件夹我们可以看到代表本地分支的 head
文件夹和代表正在跟踪的远程分支的 remotes
文件夹
使用 git pull 会将两个文件夹里的 commit ID 都更新至远程库的最新 commit ID
使用 git fetch 只会将 remotes
文件夹中的 commit ID 更新至远程库的最新 commit ID
git blame
可以查看某个文件里每一行代码的最后修改提交记录
git blame <filename>
sign-off
在做开源项目时遇到要求 sign-off,用于证明提交作者
git commit -s -m ""
SSH 与 HTTPS 克隆代码的区别
-
HTTPS 使用 443 端口,可以随意克隆 GitHub 上的项目,但进行其他 git 操作时需要验证用户名和密码
-
SSH 使用 22 端口,操作者必须是项目拥有者,先添加 SSH key 然后才能克隆 GitHub 上的项目
参考资料
Git应用详解第九讲:Git cherry-pick与Git rebase
最后修改于 2021-07-26