我们应该如何干净有效地使用 git 个分支?
How should we use git branches cleanly and effectively?
我们有一个分支 staging
,它是我们的主分支。这是部署的分支。
我们有两个开发人员。我们希望单独处理功能,但在将更改推送到 staging
.
之前确保兼容性
我们应该怎么做?
这是我认为我们可以做的。
- 我从
staging
分支创建 feature-avatar-edit
。
- 我的同事从
staging
的同一个提交中分支出来创建 fix-profile-alignment
。他提交了一些东西并完成了这个分支,然后将它合并回 staging
。他删除了 fix-profile-alignment
.
- 我想继续
feature-avatar-edit
,但我希望我同事的更改存在于 feature-avatar-edit
,否则我可能会在完成并合并到 staging
时产生问题。 (基本上,当我几乎完成 feature-avatar-edit
的工作时,我想确认它是否完美运行,包括从 fix-profile-alignment
中添加到 staging
的更改。)
- 我切换到
staging
并执行 git pull
以获取我的同事最近提交的更改。 然后我做了一个 git rebase
到基本上 "move" feature-avatar-edit
与 staging
偏离的点。
- 我查看了
feature-avatar-edit
的当前状态,对出现在我分支中的同事的提交进行必要的修复,然后合并到 staging
。我删除 feature-avatar-edit
.
到目前为止,我发现变基往往会引入重复提交。我期望发生的是这个。变基前:
A staging
| \
B | merge fix-profile-alignment into staging
C feature-avatar-edit
变基后:
A staging
|
B merge fix-profile-alignment into staging
\
|
C feature-avatar-edit
- 如何在不在我们的历史记录中创建重复提交的情况下实现上述目标?或者这样工作可以吗?
- pull requests的使用如何进入呢?假设一次只有一个人在该分支上工作,可以在创建拉取请求后执行
git rebase
吗?
如果您想要线性历史,这正是应该采用的方式。
存在重复提交,因为来自重新定位提交的文件的 内容 不同(因为它包含来自 fix-profile-alignment
的更改),因此 SHA
哈希不同。
您可以通过 deleting the commit object
从您的历史记录中删除它们
rebase 之后,你还在feature-avatar-edit
,stagging
没有修改。如果你合并到 staging,那么你应该立即 push stagging
到远程以避免后面的冲突(否则你必须做 git pull --rebase
来保持历史线性)。但是您也可以定期进行 rebase 以确保您的功能与其他功能正确集成(例如,如果其他开发人员正在开发许多小功能并定期推送到 stagging
)。
我认为您的 "duplicate" 提交可能存在,因为您已推送到远程(如果没有,我们需要您展示重复提交的历史示例)。
开始于:
--A---B---C - staging
\---D - feature - remote/feature
git checkout feature && git rebase staging
之后:
/---D' - feature
--A---B---C - staging
\---D - remote/feature
您获得了新的提交 D'
,但 D
仍然存在。
如果这是你的情况,并且如果你可以在你的遥控器上完全摧毁 D
(没有其他人在使用它或者会生你的气),你可以更新你的分支远程 git checkout feature && git push <remote> feature -f
.
我们有一个分支 staging
,它是我们的主分支。这是部署的分支。
我们有两个开发人员。我们希望单独处理功能,但在将更改推送到 staging
.
我们应该怎么做?
这是我认为我们可以做的。
- 我从
staging
分支创建feature-avatar-edit
。 - 我的同事从
staging
的同一个提交中分支出来创建fix-profile-alignment
。他提交了一些东西并完成了这个分支,然后将它合并回staging
。他删除了fix-profile-alignment
. - 我想继续
feature-avatar-edit
,但我希望我同事的更改存在于feature-avatar-edit
,否则我可能会在完成并合并到staging
时产生问题。 (基本上,当我几乎完成feature-avatar-edit
的工作时,我想确认它是否完美运行,包括从fix-profile-alignment
中添加到staging
的更改。) - 我切换到
staging
并执行git pull
以获取我的同事最近提交的更改。 然后我做了一个git rebase
到基本上 "move"feature-avatar-edit
与staging
偏离的点。 - 我查看了
feature-avatar-edit
的当前状态,对出现在我分支中的同事的提交进行必要的修复,然后合并到staging
。我删除feature-avatar-edit
.
到目前为止,我发现变基往往会引入重复提交。我期望发生的是这个。变基前:
A staging
| \
B | merge fix-profile-alignment into staging
C feature-avatar-edit
变基后:
A staging
|
B merge fix-profile-alignment into staging
\
|
C feature-avatar-edit
- 如何在不在我们的历史记录中创建重复提交的情况下实现上述目标?或者这样工作可以吗?
- pull requests的使用如何进入呢?假设一次只有一个人在该分支上工作,可以在创建拉取请求后执行
git rebase
吗?
如果您想要线性历史,这正是应该采用的方式。
存在重复提交,因为来自重新定位提交的文件的 内容 不同(因为它包含来自 fix-profile-alignment
的更改),因此 SHA
哈希不同。
您可以通过 deleting the commit object
从您的历史记录中删除它们rebase 之后,你还在feature-avatar-edit
,stagging
没有修改。如果你合并到 staging,那么你应该立即 push stagging
到远程以避免后面的冲突(否则你必须做 git pull --rebase
来保持历史线性)。但是您也可以定期进行 rebase 以确保您的功能与其他功能正确集成(例如,如果其他开发人员正在开发许多小功能并定期推送到 stagging
)。
我认为您的 "duplicate" 提交可能存在,因为您已推送到远程(如果没有,我们需要您展示重复提交的历史示例)。
开始于:
--A---B---C - staging
\---D - feature - remote/feature
git checkout feature && git rebase staging
之后:
/---D' - feature
--A---B---C - staging
\---D - remote/feature
您获得了新的提交 D'
,但 D
仍然存在。
如果这是你的情况,并且如果你可以在你的遥控器上完全摧毁 D
(没有其他人在使用它或者会生你的气),你可以更新你的分支远程 git checkout feature && git push <remote> feature -f
.