首页 > 编程知识 正文

请假工作流程图(visio绘制数据流图)

时间:2023-05-05 15:16:00 阅读:77699 作者:763

从dev.to中选择

作者: Lydia Hallie

机器心编译

参加: Panda,杜伟

git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道这些git命令执行什么任务吗? 如果你还不明白,就不要错过这篇文章。 在本文中,熟悉JavaScript、TypeScript、GraphQL、Serverless、AWS、Docker和Golang的21岁年轻软件顾问Lydia Hallie介绍了这些常见的请浏览一下包装。

Git是一个非常强大的工具,但是如果你说使用Git是噩梦,很多人会接受我的说法。 我们发现,在使用Git时,在脑海中可视化并想象当运行特定命令时,这些分支如何相互作用、如何影响历史记录非常有用。 为什么我在master上硬重启,把force push运行到原始分支和rimraf我们的. git文件夹时,同事哭了?

我认为编写几个最常用和有用的Git命令可视化示例将是一个完美的用例! 下面介绍的许多命令都有可选参数——。 这些参数允许您更改相应命令的行为。 在我的示例中,它只复盖命令的默认行为,而不添加(或添加太多)可选配置。

作者Lydia Hallie。

合并

拥有多个分支很方便。 这样可以将不同的新更改相互分离。 此外,还可以防止将未经许可或损坏的代码更改意外推送至生产代码。 但是,一旦批准这些更改,就必须将其引入生产分支

将一个分支的修改合并到另一个分支中的一种方法是运行git merge。 Git可以执行快速前端和不快速前端两种集成。 现在可能不知道,马上看看区别吧。

快速向前(-ff ) ) ) ) )。

如果当前分支没有比要合并的分支更多的“提交”(commit ),可以执行快速向前合并。 Git很懒,首先尝试执行最简单的选项。 快速前锋! 这样的合并不会创建新的提交,而是将正在合并的分支的提交直接合并到当前分支中。

太完美了! 目前,我们在dev分支上所做的所有更改都已集成到主分支中。 那么,no-fast-forward是什么意思?

无快速向前(-no-ff ) ) )。

如果您当前的分支没有提交任何内容超过您希望合并的分支,当然可以,但很遗憾,很少存在现实。如果提交您希望合并到当前分支的任何更改,git将提交无前向合并

使用no-fast-forward合并时,Git会在当前活动分支中创建新的merging commit。 此提交的“父提交”(parent commit )既指此活动的分支,也指要合并的分支!

没什么大不了的,完美的合并! 目前,我们在dev分支上所做的所有更改都已集成到主分支中。

合并冲突

Git可以很好地确定如何合并分支以及如何将更改添加到文件,但不一定完全由自己决定。 如果尝试合并的两个分支的同一文件中的同一行代码有不同的修改,或者一个分支删除了一个文件,另一个分支修改了该文件,Git将不知道如何取舍。

在这种情况下,Git会询问您希望保留哪些选择。 假设在这两个分支中,都编辑了README.md的第一行。

当我们尝试将dev合并到主节点时,会发生合并冲突。 你想标记

题是 Hello! 还是 Hey!?

当尝试合并这些分支时,Git 会向你展示冲突出现的位置。我们可以手动移除我们不想保留的修改,保存这些修改,再次添加这个已修改的文件,然后提交这些修改。

完成!尽管合并冲突往往很让人厌烦,但这是合理的:Git 不应该瞎猜我们想要保留哪些修改。

变基(Rebasing)

我们刚看到可通过执行 git merge 将一个分支的修改应用到另一个分支。另一种可将一个分支的修改融入到另一个分支的方式是执行 git rebase。

git rebase 会将当前分支的提交复制到指定的分支之上。

完美,现在我们在 dev 分支上获取了 master 分支上的所有修改。

变基与合并有一个重大的区别:Git 不会尝试确定要保留或不保留哪些文件。我们执行 rebase 的分支总是含有我们想要保留的最新近的修改!这样我们不会遇到任何合并冲突,而且可以保留一个漂亮的、线性的 Git 历史记录。

上面这个例子展示了在 master 分支上的变基。但是,在更大型的项目中,你通常不需要这样的操作。git rebase 在为复制的提交创建新的 hash 时会修改项目的历史记录。

如果你在开发一个 feature 分支并且 master 分支已经更新过,那么变基就很好用。你可以在你的分支上获取所有更新,这能防止未来出现合并冲突。

交互式变基(Interactive Rebase)

在为提交执行变基之前,我们可以修改它们!我们可以使用交互式变基来完成这一任务。交互式变基在你当前开发的分支上以及想要修改某些提交时会很有用。

在我们正在 rebase 的提交上,我们可以执行以下 6 个动作:

reword:修改提交信息;

edit:修改此提交;

squash:将提交融合到前一个提交中;

fixup:将提交融合到前一个提交中,不保留该提交的日志消息;

exec:在每个提交上运行我们想要 rebase 的命令;

drop:移除该提交。

很棒!这样我们就能完全控制我们的提交了。如果你想要移除一个提交,只需 drop 即可。

如果你想把多个提交融合到一起以便得到清晰的提交历史,那也没有问题!

交互式变基能为你在 rebase 时提供大量控制,甚至可以控制当前的活动分支。

重置(Resetting)

当我们不想要之前提交的修改时,就会用到这个命令。也许这是一个 WIP 提交或者可能是引入了 bug 的提交,这时候就要执行 git reset。

git reset 能让我们不再使用当前台面上的文件,让我们可以控制 HEAD 应该指向的位置。

软重置

软重置会将 HEAD 移至指定的提交(或与 HEAD 相比的提交的索引),而不会移除该提交之后加入的修改!

假设我们不想保留添加了一个 style.css 文件的提交 9e78i,而且我们也不想保留添加了一个 index.js 文件的提交 035cc。但是,我们确实又想要保留新添加的 style.css 和 index.js 文件!这是软重置的一个完美用例。

输入 git status 后,你会看到我们仍然可以访问在之前的提交上做过的所有修改。这很好,这意味着我们可以修复这些文件的内容,之后再重新提交它们!

硬重置

有时候我们并不想保留特定提交引入的修改。不同于软重置,我们应该再也无需访问它们。Git 应该直接将整体状态直接重置到特定提交之前的状态:这甚至包括你在工作目录中和暂存文件上的修改。

Git 丢弃了 9e78i 和 035cc 引入的修改,并将状态重置到了 ec5be 的状态。

还原(Reverting)

另一种撤销修改的方法是执行 git revert。通过对特定的提交执行还原操作,我们会创建一个包含已还原修改的新提交。

假设 ec5be 添加了一个 index.js 文件。但之后我们发现其实我们再也不需要由这个提交引入的修改了。那就还原 ec5be 提交吧!

完美!提交 9e78i 还原了由提交 ec5be 引入的修改。在撤销特定的提交时,git revert 非常有用,同时也不会修改分支的历史。

拣选(Cherry-picking)

当一个特定分支包含我们的活动分支需要的某个提交时,我们对那个提交执行 cherry-pick!对一个提交执行 cherry-pick 时,我们会在活动分支上创建一个新的提交,其中包含由拣选出来的提交所引入的修改。

假设 dev 分支上的提交 76d12 为 index.js 文件添加了一项修改,而我们希望将其整合到 master 分支中。我们并不想要整个 dev 分支,而只需要这个提交!

现在 master 分支包含 76d12 引入的修改了。

取回(Fetching)

如果你有一个远程 Git 分支,比如在 GitHub 上的分支,当远程分支上包含当前分支没有的提交时,可以使用取回。比如当合并了另一个分支或你的同事推送了一个快速修复时。

通过在这个远程分支上执行 git fetch,我们就可在本地获取这些修改。这不会以任何方式影响你的本地分支:fetch 只是单纯地下载新的数据而已。

现在我们可以看到自上次推送以来的所有修改了。这些新数据也已经在本地了,我们可以决定用这些新数据做什么了。

拉取(Pulling)

尽管 git fetch 可用于获取某个分支的远程信息,但我们也可以执行 git pull。git pull 实际上是两个命令合成了一个:git fetch 和 git merge。当我们从来源拉取修改时,我们首先是像 git fetch 那样取回所有数据,然后最新的修改会自动合并到本地分支中。

很好,我们现在与远程分支完美同步了,并且也有了所有最新的修改!

Reflog

每个人都会犯错,但犯错其实没啥!有时候你可能感觉你把 git repo 完全搞坏了,让你想完全删了了事。

git reflog 是一个非常有用的命令,可以展示已经执行过的所有动作的日志。包括合并、重置、还原,基本上包含你对你的分支所做的任何修改。

如果你犯了错,你可以根据 reflog 提供的信息通过重置 HEAD 来轻松地重做!

假设我们实际上并不需要合并原有分支。当我们执行 git reflog 命令时,我们可以看到这个 repo 的状态在合并前位于 HEAD@{1}。那我们就执行一次 git reset,将 HEAD 重新指向在 HEAD@{1} 的位置。

我们可以看到最新的动作已被推送给 reflog。

原文链接:https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。