git pull恢复更改

时间:2019-06-05 23:44:35

标签: git gitlab

我在分支中提交并推送了对git的更改,但随后意识到其中有些不正确。我删除了不正确的部分,并试图修改原始提交,因为这是我组织的标准。但是,当我尝试推送到远程时,它说:

提示:由于当前分支的提示位于后面,因此更新被拒绝 提示:它的远程副本。集成远程更改(例如 提示:“ git pull ...”),然后再次按下。 提示:有关详细信息,请参见“ git push --help”中的“关于快进的注意事项”。

然后当我进行git pull时,它会将我的更改恢复为原始提交的更改(被删除的部分重新出现)。我该如何解决?

2 个答案:

答案 0 :(得分:0)

当您修改一个提交时,您会通过用新的提交替换旧的提交来重写本地历史记录,也就是说,新的提交将具有与旧的提交相同的父提交。 / p>

之前:

x---x---P---O <--- master, origin/master

修正后:

x---x---P---A <--- master
         \
          +-O <--- origin/master

当将此状态推送到源时,git会检测到您的(本地)分支是远程回购之后的一次提交,旧提交并中止。

要重写远程仓库上的历史记录,您需要强制将其推入原处

git push --force origin

推动--force后:

x---x---P---A <--- master, origin/master

现在,您要做的就是与已经撤消旧承诺的队友打交道。

这部分内容可能不完整,但在某些情况下对我们已经足够。 那些没有任何本地提交的用户可以获取其本地master分支并将其重置为新的origin/master

git fetch
git checkout master
git reset --hard origin/master

基于旧提交进行任何本地更改的任何人都可以在获取和重置之前隐藏或提交到本地分支(可以从中临时选择本地提交的临时分支)。

答案 1 :(得分:0)

正如乔兰(Joran)所述,您的上游与您修订后的本地不同步。如果您要使用force,我建议您使用--force-with-lease,因为只有您一个人在上游提交时,它才强制推送。

这样可以节省您写同事的工作的麻烦,因为这只会迫使您替换工作

但是总的来说,我认为最好再次分支。

git checkout -b "my-feature-branch-fix"
git push -u origin my-feature-branch-fix

完成并合并后,返回并删除旧分支

git branch -D branch_name

这会花费更长的时间,但是更安全,因为您要保留两个副本,直到所有内容合并,并且git历史记录更准确地表示实际发生的情况为止。