我有一个存储在远程仓库中的项目,已经与本地仓库(开发)和服务器仓库(生产)同步。我已经进行了一些提交并将其推送到远程,并从服务器进行了拉取。现在,我想撤销这些更改。因此,我可以只是使用git checkout
到更改之前的提交并提交新的更改,但我猜想再次将它们推送到远程会出现问题。您对如何进行有任何建议吗?
我有一个存储在远程仓库中的项目,已经与本地仓库(开发)和服务器仓库(生产)同步。我已经进行了一些提交并将其推送到远程,并从服务器进行了拉取。现在,我想撤销这些更改。因此,我可以只是使用git checkout
到更改之前的提交并提交新的更改,但我猜想再次将它们推送到远程会出现问题。您对如何进行有任何建议吗?
git revert <commit_hash>
git revert <oldest_commit_hash>..<latest_commit_hash>
git reset <previous label or sha1>
git status
将列出所有已更新的文件,即您更改/添加/.. 并提交的文件)。git commit -am "blabla"
此时,您的本地树与远程树不同
git push -f <remote-name> <branch-name>
将强制远程分支接受此推送并删除先前的推送(不强制指定远程名称和分支名称,但建议这样做以避免使用更新标志更新所有分支)。
!! 注意,某些标签仍可能指向已删除的提交 !! 如何删除远程标签
git push -f
操作,就可以清理远程历史记录!谢谢! - Anton Rybalko在这些情况下我通常会做:
In the server, move the cursor back to the last known good commit:
git push -f origin <last_known_good_commit>:<branch_name>
Locally, do the same:
git reset --hard <last_known_good_commit>
# ^^^^^^
# optional
my_new_branch
上的完整示例:$ git branch
my_new_branch
在将一些东西添加到 myfile.py
后,这是最近的历史记录:
$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date: Wed Mar 23 12:48:03 2016 +0100
Adding new stuff in myfile.py
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date: Tue Mar 18 12:46:59 2016 +0100
Initial commit
我想撤销已经推送的最后一次提交,所以我运行:
$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:me/myrepo.git
+ 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)
myfile.py
)中更改了的文件显示为“未暂存提交”: $ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: myfile.py
no changes added to commit (use "git add" and/or "git commit -a")
因为我不想要这些更改,所以我也将光标在本地后移:
$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit
现在HEAD已经回到了之前的一次提交,无论是在本地还是远程都是如此:
$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date: Tue Mar 18 12:46:59 2016 +0100
Initial commit
这将删除您推送的提交
git reset --hard 'xxxxx'
git clean -f -d
git push -f
为了以防万一,请备份数据。
从评论中提取的两点:
'xxxxx'
是您希望保留的最后一次提交的哈希代码。
clean
很危险。它会删除不在版本控制下的文件!
git reset --soft 'xxxxx'
并继续使用剩下的命令! - Ikbelclean
命令很危险。它会删除那些没有被版本控制的文件! - Friedrich -- Слава Україні如果您遵循以下git命令行步骤,您可以在本地和远程同时REVERT(也可以称为DELETE) Git Commit。
运行以下命令以查看要还原的提交ID:
git log --oneline --decorate --graph
如果你勾选了远程 (通过Web界面),那么你会看到如下所示
根据截图,你现在位于提交ID为e110322,但是你想要本地和远程都回退到030bbf6。
执行以下步骤以本地+远程删除/回滚提交
首先本地回滚到提交ID为030bbf6
git reset --hard 030bbf6
紧随其后
git clean -f -d
这两个命令将强制清除并重置提交阶段030bbf6,如下面快照所示。
现在,如果你运行 git status 命令,你会看到你落后于远程分支两个提交,如下面所示。
运行以下命令来更新你的索引(如果有任何更新)。建议你要求所有开发人员不要接受主远程分支上的任何拉取请求。
git fetch --all
一旦完成后,您需要使用“+”符号强制将此提交推送到分支。如下所示,我在此处使用了“master”分支,您可以将其替换为任何分支。
git push -u origin +master
现在,如果您看到远程的Web界面,则提交应该也被还原。
git push -u origin +YourBrandName
- vibs2006假设61234
是您想要保留的最新可靠提交的sha编号。
git reset --hard 61234
git push -f
会完全删除所有错误的提交记录,不留痕迹。
注意:如果您想将(重置后的提交)推送到特定分支,则应使用git push -f origin branch-name
。
git push -f origin master
时遇到了 remote: GitLab: You are not allowed to force push code to a protected branch on this project.
错误。我认为我需要在我的GitLab服务器上更改一些配置。 - Brian2020 简单方法:
git reset <commit_hash>
(你想要保留的最后提交的哈希值)。
你将保留本地的未提交更改。
如果您想再次推送,您必须执行:
git push -f
git revert HEAD -m 1
在上述代码行中,“最后一个参数表示”
1- 撤销一个提交。
2- 撤销最近的两个提交。
n - 撤销最近的n个提交。
执行此命令后,需要推送以对远程产生影响。您可以选择其他选项,例如指定要撤消的提交范围。这是其中的一种选择。
稍后使用git commit -am“COMMIT_MESSAGE”
,然后git push
或git push -f
git revert ref1..ref2
。 - Null Reference这是我的方法:
假设分支名称为 develop
。
# Checkout a new temp branch based on one history commit
# (command to get history commit hashes: git log --oneline)
git checkout <last_known_good_commit_hash>
# Delete the original develop branch
git branch -D develop
# Create a new develop branch based on the temp branch
git checkout -b develop
# Force update the remote with the new branch
git push -f origin develop
重置硬件对我起作用了: 感谢 @Mo D Genensis 和 @vibs2006
git reset --hard '你上一个可工作的提交哈希值'
git clean -f -d
git push -f
<oldest_commit_hash>
被包含在撤销列表中。 - JHixson