git reset后提交
我最近发表了一篇有关如何执行硬git reset的文章,但是在社交媒体上我反复问到的问题之一是,您对本地提交进行硬git reset之后将更改发布到远程GitHub或GitLab存储库? 当您执行git reset and push时,是否会发布整个提交历史记录,包括在重置点之后发生的提交,还是忽略了Git回滚的提交?
如何git重设并推动
在本地工作时,不清楚将git reset重置为先前的提交并将这些提交推送到远程存储库时会发生什么。 因此,为了演示git reset和push时到底发生了什么,我首先将创建一个名为git-reset-explained的空远程GitHub存储库。 它只包含一个readme.md文件,一个MIT许可证,一个.gitignore文件和一个提交。
克隆git-reset解释的仓库
创建了远程GitHub存储库后,我将在本地克隆该存储库并开始在其中进行操作。
- /c/ git reset hard and push /
- $ git clone https://github.com/cameronmcnz/git-reset-explained.git
- Cloning into 'git-reset-explained'...
- $ cd git*
- /c/ git reset hard and push / git reset explained
创建本地提交历史
在克隆的仓库中,我将创建五个新文件,每次都添加一个新的提交。
- /c/ git reset hard and push / git reset explained
- $ touch alpha.html
- $ git add . & git commit -m "Local commit #1"
- $ touch beta.html
- $ git add . & git commit -m "Local commit #2"
- $ touch charlie.html
- $ git add . & git commit -m "Local commit #3"
- $ touch depeche.html
- $ git add . & git commit -m "Local commit #4"
- $ touch enid.html
- $ git add . & git commit -m "Local commit #5"
对reflog的调用显示了git commit命令发出时HEAD的历史记录:
- /c/ git reset hard and push / git reset explained
- $ git reflog
- 014df6a (HEAD -> master) HEAD@{0}: commit: Local commit #5
- 6237772 HEAD@{1}: commit: Local commit #4
- 593794d HEAD@{2}: commit: Local commit #3
- b1a6865 HEAD@{3}: commit: Local commit #2
- 8a3358e HEAD@{4}: commit: Local commit #1
- d072c0a (origin/master, origin/HEAD) HEAD@{5}: clone
git重置为上一次提交
现在,如果我要执行硬git reset并将HEAD移至第三个本地提交,则提交4和5应该消失,对吗? git reset应该从我的提交历史记录中删除那些提交,然后带我回到复位点,对吗? 让我们看看当我们发出命令git reset local commit时实际发生了什么。
- /c/ git reset hard and push / git reset explained
- $ git reset --hard 593794d
- HEAD is now at 593794d Local commit #3
现在,让我们看看reflog是什么样的:
- /c/ git reset hard and push / git reset explained
- $ git reflog
- 593794d (HEAD -> master) HEAD@{0} reset to 593794d
- 014df6a HEAD@{1}: commit: Local commit #5
- 6237772 HEAD@{2}: commit: Local commit #4
- 593794d (HEAD -> master) HEAD@{3}: commit: Local commit #3
- b1a6865 HEAD@{4}: commit: Local commit #2
- 8a3358e HEAD@{5}: commit: Local commit #1
- d072c0a (origin/master, origin/HEAD) HEAD@{6} clone
git reset硬推
从git reflog命令可以看到,提交014df6a和6237772仍然挂着。 当您git reset本地提交时,这些提交不会消失。
知道Git有存储所有内容的倾向,这并不是一个特别意外的结果。 真正的问题是,如果您将git reset重置为先前的提交并推送到远程存储库 ,将会发生什么? 跳过的两个本地提交git是否也会被推送,还是在本地保持隔离? 为了找出答案,我们只需将其推到远程原点即可:
- /c/ git reset hard and push / git reset explained
- $ git push origin
- Counting objects: 7, done.
- To github.com/cameronmcnz/git-reset-explained.git
- d072c0a..593794d master -> master
推送之后,当我们查看 GitHub上的提交历史记录时,我们注意到只有四个提交,即创建GitHub存储库的服务器端提交,以及我们发布的三个本地提交。 当git reset和push发生时,第四个和第五个本地提交没有被推送到服务器,实质上删除了它们存在的任何历史记录。
git reset vs恢复
那我们学到了什么? 好吧,当我们git reset到先前的提交并推送到远程存储库时,不会发布任何撤消提交的痕迹。 这与git revert形成了鲜明的对比,在git revert中,revert命令本身会创建一个新的提交,并且不会丢失过去的提交历史。 因此,如果您想使用Git 撤消先前的提交 ,则reset是使用而不是还原的正确Git命令。
想更多地了解Git?
您是Git的新手,并且有兴趣了解有关分布式版本控制的更多信息吗? 这是一些Git教程和Jenkins-Git集成示例,旨在帮助您快速学习Git,DVCS和其他流行的DevOps工具,例如Jenkins和Maven。
- 初学者需要掌握的五个基本Git命令
- 学习使用bash shell git还原提交
- 在Git分支之间使用git cherry-pick命令
- 将Git编辑器更改为Notepad ++
- Windows Git配置文件的存储位置
- 使用Jenkins Git插件从GitHub中提取
- 借助Jenkins CI教程,使持续集成成为DevOps旅程的一部分
git reset后提交