【问题标题】:Cannot push a commit twice to my remote无法将提交两次推送到我的遥控器
【发布时间】:2019-01-29 00:08:01
【问题描述】:

我正在尝试将修改后的提交从一个 repo 推送到另一个 repo(在另一台机器上),并且无法理解为什么它第二次无法正常工作。

我的会话(已编辑,但仍然相关):

[/c/git/repo] (mybranch)
[user] $ git commit -a --amend
[mybranch ad1804290] Add filtering
 Date: Thu Jun 21 09:50:43 2018 -0400
 26 files changed, 2302 insertions(+), 2006 deletions(-)

[user] $ git push centos7vm mybranch
Counting objects: 157, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (135/135), done.
Writing objects: 100% (157/157), 59.76 KiB | 3.51 MiB/s, done.
Total 157 (delta 121), reused 34 (delta 15)
To ssh://mymachine/home/user/git/repo
 * [new branch]          mybranch -> mybranch

有效,对吧?让我们进行一些更改,然后再试一次:

[/c/git/repo] (mybranch)
[user] $ git commit -a --amend
[mybranch 26c680cbf] Add filtering
 Date: Thu Jun 21 09:55:43 2018 -0400
 26 files changed, 2302 insertions(+), 2006 deletions(-)

[/c/git/repo] (mybranch)
[user] $ git push centos7vm mybranch
To ssh://mymachine/home/user/git/repo
 ! [rejected]            mybranch -> mybranch (non-fast-forward)
error: failed to push some refs to 'ssh://user@mymachine/home/user/git/repo'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

失败了……但是,为什么?我什至没有检查远程分支上的任何更改。我当前的分支怎么可能在遥控器后面?这对我来说毫无意义。

我的远程设置:

[user] $ git remote show centos7vm
* remote centos7vm
  Fetch URL: ssh://user@mymachine/home/user/git/repo
  Push  URL: ssh://user@mymachine/home/user/git/repo
  HEAD branch: development
  Remote branches:
  Local refs configured for 'git push':
    development        pushes to development        (fast-forwardable)
    mybranch           pushes to mybranch           (local out of date)

【问题讨论】:

标签: git git-push


【解决方案1】:

当您第一次提交时,您的本地 HEAD 从 A 更改为 B。通过推送到远程,您可以快进远程分支,使其 HEAD 也指向 B。

当您修改时,您不是在 B 之后创建修订 C,而是在修改 B,本质上是使其成为 B'。最终,当您尝试第二次推送时,git 会验证 B 和 B' 是否具有相同的父 A,但哈希值不同,这是一个冲突。

    / B  (remote)
A---
    \ B' (local)

解决此问题的一种方法是通过使用 -f 标志推送来覆盖远程提交,出于显而易见的原因,强烈建议不要这样做。

听起来您的工作流程也存在缺陷。理想情况下,您应该使用像 Gerrit 或类似的代码审查系统,它允许您为相同的提交推送后续修改。只有通过审查、验证等的最后一个修订才会在分支中结束。

【讨论】:

  • 这是我,从一台 PC 推送到另一台,用于构建和测试。 Gerrit 将在稍后代码构建和正常运行时发挥作用。
【解决方案2】:

如果您仔细查看您的命令,您会发现 --amend 实际上创建了一个新提交。

第一次尝试:

  [user] $ git commit -a --amend
  [mybranch ad1804290] Add filtering

第二次尝试:

  [user] $ git commit -a --amend
  [mybranch 26c680cbf] Add filtering

ad180429026c680cbf

在推送之后更改提交很少是一个好主意。我会保持原样。 如果您需要更改,只需创建一个新的提交即可。

由于您正在自己工作,push --force 在这里可能没问题,但使用-f 是一个非常不好的习惯。

最好不要修改推送的提交。

【讨论】:

  • 那么,这将如何工作......推送(到我的 linux 远程)是否只接受新的内容,将其推送并调整远程 HEAD 以指向最新提交?这对 gerrit 的提交有何影响?在推送到 gerrit 之前,我最终是否需要压缩多个提交?然后我将如何处理代码审查引起的更改?
猜你喜欢
  • 2018-12-29
  • 2015-07-12
  • 2016-06-17
  • 2019-06-18
  • 2021-12-16
  • 2020-11-30
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多