1. ホーム
  2. git

[解決済み] ローカルの git コミットの一部だけをプッシュするにはどうしたらいいですか?

2022-04-20 04:28:19

質問

5つのローカルコミットがあるとします。そのうちの2つだけを集中リポジトリのほうにプッシュしたいと思います (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 を行うこともできますが、すでにコミットメッセージを書いてファイルを整理しているので、それをやり直すのは面倒です。

私の感覚では、pushやresetに何らかのフラグを渡すとうまくいくような気がします。

参考までに、私の 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

解決方法は?

コミットが master ブランチにあり、それをリモートの master ブランチにプッシュしたい場合を想定しています。

$ 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"の部分は、おそらくあなたのセットアップではオプションであることに注意してください。