【问题标题】:git: Duplicate Commits After Local Rebase Followed by Pullgit:本地变基后重复提交,然后是拉取
【发布时间】:2015-03-01 04:39:57
【问题描述】:

我有一个本地 git 存储库,我运行以下命令:

git.exe pull -v --no-rebase --progress "origin" // pull 1
(make a few local commits)
git.exe pull -v --no-rebase --progress "origin" // pull 2
git log --pretty=format:"%h - %an : %s"         // log 1
git rebase -i HEAD~4
(move local commit 1 down 2 positions)
git log --pretty=format:"%h - %an : %s"         // log 2
git.exe pull -v --no-rebase --progress "origin" // pull 3
git log --pretty=format:"%h - %an : %s"         // log 3

完成此操作后,我在 pull 1 中检索到的远程存储库的所有提交现在都在日志中重复了。

日志 1 如下所示:

84e4015 - Me : Local Commit 3
0dbe86a - Me : Local Commit 2
d57ba2a - Me : Merge branch 'master' of remote repository
a86ea35 - Me : Local Commit 1 before reordering
2fc4fe7 - Remote User 2 : Remote Commit 2
b7a8656 - Remote User 1 : Remote Commit 1
8ce80fc - Me : Merge branch 'master' of remote repository

日志 2 如下所示:

cf1ff7b - Me : Local Commit 3
cd14463 - Me : Local Commit 2
b9d44fb - Me : Local Commit 1 after reordering
9777c56 - Remote User 2 : Remote Commit 2
a2d7d8b - Remote User 1 : Remote Commit 1
8ce80fc - Me : Merge branch 'master' of remote repository

日志 3 看起来像这样:

e8e1a85 - Me : Merge branch 'master' of remote repository
cf1ff7b - Me : Local Commit 3
cd14463 - Me : Local Commit 2
b9d44fb - Me : Local Commit 1 after reordering
9777c56 - Remote User 2 : Remote Commit 2
a2d7d8b - Remote User 1 : Remote Commit 1
2fc4fe7 - Remote User 2 : Remote Commit 2 // duplicate 2
b7a8656 - Remote User 1 : Remote Commit 1 // duplicate 1
8ce80fc - Me : Merge branch 'master' of remote repository

我做错了什么?我该如何预防?我该如何解决?

请注意,我从未推送到远程存储库,只是从中提取并进行本地提交。另请注意,这个问题有很多类似标题的主题,但它们都有点不同,那里的答案似乎不适用于这里。

【问题讨论】:

标签: git duplicates rebase pull


【解决方案1】:

不是你,是远程用户。看起来他们已经重新调整了您已经基于工作的提交,然后将其推回原点。不太善于交际。

线索是远程用户的提交引用从 log1 更改为 log2 - 他们重新定位并推送他们的工作。但是你的工作是基于他们预先重新调整的提交。因此,您的本地仓库包含这两个提交(2fc4fe7,b7a8656),他们的 rebase 已从其仓库和来源中根除(大概他们使用 --force 推送)。因此,当您随后从源中提取这些本地提交时,这些本地提交似乎被重生以确保您的提交历史得到保留,并且远程用户的重新提交(9777c56,a2d7d8b)也被合并。因此重复。

【讨论】:

  • 谢谢罗杰。相关问题,如果我有 3 个提交,提交 3(最新)、提交 2(中间)和提交 1(最旧)。我推送了提交 3。然后我重新设置了提交 1,使其成为最新的,然后推送了提交 1。我会不会对其他用户造成同样的失败?
  • 实际上,Roger,看起来我的本地变基在日志 2 中为远程用户的提交提供了新的 SHA、9777c56 和 a2d7d8b。这不应该发生吗?当我拉出它时,它重新创建了最初在日志 1、2fc4fe7 和 b7a8656 中看到的原始 SHA。你确定不是我的错?如果是我的错,我做错了什么?
  • 根据您的原始帖子,您没有推送到另一个 repo,因此您本地 repo 中发生的任何事情都不会对世界其他地方产生影响。你可以搞乱你在本地进行的(新的)提交,但是一旦你推回原点,或者你从原点拉新的提交,你就不能对这些提交进行变基。很好的解释here.
  • 其实再看一遍就完全没有意义了。在日志中获取重复项通常表明远程用户重新调整了您所依赖的提交,但在这种情况下,远程用户的提交正在更改而无需拉取。你能准确地记得你在交互式 rebase 中做了什么吗?日志似乎与行动不符。例如将 log1 与操作列表进行比较,在 pull2 之间如何发生提交 0d 和 84 以创建合并提交 d5 和正在生成的 log1?
  • 您可以将git pull --rebase origin [your-local-branch] 视为当您在本地分支上工作时其他人对 origin 进行提交,并且您希望提交历史看起来好像您已经完成了您的操作在他们之后工作。无论提交的顺序(变基位)如何,您都必须在某个时候进行合并。并且 git pull 进行合并,因为在幕后它是 git fetch 然后是 git merge。所以git pull --rebase 是您需要的合并,并且它将您的本地提交放在任何远程提交之后。之后不要忘记推回原点。
【解决方案2】:

问题在于 git pull。我应该使用:

git pull --rebase

这会重新设置我的本地提交,使它们比远程仓库中的提交位于顶部,即更新。因此,当我重新设置提交以重新排序时,我不会重新设置已推送到远程仓库的提交。通过重新定位已推送到远程仓库的提交,我正在复制它们并为它们分配一个新的 SHA,当我执行第二个 git pull 时,它重新提取了原始 SHA/提交,因此出现了重复。

更多详情请看这里:

git: Pushing Single Commits, Reordering with rebase, Duplicate Commits

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2022-11-05
    • 2021-06-14
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多