如何修复 'git-svn' 分支和 'origin/master' 分歧

How to fix 'git-svn' branch and 'origin/master' have diverged

在工作中,我使用 Git 作为 SVN 的客户端,使用 git svn。我也将我的 Git 存储库推送到远程。 SVN 存储库由我办公室的一个团队使用,而 Git 远程存储库目前只有我一个人使用。这是从 SVN 迁移到 Git.

过程的全部内容

我的工作流程包括将我的更改提交到我的本地 Git 存储库,然后从其他人更改的 SVN 更新我的工作副本,提交到 SVN,最后推送到 Git 远程.像这样:

$ git commit
$ git svn rebase
$ git svn dcommit
$ git push origin

这没有问题。

但是今天,我错误地调换了最后两步,所以我推到了原点,然后我做了 git svn dcommit。 这导致 origin/mastermaster 不同,但更重要的是与 git-svn 遥控器不同。现在 git log 看起来像这样:

$ git log --oneline --decorate --graph --all -5
* 613ffa60 (HEAD -> master, git-svn) Fix typo on message displayed to user
| * db2e67ef (origin/master) Fix typo on message displayed to user
|/
* 24d8fab9 Commit C
* c0c1b598 Commit B
* e31c07c0 Commit A

为简单起见,我修改了上面的提交消息,但请注意 masterorigin/master 中的最后两个不同提交实际上包含相同的更改。 我该如何解决这个问题?

我尝试了各种方法,例如 git rebase origin/mastergit reset --hard origin/master,但我得到的只是 masterorigin/master 指向同一个提交。像这样:

$ git log --oneline --decorate --graph --all -5
* 613ffa60 (git-svn) Fix typo on message displayed to user
| * db2e67ef (HEAD -> master, origin/master) Fix typo on message displayed to user
|/
* 24d8fab9 Commit C
* c0c1b598 Commit B
* e31c07c0 Commit A

如果您不使用 git-svn,这些将是解决方案,但我如何让 git-svn 也指向同一个提交?我是否需要一个额外的提交来合并所有内容?

正如我之前所说,目前我是 Git 遥控器的唯一用户,所以如果有必要,我不介意在遥控器中重写历史记录。

作为背景:你出现这种情况的原因是git svn dcommit更改了本地git提交以将相应的SVN修订号添加到git提交消息中。

您的问题的解决方案非常简单。您需要确保您的 git master 与您的 SVN 处于同一提交状态,然后将其强制推送到您的 git 存储库(来源)。

情况 1 的解决方案

如果你在这里:

* 613ffa60 (HEAD -> master, git-svn) Fix typo on message displayed to user
| * db2e67ef (origin/master) Fix typo on message displayed to user
|/
* 24d8fab9 Commit C
* c0c1b598 Commit B
* e31c07c0 Commit A

你只需要做 git push --force 它会用你当前的本地分支覆盖 origin/master 分支,它会再次同步。

情况 2 的解决方案

如果你在这里

* 613ffa60 (git-svn) Fix typo on message displayed to user
| * db2e67ef (HEAD -> master, origin/master) Fix typo on message displayed to user
|/
* 24d8fab9 Commit C
* c0c1b598 Commit B
* e31c07c0 Commit A

执行以下操作将本地 master 带回 SVN 提交,然后强制将其推送到远程 Git 存储库:

$ git checkout master && git reset --hard git-svn && git push --force

备注

请注意,git push --force 没有问题,因为您是远程 Git 存储库的唯一用户。如果其他人也使用它,那么他们将与各自的 master 不同步,这会增加工作量。