我的存储库中有一个分支,其中包含一个关于新更改的新提交(例如'Commit A')。 我没有将提交推送到远程存储库。
现在,此提交缺少一个修复程序,我想:
git reset HEAD~1
(回到之前的提交A-1,将最后提交的更改放回工作目录)git add .
git commit
(说'提交B')git push
我的问题主要是关于重置提交( A )。
git push
只会将提交同步到分支中,忽略分离的提交? (即'提交A')最后
答案 0 :(得分:1)
它会作为分离提交保持不变吗?或者它仍然在我的分支?
如果您在detached HEAD mode,那么任何重置仍然在分离的HEAD中
如果您不在分离的HEAD中,则git reset
将分支的HEAD重置为commitB
,这意味着:
- commitA
位于另一个分支中(请参阅“How to list branches that contain a given commit?”:git branch --contain commitA)
- 或者在git reflog
这会以任何方式将'Commit A'推送到远程存储库吗?
不,除非commitA
可以访问,否则是另一个分支的一部分,如果你正在推动其他分支。
它会弄乱我的历史吗?
不是您当地的历史。只有在commitA被推送的情况下,它才会破坏上游回购的历史。
有一点,您需要:
你需要在一个分支中才能推动。
答案 1 :(得分:1)
如果你不做git push,那么任何东西都不会出现在远程存储库中。
Git reset默认为'mixed'模式,因此你的命令将等同于'git reset --mixed HEAD~1'。从git docs中可以看到关于混合模式重置的以下内容:
Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.
您也可以使用'git commit --amend'命令修改提交,而不是重置。这将使用您要添加的更改修改您的上次提交。
答案 2 :(得分:1)
关于重置提交(A)。
它会作为分离提交保持不变吗?或者它仍然在我的 分支?
它将作为分离提交保留(从您的分支无法访问),您可以通过执行
来实现git reflog
该命令将列出HEAD指向的所有提交的历史记录,在这种情况下,您将看到如下内容:
af35532 HEAD@{0}: commit: Commit B
bae2395 HEAD@{1}: reset: moving to HEAD~
6685f32 HEAD@{2}: commit: Commit A
因此,您可以将分支恢复到之前的状态(指向Commit A),这样:
git reset HEAD@{2}
这将推动“承诺A'以任何方式到远程存储库?
不,因为push只发送头部(a.k.a.分支)而仅提交来自这些头部的反应
由于您的分支机构无法访问提交A,因此永远不会发送它。请注意,如果有另一个不同的分支使提交A可达,则提交A将与该分支一起发送
它会弄乱我的历史吗?或者git push会将提交同步到 分支,忽略了独立的分支? (即“承诺A'”
不,它不会弄乱你的历史,git push不会同步分离的提交
如果相反我做了“承诺A'已推,并尝试做同样的事情 操作顺序?
在这种情况下,您的推送将被拒绝为"非快进",因为您试图用转移历史记录覆盖远程头
To https://github.com/user/repo.git
! [rejected] master -> master (non-fast-forward)