如何修复 '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/master
与 master
不同,但更重要的是与 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
为简单起见,我修改了上面的提交消息,但请注意 master
和 origin/master
中的最后两个不同提交实际上包含相同的更改。
我该如何解决这个问题?
我尝试了各种方法,例如 git rebase origin/master
或 git reset --hard origin/master
,但我得到的只是 master
和 origin/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
不同步,这会增加工作量。
在工作中,我使用 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/master
与 master
不同,但更重要的是与 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
为简单起见,我修改了上面的提交消息,但请注意 master
和 origin/master
中的最后两个不同提交实际上包含相同的更改。
我该如何解决这个问题?
我尝试了各种方法,例如 git rebase origin/master
或 git reset --hard origin/master
,但我得到的只是 master
和 origin/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
不同步,这会增加工作量。