以前のコミットではなく、特定のコミットをリモートにプッシュするにはどうすればよいですか?


回答:


1087

プッシュしてアップコミット与え、あなたが書くことができます。

git push <remotename> <commit SHA>:<remotebranchname>

提供されたものは<remotebranchname>すでにリモートに存在します。(そうでない場合は、を使用git push <remotename> <commit SHA>:refs/heads/<remotebranchname>して自動作成できます。)

以前のコミットをプッシュせずにコミットをプッシュしたい場合は、まずを使用git rebase -iしてコミットの順序を変更する必要があります。


66
git push <remotename> <commit SHA>:<remotebranchname>動作します。トリックはgit rebase -i、最初のコミットとして必要なコミットを移動するためにそれを組み合わせ、そのcommit-shaを指定することです
dminer

29
別の良いヒントは、リベース-iを実行した後で、プッシュしたいコミットのSHAを確実にコピーすることです。これは、以前とは
異なり

33
リモートブランチがまだ存在しない場合、これは失敗することに注意してください。ブランチの作成はで行うことができますgit push <remotename> <commit SHA>:refs/heads/<new remote branch name>。この後、答えが説明するようにプッシュします。
Wes Oldenbeuving 2012

32
たとえば、最後のコミット以外のすべてをいくつかの標準名でプッシュする場合git push origin HEAD~1:master
アートレスノイズ2013

3
また、後のSHAをそのリモートブランチにすでにプッシュしている場合は、これを強制的にプッシュする必要があることにも注意してください。-fフラグを使用します。
Ian Vaughan 2014年

79

他の答えは、並べ替えの説明に欠けています。

git push <remotename> <commit SHA>:<remotebranchname>

単一のコミットをプッシュしますが、そのコミットはローカルのプッシュされていないコミットの最も古いものである必要があり、top、first、またはtipのコミットと混同しないようにしてください。コミットは最も古いコミット、つまり最新のコミットから最も遠いコミットを必要とします。最も古いコミットではない場合、最も古いローカルのプッシュされていないSHAから指定されたSHAへのすべてのコミットがプッシュされます。コミットを並べ替えるには:

git rebase -i HEAD~xxx

コミットの順序を変更した後、リモートリポジトリに安全にプッシュできます。

要約すると、私は

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

1つのコミットをリモートマスターブランチにプッシュします。

参照:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

以下も参照してください。

  1. git:ローカルリベースの後にプルが行われた後のコミットの複製
  2. git:単一のコミットのプッシュ、リベースを使用した並べ替え、コミットの複製

3
一部のオリジンはこれを許可していないようです。たとえば、GitLabの場合、「このプロジェクトの保護されたブランチにコードを強制的にプッシュすることは許可されていません。」と表示されます。何も強制しているとは思わず、通常のプッシュを行うだけなので、少し奇妙です。「強制」せずにそれを行う方法はありますか?
Ed Avis 2016年

1
@Ed Shoudlnはプッシュを強制する必要はありません。特定のgitセットアップに問題があるようです。おそらく、リモートHEADコミットを過ぎてリベースしましたか?保護されたブランチが何であるかわかりません。許可の問題のように聞こえます。
Samuel

1
サミュエル-それは理にかなっていますが、git rebase -iはリモートヘッドより後のローカルコミットのみを表示するので、どうすればよいのかわかりません。
Ed Avis 2016年

1
サミュエル-確かに私は今部分的なプッシュを行うことができるので、何が問題だったかわかりませんが、リモートHEADから派生していないコミットを何らかの方法でプッシュしようとしていたに違いありません。
Ed Avis 2016年

1
@Edあなたは「git rebase -iはリモートHEADより後のローカルコミットのみを表示する」と言ったが、これは本当だとは思わない。私はテストし、リモートHEADを越えてリベースすることができました。
Samuel

25

を使用することをお勧めしgit rebase -iます。プッシュするコミットを、作成したコミットの一番上に移動します。次に、を使用git logしてリベースされたコミットのSHAを取得し、チェックアウトしてプッシュします。リベースにより、他のすべてのコミットがプッシュした子になることが保証されるため、将来のプッシュも正常に機能します。


3
移動の完全な例を具体的に教えていただけますか。git logステップを再?
Drux、

4
メッセージ「A」、「B」、「C」の順にコミットされた比較的独立した3つのコミットがあり、「B」をプッシュしたいとします。'git rebase -i'を実行すると、エディターと3つすべてのリストが表示されます。Bを上に移動して保存/終了します。'git log --pretty = oneline -n​​3'は、各メッセージの前にB、A、Cをハッシュ付きでリストし、Bが最後になります。'git checkout -b temp $ hash_of_B; git push 'はその時点でBをプッシュするべきです。次に、おそらく 'git checkout -b master; git branch -d temp 'を実行すると、以前の状態に戻ります。ローカルマスターブランチにいたと想定します。必要に応じて交換してください。
Walter Mundt

1
+1 rebase-push-rebaseの後に「git godの怒り」に遭遇したことがありますか?(おそらく偶然にも起こりますよね?)
Drux、

2
私の回答を注意深く読むと、プッシュはリベースの後にのみ発生、リベースされたコミットはまだプッシュされていない他のコミットの上にのみ移動することがわかります。いったんコミットがプッシュされると、それは一般的に堅固であると考えられるべきです。将来のリベースではそれをそのままにしておきます。この手法は、複数のローカル変更をプッシュする前に適切な順序に整理できるようにするためのものです。トラッキングが正しく設定されている場合、他の引数を指定せずに 'git rebase -i'を実行すると、デフォルトではプッシュされたコミットも表示されないため、他のいくつかの方法よりも事故から安全です。
Walter Mundt、2014年

21

チェリーピックは、特定のコミットをプッシュしている間、他のすべての方法と比較して最も効果的に機能します。

その方法は次のとおりです。

新しいブランチを作成-

git branch <new-branch>

新しいブランチを元のブランチで更新します-

git fetch

git rebase

これらのアクションにより、オリジンとまったく同じものが確実に得られます。

sha idプッシュしたいものをチェリーピック-

git cherry-pick <sha id of the commit>

あなたはsha id走ることによって得ることができます

git log

それをあなたの起源に押してください-

git push

実行gitkして、すべてが希望どおりに見えることを確認します。


2
git rebase -i上記のソリューションで提案されているように、使用は理想的なソリューションになります。チェリーピックは、コミットを複製する場合にのみ使用する必要があります。
Vinay Bhargav 2015年

13

そのコミットに「git revert」してからプッシュする必要があると思います。またはcherry-pick、新しいブランチにコミットして、それをリモートリポジトリのブランチにプッシュすることもできます。何かのようなもの:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}

9
ここではgit revertは悪い考えです-新しいコミットを作成します
hasen

1
@hasen:cherry-pick必要なコミットだけを実行できます。
Josh K

4
revertとcherry-pickはどちらも悪い考えです。git rebase -iはあなたの友達です。以下のWalter Mundtからの回答を参照してください。
Nicolas C

3
@ニコラ、チェリーピックはなぜ悪い考えなの?
アントワーヌ

3
@Antoine、通常はブランチがオリジンで追跡しているブランチと同期を保つ必要があります。チェリーピックする場合は、コピー/貼り付けを行っているため、プッシュされていないコピーをいつか処理する必要があります。-iをリベースする場合は、「カットアンドペースト」を実行し、ブランチをリモートと同期させて、希望する場所に配置します。
Nicolas C

0

また、別のディレクトリで:

  • git clone [リポジトリ]
  • 元のリポジトリの.gitディレクトリを、今複製したリポジトリの.gitディレクトリで上書きします。
  • git addとgit commit your original
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.