我在远程存储库中有一个项目,与本地存储库(开发)和服务器(prod)同步.我一直在做一些已经推送到远程的提交更改并从服务器中提取.现在,我想撤消这些更改.所以我可以git checkout在更改之前提交并提交新的更改,但我猜测将它们再次推送到远程会有问题.有关如何进行的任何建议?
git*_*rik 609
您可以使用以下命令还原单个提交:
git revert <commit_hash>
Run Code Online (Sandbox Code Playgroud)
这将创建一个新的提交,它将恢复您指定的提交的更改.请注意,它只会还原该特定提交,而不会在此之后提交.如果要还原一系列提交,可以这样做:
git revert <oldest_commit_hash>..<latest_commit_hash>
Run Code Online (Sandbox Code Playgroud)
它还原指定提交之间的提交.
有关该命令的更多信息,请查看git-revert手册页git revert.有关还原提交的更多信息,请查看此答案.
jo_*_*jo_ 297
一种不会留下"撤消"痕迹的解决方案.
注意:如果有人已经取消了您的更改,请不要这样做(我只会在我的个人仓库中使用此功能)
做:
git reset <previous label or sha1>
Run Code Online (Sandbox Code Playgroud)
这将在本地重新检查所有更新(因此git status将列出所有更新的文件)
那么你"做你的工作"并重新提交你的更改(注意:这一步是可选的)
git commit -am "blabla"
Run Code Online (Sandbox Code Playgroud)
此时,您的本地树与远程树不同
git push -f <remote-name> <branch-name>
Run Code Online (Sandbox Code Playgroud)
将推送并强制远程考虑此推送并删除前一个(指定remote-name和branch-name不是强制性的,但建议避免使用update标志更新所有分支).
!注意一些标签可能仍然指向删除提交!! 如何到删除-A-远程标签
fed*_*qui 157
我在这些情况下做的是:
在服务器中,将光标移回上一次已知的良好提交:
git push -f origin <last_known_good_commit>:<branch_name>
Run Code Online (Sandbox Code Playgroud)在本地,做同样的事情:
git reset --hard <last_known_good_commit>
# ^^^^^^
# optional
Run Code Online (Sandbox Code Playgroud)查看my_new_branch我为此目的创建的分支上的完整示例:
$ git branch
my_new_branch
Run Code Online (Sandbox Code Playgroud)
这是添加一些东西后的近期历史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
Run Code Online (Sandbox Code Playgroud)
我想摆脱已经被推送的最后一次提交,所以我运行:
$ 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)
Run Code Online (Sandbox Code Playgroud)
太好了!现在我看到在commit(myfile.py)中更改的文件显示在"not staged for commit"中:
$ 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")
Run Code Online (Sandbox Code Playgroud)
由于我不想要这些更改,我只是将光标移回本地:
$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit
Run Code Online (Sandbox Code Playgroud)
所以现在HEAD在本地和远程的前一次提交中:
$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date: Tue Mar 18 12:46:59 2016 +0100
Initial commit
Run Code Online (Sandbox Code Playgroud)
vib*_*006 66
如果您通过git命令行执行下面给出的步骤,您可以本地和远程 REVERT(或者您也可以将其命名为DELETE)Git Commit BOTH.
运行以下命令以查看要还原的提交ID
git log --oneline --decorate --graph
Run Code Online (Sandbox Code Playgroud)
如果您还检查远程(通过Web界面),那么您可以看到这将如下所示
按照目前的截图你在提交ID e110322但是要恢复到030bbf6 BOTH 本地和远程.
执行以下步骤以本地+远程执行DELETE/REVERT提交
首先在本地恢复提交id 030bbf6
git reset --hard 030bbf6
Run Code Online (Sandbox Code Playgroud)
其次是
git clean -f -d
Run Code Online (Sandbox Code Playgroud)
这两个命令清除强制重置以提交阶段030bbf6,如下面的快照中所示

现在,如果你运行git status,那么你将看到你是远程分支的两个提交者,如下所示

运行以下命令以更新索引(如果有任何更新).建议您要求所有开发人员不要接受主远程分支上的任何拉取请求.
git fetch --all
Run Code Online (Sandbox Code Playgroud)
完成后,您需要在分支前面使用+符号强制推送此提交,如下所示.我在这里用作主分支,你可以用任何替换它
git push -u origin +master
Run Code Online (Sandbox Code Playgroud)
现在,如果您看到远程的Web界面然后提交,那么也应该还原.
Xys*_*Xys 40
2020 简单方法:
git reset <commit_hash>
Run Code Online (Sandbox Code Playgroud)
(您要保留的最后一次提交的哈希值)。
您将在本地保留现在未提交的更改。
如果你想再次推送,你必须这样做:
git push -f
Run Code Online (Sandbox Code Playgroud)
Sep*_*eha 36
假设61234是您要保留的最后一个好的提交的 sha-number。
git reset --hard 61234
git push -f origin master
Run Code Online (Sandbox Code Playgroud)
? 将完全删除所有错误的提交,没有任何痕迹。
注意:示例假定 master 分支位于 'origin' 远程。
Mo *_*sis 21
这将删除您的推送提交
git reset --hard 'xxxxx'
git clean -f -d
git push -f
Run Code Online (Sandbox Code Playgroud)
Sir*_*dda 20
git revert HEAD -m 1
Run Code Online (Sandbox Code Playgroud)
在上面的代码行中."最后一个论点代表"
1 - 恢复一个提交.
2 - 恢复最后两次提交.
n - 恢复最后n次提交.
您需要在此命令后按下以对远程执行效果.您还有其他选项,例如指定要还原的提交范围.这是一个选择.
以后git commit -am "COMMIT_MESSAGE"
再使用git push或git push -f
Sl4*_*4st 12
There are a number of ways like moving back commits by using git reset HEAD^, adding a ^ for every commit you want to go back, problem is the changes after that commit are then lost and can be added in a new commit. So I only do this when I only have to go one or two commits back.
To do it cleanly use the following:
git rebase -i <hash of last good commit, 9 chars is enough>
Run Code Online (Sandbox Code Playgroud)
Now you will get a list of the commits from the last good commit to the HEAD with options what to do with each commit, going from the most recent at the top to the one just before the commit of the hash you added to the command. It will look something like this:
您可以将每次提交之前更改pick为选项列表中的任何其他选项。drop例如,将删除提交。然后,您保存文件,提交将被重新应用,执行您为每次提交选择的选项。
现在修复上游:
git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)
(使用租约,这样您就不会意外地给处理您推送的更新的其他人造成问题)
这通过删除错误的提交而不是引入新的提交来修复早期的错误提交来保持日志干净。
[编辑]:更多说明。和图像示例
长话短说
\ngit reset HEAD~1\n\xe2\x80\x93 返回 1 次提交,保留工作目录中的所有更改git status将向您显示保留的更改git add ...git commitgit push --force-with-lease\xe2\x80\x93 覆盖原来的错误提交小智 7
git reset <commit_hash>(要获取 <commit_hash> 使用 git log --oneline)
git restore . 将所有更改的文件恢复到您目标提交的版本
git push origin master --force强制推送到远程主分支。但是,如果有人与您在同一分支中工作,则在使用强制推送时要小心
这是我的方法:
假设分支名称是develop.
# Checkout a new temp branch based on one history commit
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 this new branch
git push -f origin develop
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
483786 次 |
| 最近记录: |