Py学习  »  Git

基于 fork 的 git 常规操作及解析

清风晴雨 • 3 年前 • 224 次点击  
阅读 49

基于 fork 的 git 常规操作及解析

一、fork是什么

我们在多人协同开发项目的过程中,git是必不可少的代码托管工具。但是繁琐的操作命令、抽象的文件状态就需要花费我们大量的时间。

fork拥有可视化界面的项目版本控制软件,适用于git项目管理。

现在很多人都在用sourcetree,至于你问我为什么不用sourcetree,这完全是个人喜好,在我看来fork相比sourcetree拥有更简约的风格,还有其更直观而且方便操作的文件树形视图

二、常用操作命令

image

fetch

git fetch命令通常用于将远程仓库同步到本地仓库,但是不会对你工作空间产生影响。

image

pull

git pull命令用于将远程仓库同步到本地仓库,并且合入到工作空间。

git pull = git fetch + git merge

image

这里不建议使用rebase代替merge,rebase通常用于分支合并的时候。

commit

git commit命令是将工作空间修改的内容提交至本地仓库。

image

修改文件和暂存文件之间可通过双击自由切换,当然也可以文件的部分提交,最后commit至本地仓库。

push

git push命令用于将本地分支的更新,推送到远程仓库。

image

这里有6次commit的修改需要push。

revert commit

git revert commit命令是撤销某一次commit,即删除该次提交的修改。

image

如图,当我们撤销蒙层不可点击commit时:

image

修改已经删除。

reset

git reset命令是回滚到之前的某个状态。

image

image

有三种回滚方式,这里就不做介绍了。

如果远程仓库已在本地仓库之上,请使用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 (即 上游仓库)

tax-jd-declare-front 2019-08-18 22-03-03.png

添加远程仓库 product 后可以看到其下面所有内容。这时你可以 checkout 任何分支到本地。

  • 与自己仓库交互:rebase、cherry-pick。(不允许 merge,因为来自两个仓库的分支,unrelated history)
  • 上游仓库:本地进行修改,并且可以 pull request ,上游仓库的作者可以将你的修改合并到该仓库。(有时,这样你就为开源项目贡献了代码)

另外一种方式:github 网页中,在原仓库单击 fork 按钮,会在个人仓库中,增加一项 fork 仓库。

三、总结

作为程序员,git是必不可少的管理工具,如果熟练运用,能够很大的提升我们开发规范与开发效率。

灵感来源:通过外包项目,遇到协作的问题,写下此篇博客,更感谢爽能的大力支持。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/108157
 
224 次点击