假设我有5个本地提交。我只想将其中两个推送到集中存储库(使用SVN样式的工作流)。我该怎么做呢?
这不起作用:
git checkout HEAD~3 #set head to three commits ago
git push #attempt push from that head
这最终会推送所有5个本地提交。
我想我可以使用git reset来实际撤销我的提交,然后是git stash,然后是git push --但是我已经编写了提交消息并组织了文件,我不想重做它们。
我的感觉是,传递一些标志来推送或重置将会起作用。
如果有帮助,这里是我的git配置
[ramanujan:~/myrepo/.git]$cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://server/git/myrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
发布于 2009-03-02 23:31:44
假设您的提交是在主分支上,并且您希望将它们推送到远程主分支:
$ git push origin master~3:master
如果您使用的是git-svn:
$ git svn dcommit master~3
在git-svn的情况下,您还可以使用HEAD~3,因为它期望提交。在直接git的情况下,你需要使用分支名称,因为HEAD在refspec中没有正确计算。
您还可以采用更长的方法:
$ git checkout -b tocommit HEAD~3
$ git push origin tocommit:master
如果你习惯了这种类型的工作流程,你应该考虑在一个单独的分支中完成你的工作。然后你可以这样做:
$ git checkout master
$ git merge working~3
$ git push origin master:master
请注意,对于您的设置,"origin master:master“部分可能是可选的。
发布于 2009-05-13 18:58:52
默认情况下,git-push会推送所有分支。执行此操作时:
git checkout HEAD~3 #set head to three commits ago
git push #attempt push from that head
您移动到一个分离的头部(您不在任何分支上),然后将所有分支,包括本地主服务器(仍在原来的位置)推送到远程主服务器。
手动解决方案是:
git push origin HEAD:master
如果您发现推送所有分支的默认行为令人困惑(而且很危险!),请将以下内容添加到~/.gitconfig中:
[remote.origin]
push = HEAD
那么只有你所在的分支才会被推送。在你的示例中(一个分离的头),你会得到这个错误消息,而不是意外地推入错误的提交:
error: unable to push to unqualified destination: HEAD
发布于 2015-03-01 23:59:07
1)如果你愿意,可以使用"git rebase“来重新排序你的提交。
git rebase -i
此命令将在您的编辑器中显示类似以下内容(我使用的是vim )
pick 4791291 commitA
pick a2bdfbd commitB
pick c3d4961 commitC
pick aa1cefc commitD
pick 9781434 commitE
# Rebase ..............
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text ^T To Spell
2)通过简单的剪切粘贴,根据您的选择重新排序您的提交。假设新的顺序是
选择9781434个commitE
选择c3d4961 commitC
选择4791291个commitA
选择aa1cefc commitD
选择a2bdfbd commitB
在编辑器中进行这些更改,然后按ctrl+ O (writeOut)
或者您也可以使用
git rebase -i HEAD~<commitNumber>
您可以使用以下命令检查新序列
git log
3)现在使用
git push <remoteName> <commit SHA>:<remoteBranchName>
如果远程(源)上只有一个分支,而本地(主)上只有一个分支,那么只需使用
git push <commit SHA>
git push aa1cefc
这将推送commitB和commitD。
https://stackoverflow.com/questions/604399
复制相似问题