Git - 排除特定的提交并推送

14
如何从一系列提交中排除特定的提交。我的意思是,如果我有5个提交,并且我只想推送4个提交。如何做到这一点。请帮忙解决这个问题。

可能是 https://dev59.com/43RC5IYBdhLWcg3wVvYt 的重复问题,当进行 git 合并时排除特定提交是否可能? - Yaron Idan
@YaronIdan 我与合并无关。我想知道在不需要推送几个提交时如何推送我的提交。 - Ved
2个回答

18

您需要创建一个包含所需提交的新分支。

有多种方法可以完成此操作。


git cherry-pick

检出到您想要从特定sha-1开始的新分支:

git checkout <origin branch>
git checkout -b <new branch>

# now cherry-pick the desired commits onto the new branch
git cherry-pick commit1 commit2 ... commitN

# now push to remote
git push origin remote <branch name>

其他选项:

git revert

git revert SHA-1

使用 git revert 撤销您在不需要的提交中所做的更改,结果将是具有旧代码和新代码的分支,但当前状态将是原始代码。


git rebase -i

交互式变基。选择您不想要的提交并删除它。

# X is the number of commits you wish to squash
git rebase -i HEAD~X

当你压缩提交记录后,选择e进行编辑,放置你想要的代码,然后添加并提交。

enter image description here


git filter-branch

git filter-branch可以用于过滤任何你想要的内容。

git filter-branch --env-filter '<do what ever you want on this commit range' SHA1..SHA1

所以,正如之前提到的,我需要创建一个新分支来完成这个任务。这意味着为了推送10次提交中的9次,我需要遵循相同的方法吗? - Ved
没错。将所需的提交推送到新分支。 - CodeWizard
这很烦人。难道没有办法只排除我不想推送的提交吗? - Ved
@Ved 是的,有的,请看下面我的回答。 - Hi-Angel

4

使用(将1替换为您想要从顶部忽略的提交数)

git push origin HEAD~1:$(git rev-parse --abbrev-ref HEAD)

注意:要使此命令生效,远程分支需要存在,否则您将会收到“错误:无法推送到无资格目标”的错误提示。如果您遇到此错误,例如您可以先按照惯例推送该分支(即包括您不想推送的提交),然后使用附加参数--force重复上面的命令。

其他选择(旧答案)

只是想提供另一种选择,因为创建一个单独的分支,然后进行一些操作,然后删除它,听起来有点麻烦;特别是如果您已经打开了拉取请求,并且需要推送您当前正在使用的分支。
更简单的方法是(但请不要将其与其他git命令混合使用,否则您可能需要在reflog中查找恢复点)
$ git reset --hard HEAD~1   # temporarily erase commits, use in place of "1" the number of commits you want to ignore
$ git push myorigin HEAD    # do the push wherever you wanted
$ git reset --hard HEAD@{1} # restore commits

这里使用的技巧是,git通常会在本地存储你执行的破坏性操作,称为reflog。你可以使用git reflog命令查看其内容(或通常更易读的git reflog --date=iso,尽管在这种情况下你看不到更容易编写的标记HEAD@{n}。如果你不太自信,更安全的版本可能是:
$ git format-patch -1 --stdout > 1.patch # store commits in a file, use in place of "1" the number of commits you want to ignore
$ git reset --hard HEAD~1 # temporarily erase commits, use in place of "1" the number of commits you want to ignore
$ git push myorigin HEAD  # do the push wherever you wanted
$ git am 1.patch          # restore commits

我喜欢补丁方法——没有隐藏状态。 - fche
2
对于 git push origin HEAD~1:$(git rev-parse --abbrev-ref HEAD),请使用 :chef_kisses:。 - Mark Fox
1
绝对是最好的答案。感谢这个黑魔法命令行。 - sandwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接