修改提交后本地分支和远程分支出现分歧

0 git branch git-push git-amend git-commit

我有一个feature名为的分支featureA,我是唯一正在并将接触该分支直到它合并到master分支的开发人员。

我的 git 命令历史记录是:

  1. 本地提交的更改
  2. 进行了更多更改,然后通过修改提交推送到远程
  3. 又进行了一项更改(在一行上),然后通过修改提交推送到远程

但它似乎没有推送到远程存储库。

git status输出:

您的分支 和origin/featureA已经出现分歧,并且分别有 1 个和 1 个不同的提交。(用于git pull将远程分支合并到您的分支中)

git diff表明:

  • 本地分支:应用最后一行更改
  • 远程原始分支:不应用最后一行更改

我的featureA分支将被合并到master分支,所以我不想破坏历史。

我经历了几个线程(建议git pul --rebasegit reset --hard等等),但仍然不清楚什么是最好的解决方案。

我不介意解决方案将处于哪种状态。如果需要,我不介意返回到之前的推送/提交并再次将新更改作为新提交推送,因为这只是单行代码更改。

我感谢您的帮助。

tor*_*rek 7

发生这种情况的原因很简单:git commit --amend这是一个谎言。大多数时候这是一个有用的谎言,但它仍然是一个谎言。更改任何现有的 Git 提交实际上是不可能的,所以git commit --amend不要这样做。

\n

相反,在您自己的本地存储库中git commit --amend进行新的和改进的替换提交,将旧提交“推开”。旧的(坏的)提交继续存在\xe2\x80\x94一段时间;最终,如果您不回收它(并且没有理由您应该回收它),Git 将真正删除它。

\n

因为您的本地存储库是与其他存储库(“远程”)不同的存储库,并且“我们应该使用哪些提交”的这种更改仅在此时在本地发生,所以您的分支和他们的分支确实存在分歧。

\n

如果您有权限 \xe2\x80\x94Git 本身始终会授予权限,但许多托管站点会剥夺它(在各种条件下)\xe2\x80\x94您可以使用将git push --force新的和改进的提交发送其他 Git 软件正在使用远程存储库。这种“强制推送”告诉他们的 Git 软件:我知道这个新提交会丢弃一些以前的提交。无论如何都要这样做,尽管放弃一些以前的提交通常是一个非常糟糕的主意。 因为您非常确定您确实想要丢弃提交\xe2\x80\x94,所以它是您“修改”的提交,并且您不希望它再次返回\xe2\x80\x94,所以可以安全地告诉他们这一点。只要非常确定这是您要丢弃的提交:

\n
    \n
  • 跑步git fetch
  • \n
  • 验证您的本地git status仍然显示“分歧”和“1 次提交”:这是您的“修改后”提交与原始提交的比较
  • \n
\n

然后使用远程名称 ( ) 和分支名称运行git push --forceor 。git push --force-with-leaseoriginfeatureA

\n