基于 fork 的 git 常规操作及解析
一、fork是什么
我们在多人协同开发项目的过程中,git是必不可少的代码托管工具。但是繁琐的操作命令、抽象的文件状态就需要花费我们大量的时间。
fork拥有可视化界面的项目版本控制软件,适用于git项目管理。
现在很多人都在用sourcetree,至于你问我为什么不用sourcetree,这完全是个人喜好,在我看来fork相比sourcetree拥有更简约的风格,还有其更直观而且方便操作的文件树形视图。
二、常用操作命令
fetch
git fetch
命令通常用于将远程仓库同步到本地仓库,但是不会对你工作空间产生影响。
pull
git pull
命令用于将远程仓库同步到本地仓库,并且合入到工作空间。
git pull = git fetch + git merge
这里不建议使用rebase代替merge,rebase通常用于分支合并的时候。
commit
git commit
命令是将工作空间修改的内容提交至本地仓库。
修改文件和暂存文件之间可通过双击
自由切换,当然也可以文件的部分提交,最后commit至本地仓库。
push
git push
命令用于将本地分支的更新,推送到远程仓库。
这里有6次commit的修改需要push。
revert commit
git revert commit
命令是撤销某一次commit,即删除该次提交的修改。
如图,当我们撤销蒙层不可点击
commit时:
修改已经删除。
reset
git reset
命令是回滚到之前的某个状态。
有三种回滚方式,这里就不做介绍了。
如果远程仓库已在本地仓库之上,请使用git push xxx --force强制提交。
stash
git stash
命令是将本地工作空间所有修改暂存到stash,并且随时可以取出。
常用的应用场景就是解决冲突
和切换分支
.
详细使用方法请参考git切换分支保存修改的代码的方法
merge
git merge
命令默认是从 当前分支 和 对方分支 的最近共同祖先节点之后
的对方分支节点合并到当前分支。
- --no-ff:合并分支时,会创建新的合并 commit 节点。缺省情况下,为 --ff ,即不创建合并节点。
- --no-commit:合并后,不自动进行 commit 提交,能够给使用者一个机会在提交前审视和修改合并结果。
- --squash:将对方分支
所有节点
(最新节点 => 顶部节点)压缩在一起,使用者可以经过审视后进行提交,产生一个新的 commit 节点,合入到当前分支。
rebase
git rebase
命令是变基操作。
场景一:多个 commit 合并为一个 commit
当我们在本地仓库中提交了多次,在我们把本地提交 push 到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个连续的
提交记录合并为一个完整的提交,然后再 push 到公共仓库。(❗️ps:同一分支操作,分支无关)
❗️注意!!!此操作会重写 commit 历史且不可撤回。
在 fork 中选中连续的提交节点,右键 Squash into Parent...
在 交互处理(interactively) 这些节点时,可进行审视和修改。
最终,可以看到选中的多个节点,合并成一个节点 (选中节点之前的节点 feat(资金流水): 开发完成
)。
场景二:将某一段 commit 粘贴到另一个分支上
看起来和 merge 类似,不过它可以选择一段 commit 节点进行合并,而 merge 只能进行全量合并。
这里,我们希望将 develop 分支中的 C~E 部分复制到 master 分支中,这时我们就可以通过 rebase 命令来实现(如果只是复制某一两个提交到其他分支,建议使用更简单的命令: git cherry-pick
)
使用命令的形式为:
git rebase [startpoint] [endpoint] --onto [branchName]
在 fork 中,我们可以选择等价操作,直接选择一段连续的节点,cherry-pick
就好了,是不是相当的方便~😆
cherry-pick
git cherry-pick
是将某一次 commit,复制到本地仓库以及工作空间。
- -x:在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。
fork
Git 中 Fork 即是 远程仓库的克隆,包含了原来的仓库(即upstream repository,上游仓库)所有内容,如分支、Tag、提交。
fork 了别人的仓库后,原作者又更新了仓库,如何将自己的代码和原仓库保持一致?如何将自己的修改提交至原仓库?在 fork 工具中很简单。
给自己的仓库配置一个 remote (即 上游仓库)
添加远程仓库 product
后可以看到其下面所有内容。这时你可以 checkout 任何分支到本地。
- 与自己仓库交互:rebase、cherry-pick。(不允许 merge,因为来自两个仓库的分支,unrelated history)
- 上游仓库:本地进行修改,并且可以
pull request
,上游仓库的作者可以将你的修改合并到该仓库。(有时,这样你就为开源项目贡献了代码)
另外一种方式:github 网页中,在原仓库单击
fork
按钮,会在个人仓库中,增加一项 fork 仓库。
三、总结
作为程序员,git是必不可少的管理工具,如果熟练运用,能够很大的提升我们开发规范与开发效率。
灵感来源:通过外包项目,遇到协作的问题,写下此篇博客,更感谢爽能的大力支持。
转载自:https://juejin.cn/post/6933552407242604551