【发布时间】:2017-07-21 20:30:10
【问题描述】:
在 gitlab 中创建合并请求时,我经常收到一条消息: 请求将分支 A 合并到开发中([x] 提交后) gitlab 想告诉我什么? 我应该担心还是需要解决一些问题(什么)?
【问题讨论】:
在 gitlab 中创建合并请求时,我经常收到一条消息: 请求将分支 A 合并到开发中([x] 提交后) gitlab 想告诉我什么? 我应该担心还是需要解决一些问题(什么)?
【问题讨论】:
一段时间后,合并请求在项目中打开,由于其他人合并他们自己的更改,您尝试合并到的分支版本过时是正常的。
Gitlab 通过显示您更新的分支版本落后于远程分支的程度来帮助您。
落后不会对合并的行为造成任何阻碍,但是rebase 你的提交在你合并到的分支之上是一种常见的做法。这将通过将您的提交按时间顺序放在该分支中已经存在的提交之后来更新您的合并请求。这种方法使负责合并的人的工作更容易,因为提交者自己已经解决了可能发生的任何冲突。
按照您提出的方案执行rebase 将是这样的:
# Add a remote named `upstream` pointing to the original repository
git remote add upstream https://gitlab.example.com/example/your_project.git
# Fetch the latest commmits from `upstream`
git fetch upstream
# Checkout our branch-A
git checkout branch-A
# Rebase our branch on top of the `upstream/develop` branch
git rebase upstream/develop
# If needed fix any conflicts that may have appeared and then `git rebase --continue`
# Push the changes to the branch of your merge request
git push --force origin branch-A
注意:--force 标志在你推送时是必需的,因为你正在重写 origin/branch-A 的提交历史。来自git's doc:
[--force] 会导致远程仓库丢失提交; 小心使用。
【讨论】:
git remote add upstream 做什么?当所有远程分支都已获取时,是否也可以只执行git rebase develop?
--force 的示例中,所以这样做没有问题。 git push --force 是一个工具,应该在适当的时候使用。
如果您看到“在 X 提交之后”消息,则 gitlab 表明您要合并的分支已经从您的分支点移动。
当您在 gitlab 中查看差异时,它们可能看起来令人困惑,可能表明您将撤消在目标分支上的后续提交中实现的更改。
如果您想确保准确看到合并将执行的更改,最安全的做法是通过首先在目标分支中合并来更新您要合并的分支...
# fetch the latest code on all branches
git fetch
# checkout your working branch (if you're not already on it)
git checkout branch-A
# merge in the target branch
git merge origin/develop
修复任何可能出现的冲突,然后提交:
# stage changes & commit
git add .
git commit
# push changes to origin
git push
如果您现在刷新 gitlab 上的合并请求页面,“后面”消息将消失,差异将仅反映您所做的更改。
这比重新设置分支要安全得多,因为它不需要 --force 推送。这也意味着 git 时间线的年表与实际发生的情况相匹配,因此如果您试图在未来追踪某个问题,您不会被重写历史所误导。
缺点是提交历史看起来有点混乱。
【讨论】:
除了@alejdg 的回答, 防止这种情况发生
[--force] 会导致远程仓库丢失提交;小心使用。
您也可以使用--force-with-lease,它比--force 更安全,
如果在您的 rebase 和您的 push --force more information 之间插入其他提交
【讨论】:
除了上面的答案之外,我通常会执行以下操作来重新定位我的本地分支并推送。如果我是贡献者,通常我会将远程源添加到本地 git 存储库中。
git pull
git checkout <your-branch>
git rebase origin/<remote-branch>
git push --force origin <your-branch>
【讨论】: