Von*_*onC 315
你是git reset --hard你的本地分支,git push --force你修改了本地分支到遥控器.(这里的其他解决方案,涉及删除远程分支,并重新推送它)
这个SO答案说明了这种命令的危险,特别是如果人们依赖于他们自己的本地回购的远程历史.
您需要准备好指出人员到手册页的RECOVERING FROM UPSTREAM REBASE部分git rebase
hd8*_*335 188
请注意last_working_commit_id在还原非工作提交时使用
git reset --hard <last_working_commit_id>
Run Code Online (Sandbox Code Playgroud)
因此,我们不能重置为commit_id我们不想要的.
那么肯定,我们必须推送到远程分支:
git push --force
Run Code Online (Sandbox Code Playgroud)
ree*_*tor 139
本教程中显示了三个选项.如果链接断开,我将在这里留下主要步骤.
1还原完整提交
git revert dd61ab23
Run Code Online (Sandbox Code Playgroud)
2删除最后一次提交
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
Run Code Online (Sandbox Code Playgroud)
或者,如果分支在本地可用
git reset HEAD^ --hard
git push <<remote>> -f
Run Code Online (Sandbox Code Playgroud)
其中+ dd61 ...是你的提交哈希,git将x ^解释为x的父级,而+作为强制非快速推送推送.
3从列表中删除提交
git rebase -i dd61ab23^
Run Code Online (Sandbox Code Playgroud)
这将打开,编辑器显示所有提交的列表.删除你要删除的那个.完成rebase并推动力量回购.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Run Code Online (Sandbox Code Playgroud)
Sai*_*aif 25
TL:博士;
git switch -C branch_name origin/branch_name~ngit push --force完成后,远程分支将通过提交恢复n。
说明:
使用git switch,将分支重置为 n 次提交。该-C选项将强制创建一个具有相同名称的新分支。
branch_name为您的分支名称,n(在命令末尾),替换为您要恢复的提交数量。命令#1: git switch -C branch_name origin/branch_name~n
示例:git switch -C feature/dashboard origin/feature/dashboard~1 // 此命令恢复仪表板分支中的1 次提交。
强制推动本地变革
命令#2: git push --force
提示:撤消已提交(未推送)的更改git reset HEAD~
mah*_*mnj 10
这是一种从远程存储库中删除提交而不会丢失工作的干净方法。
git reset --soft HEAD~1 # 1 represents only last 1 commit
git stash # hold your work temporary storage temporarily.
git pull # bring your local in sync with remote
git reset --hard HEAD~1 # hard reset 1 commit behind (deletes local commit)
git push -f # force push to sync local with remote
git stash pop # get back your unpushed work from stash
Run Code Online (Sandbox Code Playgroud)
这就是我的案例中发生的事情
我当时在一个分支机构工作redesign
我不小心提交并推送了一个秘密文件以及我的其他工作。所以我的秘密现在被暴露了(Gitguardian 在我的电子邮件中对此大喊大叫 xD)现在我想从存储库中删除我的秘密文件,但也想保留我的工作。
因此,运行git reset --soft HEAD~1此命令会将您机器上的本地存储库移至后面 1 个提交(修改数字以将 n 个提交移至后面)
现在您将看到您提交的文件为unstaged
通过运行将其临时移至存储区,从而在本地保存此工作git stash。
现在通过运行使本地与远程同步git pull
现在运行git reset --hard HEAD~1(再次修改数字以删除 n 次提交)以从存储库中删除远程提交并执行强制推送git push -f。
您将看到远程存储库中的提交已被删除。
现在通过运行从存储中取回你的工作git stash pop
现在,对未完成的工作进行所需的更改。
从pctroll的答案中简化,同样基于这篇博客文章.
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
Run Code Online (Sandbox Code Playgroud)
例如,如果要删除最后的3提交,请运行以下命令以从文件系统(工作树)和本地分支上的提交历史记录(索引)中删除更改:
git reset --hard HEAD~3
Run Code Online (Sandbox Code Playgroud)
然后(在本地计算机上)运行以下命令来强制远程分支重写其历史记录:
git push --force
Run Code Online (Sandbox Code Playgroud)
恭喜你!全部做完!
一些注意事项:
您可以通过运行来检索所需的提交ID
git log
Run Code Online (Sandbox Code Playgroud)
然后你就可以代替HEAD~N使用<desired-commit-id>这样的:
git reset --hard <desired-commit-id>
Run Code Online (Sandbox Code Playgroud)
如果要保留文件系统上的更改并仅修改索引(提交历史记录),请使用--soft标记,例如git reset --soft HEAD~3。然后,您将有机会检查您的最新更改并保留或删除全部或部分更改。在后一种情况下,runnig git status显示自以来更改的文件<desired-commit-id>。如果使用--hardoption,git status则会告诉您本地分支与远程分支完全相同。如果您不使用--hard也不--soft使用,则使用默认模式--mixed。在这种模式下,git help reset说:
重置索引,但不重置工作树(即,已更改的文件将保留,但未标记为提交),并报告尚未更新的内容。
有时,解决此问题的最简单方法是从您知道代码良好的位置创建一个新分支。然后,您可以保留错误的分支历史记录,以防以后需要从中挑选其他提交。这也确保您不会丢失任何提交历史记录。
从您当地的错误分支:
git log
Run Code Online (Sandbox Code Playgroud)
复制您想要分支所在的提交哈希并退出 git 日志
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Run Code Online (Sandbox Code Playgroud)
现在您有了一个按照您想要的方式创建的新分支。
如果您还需要保留不在新分支上的错误分支的特定提交,您可以选择您需要的特定提交:
git checkout the_errant_branch
git log
Run Code Online (Sandbox Code Playgroud)
复制您需要拉入良好分支的一次提交的提交哈希并退出 git 日志。
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Run Code Online (Sandbox Code Playgroud)
拍拍自己的背。
| 归档时间: |
|
| 查看次数: |
286189 次 |
| 最近记录: |