git - 宣布 git push -f 而其他人都在做 git pull --rebase 有什么不好

标签 git push git-rebase pull

假设

  • 你在 github 上 fork 了一个项目
  • 多人(少于 5 人)正在使用这个 fork
  • 目标是对我们的更改提出 pull 请求

在对我们的分支进行几次提交之后,我们现在想要将我们的分支更新为源项目中的最新 HEAD。因为多人在这个分支上工作,所以标准方法是 pull 下源项目,然后进行 merge 提交以从源项目中引入最新的 HEAD。

我们不喜欢这样,因为它使我们的历史变得非线性,我们将有许多“无用”的 merge 提交。

我们的替代想法是:

  1. git pull --rebase 使本地有最新的forked HEAD
  2. rebase 我们的 fork 以引入新的最新 HEAD 源,这样我们的提交就在源 HEAD 之后
  3. git push --force
  4. 其他人将通过 git pull --rebase 获得最新信息(我们可以为每个人设置默认值)

历史是线性的,只是为 fork 的提交者进行了一些协调。

这种方法有什么问题?

最佳答案

你从这里开始(U 是上游,Y 是你的):

UB--U1--U2
 \
   Y1--Y2

现在你做一个 rebase (和push -f):

UB--U1--U2--Y1'--Y2'

现在您的其他团队成员pull --rebase:

UB--U1--U2--Y1'--Y2'--Y1''--Y2''

正如 robinst 指出的那样——如果你必须解决冲突,git 不会注意到 repo 协议(protocol)中已经有 Y1Y2 的版本,只需再次 rebase (也可能会产生一些丑陋的冲突)。

我只建议进行 merge (您可以查看您的线性历史记录 git 日志 --no-merges)。如果你真的想尝试 rebase 方式,这就是 你可以这样做:

你跑:

git fetch --all
git branch rebase_base master
git push origin rebase_base
git rebase upstream/master
git push -f origin master

然后其他人都运行:

git fetch origin
git rebase --onto origin/master origin/rebase_base master

查看 git help rebase 了解其工作原理 ;)。基本上你告诉 git 直到你已经做了 rebase (rebase_base) 的提交,所以它不会 rebase 不需要它的东西。

关于git - 宣布 git push -f 而其他人都在做 git pull --rebase 有什么不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15367832/

相关文章:

git - 如何在特定提交上将修改后的提交推送到远程 git repo

python - Google Pub/Sub 将订阅推送到受 IAP 保护的 App Engine

javascript - 尝试在 localstorage 之后使用 .push 时数组为空

git - 我如何确定哪些提交在 git 中被压缩了?

git - 将一个本地分支 merge 到另一个本地分支

git - 删除虚假的提交父指针

git - 分支一个分支,如何在另一个分支上 rebase ?

git rebase --continue 与新提交

git - 在 Xcode 中更改 Git 的用户图片

Android,使用 parse.com 推送通知,自动启动应用程序