“time-lapse photography of man standing beside road and bridge during daytime” by Ahsan Avi on Unsplash
我在提交中犯了一个错误,我该如何解决?
我的提交历史很糟糕,我该如何让它更整洁?
如果你有过上述问题,那么这篇文章适合你。这篇文章涵盖了一系列主题,这些主题将使您成为Git专家。
如果您不了解Git基础知识,请单击此处查看我的Git基础知识博客。您必须了解Git的基础知识才能充分利用本文。
我的提交中犯了一个错误。我该怎么办?
“broken ceramic plate on floor” by chuttersnap on Unsplas
场景1
假设您已经提交了一堆文件并意识到您输入的提交说明跟实际上并不清楚。现在您要更改提交说明。为此,您可以使用git commit --amend
git commit --amend -m “New commit message”
情景2
假设您想提交六个文件,但是,错误地,您最终只提交了五个文件。您可能认为可以创建新提交并将第6个文件添加到该提交。
这种方法没有错。但是,为了保持一个整洁的提交历史,如果你真的能以某种方式将这个文件添加到你之前的提交本身,那不是更好吗?这也可以通过以下方式完成git commit --amend:
git add file6
git commit --amend --no-edit
--no-edit 表示提交说明不会更改。
场景3
无论何时在Git中进行提交,提交都会附上作者姓名和作者电子邮件。通常,当您第一次设置Git时,您需要设置作者姓名和电子邮件。您无需担心每次提交的作者详细信息。
也就是说,对于特定项目,您可能希望使用不同的电子邮件ID。您需要使用以下命令为该项目配置电子邮件ID:
git config user.email “your email id”
假设您忘记配置电子邮件,并且已经完成了第一次提交。Amend也可用于更改先前提交的作者。可以使用以下命令更改提交的作者:
git commit --amend --author "Author Name <Author Email>"
要点注意
只在本地存储库中使用modify命令。对远程存储库使用modify可能会造成很多混淆。
我的提交历史是一团糟。我该如何处理?
假设您正在处理一段代码。您知道代码大约需要十天才能完成。在这十天内,其他开发人员也将提交代码到远程存储库。
将本地存储库代码与远程存储库中的代码保持同步是一种很好的做法。这会在您提出拉取请求时避免很多合并冲突。因此,您决定每两天从远程存储库中提取一次更改。
每次将代码从远程存储库提取到本地存储库时,都会在本地存储库中创建新的合并提交。这意味着您的本地提交历史将有大量的合并提交,这可能会使审阅者感到困惑。
以下是提交历史记录在本地存储库中的显示方式。
如何使提交历史更整洁?
这就需要rebase来处理。
什么是rebase?
让我通过一个例子解释一下。
此图显示了发布分支和功能分支中的提交
- Release分支有三个提交:Rcommit1,Rcommit2和Rcommit3。
- 您只在一次提交时从Release分支创建了Feature分支,即Rcommit1。
- 您已向Feature分支添加了两个提交。它们是Fcommit1和Fcommit2。
- 您的目标是从Release分支到您的Feature分支的提交。
- 你将使用rebase来做到这一点。
- 让Release分支的名称release ,Feature分支的名称是feature。
- 可以使用以下命令重新进行重新定位:
git checkout feature
git rebase release
Rebasing
在重新定位时,您的目标是确保功能分支从Release分支获取最新代码。
重新尝试尝试逐个添加每个提交,并检查冲突。这听起来有点令人困惑吗?
让我在图表的帮助下解释。
这显示了内部实际的变革:
步骤1
- 运行该命令的那一刻,Feature分支指向Release分支的头部。
- 现在,Feature分支有三个提交:Rcommit1,Rcommit2和Rcommit3。
- 您可能想知道Fcommit1和Fcommit2发生了什么。
- 提交仍然存在,将在下面的步骤中使用。
第2步
- 现在Git尝试将Fcommit1添加到Feature分支。
- 如果没有冲突,则在Rcommit3之后添加Fcommit1
- 如果存在冲突,Git会通知您,您必须手动解决冲突。解决冲突后,使用以下命令继续重新绑定
git add fixedfile
git rebase --continue
第3步
- 一旦添加了Fcommit1,Git将尝试添加Fcommit2。
- 同样,如果没有冲突,则在Fcommit1之后添加Fcommit2并且rebase成功。
- 如果存在冲突,Git会通知您,您必须手动解决。解决冲突后,请使用步骤2中提到的相同命令
- 整个rebase完成后,您会注意到Feature分支有Rcommit1,Rcommit2,Rcommit3,Fcommit1和Fcommit2。
注意事项
- Rebase和Merge在Git中都很有用。Rebase并不比Merge好。
- 在合并的情况下,您将进行合并提交。在rebase的情况下,没有像合并提交那样的额外提交。
- 一种最佳实践是在不同点使用命令。使用远程存储库中的最新代码更新本地代码存储库时,请使用rebase。在处理pull请求以将Feature分支与Release或Master分支合并时,请使用merge。
- 使用Rebase会改变提交历史记录(使其更整洁)。但话虽如此,改变提交历史存在风险。因此,请确保永远不要对远程存储库中的代码使用rebase。始终只使用rebase来更改本地仓库代码的提交历史记录。
- 如果对远程存储库进行了rebase,则会产生很多混淆,因为其他开发人员无法识别新的历史记录。
- 此外,如果在远程存储库上完成rebase,则当其他开发人员尝试从远程存储库中提取最新代码时,它可能会产生问题。所以我再说一遍,总是只为本地存储库使用rebase
恭喜
你现在是Git专家