首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >您如何只推送一些本地git提交?

您如何只推送一些本地git提交?
EN

Stack Overflow用户
提问于 2009-03-02 22:48:25
回答 3查看 76.4K关注 0票数 182

假设我有5个本地提交。我只想将其中两个推送到集中存储库(使用SVN样式的工作流)。我该怎么做呢?

这不起作用:

代码语言:javascript
复制
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配置

代码语言:javascript
复制
[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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-02 23:31:44

假设您的提交是在主分支上,并且您希望将它们推送到远程主分支:

代码语言:javascript
复制
$ git push origin master~3:master

如果您使用的是git-svn:

代码语言:javascript
复制
$ git svn dcommit master~3

在git-svn的情况下,您还可以使用HEAD~3,因为它期望提交。在直接git的情况下,你需要使用分支名称,因为HEAD在refspec中没有正确计算。

您还可以采用更长的方法:

代码语言:javascript
复制
$ git checkout -b tocommit HEAD~3
$ git push origin tocommit:master

如果你习惯了这种类型的工作流程,你应该考虑在一个单独的分支中完成你的工作。然后你可以这样做:

代码语言:javascript
复制
$ git checkout master
$ git merge working~3
$ git push origin master:master

请注意,对于您的设置,"origin master:master“部分可能是可选的。

票数 215
EN

Stack Overflow用户

发布于 2009-05-13 18:58:52

默认情况下,git-push会推送所有分支。执行此操作时:

代码语言:javascript
复制
 git checkout HEAD~3  #set head to three commits ago
 git push #attempt push from that head

您移动到一个分离的头部(您不在任何分支上),然后将所有分支,包括本地主服务器(仍在原来的位置)推送到远程主服务器。

手动解决方案是:

代码语言:javascript
复制
 git push origin HEAD:master

如果您发现推送所有分支的默认行为令人困惑(而且很危险!),请将以下内容添加到~/.gitconfig中:

代码语言:javascript
复制
 [remote.origin]
    push = HEAD

那么只有你所在的分支才会被推送。在你的示例中(一个分离的头),你会得到这个错误消息,而不是意外地推入错误的提交:

代码语言:javascript
复制
 error: unable to push to unqualified destination: HEAD
票数 16
EN

Stack Overflow用户

发布于 2015-03-01 23:59:07

1)如果你愿意,可以使用"git rebase“来重新排序你的提交。

代码语言:javascript
复制
git rebase -i

此命令将在您的编辑器中显示类似以下内容(我使用的是vim )

代码语言:javascript
复制
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)

或者您也可以使用

代码语言:javascript
复制
git rebase -i HEAD~<commitNumber>

您可以使用以下命令检查新序列

代码语言:javascript
复制
git log

3)现在使用

代码语言:javascript
复制
git push <remoteName> <commit SHA>:<remoteBranchName>

如果远程(源)上只有一个分支,而本地(主)上只有一个分支,那么只需使用

代码语言:javascript
复制
git push <commit SHA>
git push aa1cefc

这将推送commitB和commitD。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/604399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档