git - 如何push修改提交到远程Git新库中?

  显示原文与译文双语对照的内容

当我用我的源代码做了一点工作,我做了我平常的事情,然后我推到一个远程仓库。 但后来我注意到我忘了在源代码中组织导入。 所以我执行修改命令来替换以前的提交:


> git commit --amend

遗憾的是,提交不能被推回仓库。 它被拒绝如下:


> git push origin
To//my.remote.repo.com/stuff.git/
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

我该怎么办( 我可以访问远程仓库)?

时间:

实际上我一旦与--force推到 git.git 存储库和拥有显示一条由 李纳斯 大时间 。 这会给其他人带来很多问题。 一个简单的答案是"不要这样做"。

--force我看不到别人给了的良方这样做了,在这里我不再一一详述,但我们有提示要从中恢复的办法 之后你有挤合约内容,修订 commit.

  1. 首先,找到你修改过的( 称为 old,我们将调用你通过修改 new 创建的新提交)的旧提交。
  2. 然后在 oldnew 之间创建一个合并,记录 new的树,比如 git checkout new && git merge -s ours old
  3. 使用 git merge master 将它的合并到你的主控形状
  4. 用以下结果更新你的主控形状 git push. HEAD:master
  5. 然后把结果推出来。

然后由amending基础上的他们的工作把你困的人是不幸的,以至于已经冲掉并强制推送( 你是一个非常糟糕的男孩 ) 将会看到所得到的合并会认为,是你通过 oldnew 优先。 他们后来合并将不会看到 old 之间的冲突,从你的命令产生的new 所有的和他们没有要遭殃。

你看到的是一个git安全特性。 git拒绝用你的分支更新远程分支,因为你的分支提交不是你正推入的分支的当前头提交的直接后代。

如果不采用这个规则,那么两个人提交到相同的存储库几乎同时就不会知道已经有一个新提交进入21世纪同时中无论谁在前面的推送机构工作,不用按了最后一个就会失去哪一个都可以realising这个。

使用-f如果知道你是唯一的人的推,并且要让架构已经修正提交或者将一个提交的扁平回分支,你可以建议'强制'最新来更新远程分支 by.


git push -f origin master

git允许远程资源库拒绝non-fastforward推远一端通过使用配置变量'接收。denynonfastforwards',即使这可能无法工作。 如果是这种情况,拒绝原因将类似于这个( 注意'远程拒绝的'部件):


! [remote rejected] master -> master (non-fast forward)

要解决这个问题,你需要更改存储库的远程配置,或者作为一个脏 hack,你可以删除并重新创建这个分支:


git push origin :master
git push origin master

通常,git push的最后一个参数使用格式 <local_ref>:<remote_ref> ,其中 local_ref 是本地存储库的分支名称,remote_ref 是远程存储库中的分支的名称。 这里命令对使用两个 shorthands 。 :master 有一个空的local_ref,这意味着将一个空分支推到远程的master,换句话说,删除远程分支。 没有 :的分支名称意味着将具有给定名称的本地分支推入具有相同名称的远程分支。 master 在这种情况下是 master:master的缩写。

在这里简短的演说告诉:事实上,没有人已经发布的简单答案演示了急需user-hostility性体现在 Git CLI 。

无论如何,"明显"的方法,假设你没有强制推动,是先拉。 这将拉动你 ammended ( 所以不再有)的更改,这样你就可以再次使用它了。

一旦你解决了任何冲突,你可以再次推送。

所以:

 
git pull

 

如果你觉得压抑中的错误,可能出错的地方在你的本地回购 config ( 我有个错误的ref在。git/config分支部分)

之后

 
git push

 

也许你会得到一个额外的提交,主题讲述了一个trivial琐碎合并 merge"

简短回答:不要将修改后的提交提交到公用仓库。

长的回答:一些Git命令,比如 git commit --amendgit rebase,实际上重写了历史图。 这很好,只要你还没有发布更改,但是一旦你做了,你真的不会浪费历史,因为如果有人已经获得了你的更改,那么他们就会失败。 你不应该修改提交,而是使用更改进行新的提交。

但是,如果真的想要推动修改的提交,你可以这样做:


$ git push origin +master:master

前导 + 符号将强制进行推送,即使它不会导致"fast-forward"提交。 在公共回购。), ( 一个fast-forward更改时发生的变化你已经在推送的是一位直接后代变更

通过放弃本地修改的提交并在顶部添加新的更改,我已经解决了:


# rewind to commit before conflicting
git reset --soft HEAD~1
# pull the remote version
git pull
# add the new commit on top
git add.. .
git commit
git push

有同样的问题。

  • 意外修改了上次提交的allready
  • 本地做了很多更改,提交了 5次
  • 试图推,得到一个错误,恐慌,合并的遥控器,有很多 not-my-files,推,失败等。

作为一个 GIT-newbie,我认为它是 comlpete fubar 。

解决方案:有点像 @bara 建议的+ 创建了一个本地备份分支


# Rewind to commit just before the pushed-and-amended one. 
# Replace <hash> with the needed hash.
# --soft means: leave all the changes there, so nothing is lost.
git reset --soft <hash>

# Create new branch, just for a backup, still having all changes in it. 
# The branch was feature/1234, new one - feature/1234-gone-bad
git checkout -b feature/1234-gone-bad

# Commit all the changes (all the mess) not to lose it & not to carry around
git commit -a -m"feature/1234 backup"

# Switch back to the original branch
git checkout feature/1234

# Pull the from remote (named 'origin'), thus 'repairing' our main problem
git pull origin/feature/1234

# Now you have a clean-and-non-diverged branch and a backup of the local changes.
# Check the needed files from the backup branch
git checkout feature/1234-gone-bad -- the/path/to/file.php

也许它不是一个快速干净的解决方案,我丢失了我的历史( 1提交而不是 5 ),但它保存了一天的工作。

如果你没有将代码推送到远程 branch(Github/Bitbucket),你可以在 命令行 上更改提交消息,如下所示。


 git commit --amend -m"Your new message"

如果你正在处理特定分支,请执行这里操作。


git commit --amend -m"BRANCH-NAME: new message"

如果你已经用错误的消息推送了代码,那么在更改消息时需要小心。 当你更改提交消息并尝试再次推送时,你会遇到问题。 按照以下步骤使它平滑。 请先阅读,然后再进行


git commit --amend -m"BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME # Not a best practice. Read below why?

在同一 branch, 重要注意: 当你使用直接强制推送你可能在最后得到的代码问题,其他开发人员可能工作后。 因此,为了避免冲突,你需要先从分支中提取代码,然后再按


 git commit --amend -m"BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

这是更改提交消息时的最佳实践,如果它已经被推送。

...