说我执行过两次git add --all && git commit
。因此,现在我的本地git存储库包含两个新提交:A和B。
如果我执行git push
,则将两者都推入。
如何仅推送较新的提交,即B?换句话说,是否可以在不触摸提交B的情况下删除提交A?
答案 0 :(得分:1)
说您想掌握。我会选择要交付的提交:
git fetch
git checkout -b delivery_branch origin/master
git cherry-pick B
git push origin master
答案 1 :(得分:1)
简短而又不令人满意的答案是“你不能”。提交B本质上依赖于提交A,因为A是B的父提交。
您可以要做的就是完全停止使用提交B。构造第三个提交(称为C),其父母是A的父母,并且其内容是您想要的任何内容。 (例如,这可能匹配B的内容。)然后移动分支的 name ,以便不要指向提交B
(指向A
) ,它指向较早的提交),名称指向新的提交C:
B--A [no longer on your branch - abandoned in favor of C]
/
...--o--C <-- branch
您现在可以git push origin branch
推送提交C,而完全不使用提交A和B。
(请注意,制作 提交C的确切机制取决于要附加到C的快照。)
答案 2 :(得分:0)
假设您的日志是这样的:
Z--A--B
其中A是要删除的提交,而B是要保留的提交。还假定“ dev”是该分支的名称。
然后,(其中A,B和Z代表各自的提交ID)
从提交Z创建一个临时分支,称为“ temp”。
git checkout -b temp
git reset --hard Z
以樱桃方式将提交B临时选中。 (解决冲突)
git cherry-pick B
返回您的分支(在本例中为dev),然后删除A和B
git checkout dev
git reset --hard Z
将临时分支合并到您的分支(dev)
git merge temp
删除临时分支
git branch -d temp
注意:
随着我们的挑选,B的提交ID将发生变化。
如果远程分支中有A和B,则必须使用force选项进行推送。
git push -f