无法两次将提交推送到我的遥控器

时间:2018-08-22 16:58:03

标签: git git-push

我试图将修改后的提交从一个存储库推送到另一个存储库(在另一台机器上),并且无法理解为什么第二次不起作用。

我的会话(已编辑,但仍然有意义):

[/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)

2 个答案:

答案 0 :(得分:0)

当您第一次提交时,本地HEAD从A变为B。通过将其推送到远程,您可以快速转发远程分支,使其HEAD也指向B。

修改时,您并不是在B之后创建修订版本C,而是在修改B,实际上就是将其设为B'。最终,当您尝试第二次推送时,git验证B和B'的父A相同,但哈希不同,这是冲突的。

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

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

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

答案 1 :(得分:0)

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

第一次尝试:

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

第二次尝试:

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

({ad180429026c680cbf

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

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

如果不修改推送的提交,那就更好了。