gitコマンドの使い方 ~ git cherry-pick ~

git cherry-pick コマンド概要

git cherry-pick コマンドは特定のcommitの変更内容だけを取り込んで新しいcommitを作成します。

以下の図はmasterブランチでcommit(C)をcherry-pickした場合の例です。

git cherry-pick コマンドの使い方

git cherry-pick [commit-hash]

git cherry-pick [commit-hash]..[commit-hash]

個別に取得するcommitは1つもしくは連続する複数のcommitを指定することができます。

commit-hashはgit logコマンドで確認することができます。

cherry-pickの実行例

概要説明の図の内容を実際のコマンドで操作してみましょう。

まず、cherry-pickを行う前の状態までのcommit履歴を作成します。

(master)
$ echo 'aaa' > file-A.txt

(master)
$ git add .

(master)
$ git commit -m 'file-A add'
[master (root-commit) 153a3c9] file-A add
 1 file changed, 1 insertion(+)
 create mode 100644 file-A.txt

(master)
$ git branch develop

(master)
$ git checkout develop
Switched to branch 'develop'

(develop)
$ echo 'bbb' > file-B.txt

(develop)
$ git add .

(develop)
$ git commit -m 'file-B add'
[develop c326288] file-B add
 1 file changed, 1 insertion(+)
 create mode 100644 file-B.txt

(develop)
$ echo 'ccc' > file-C.txt

(develop)
$ git add .

(develop)
$ git commit -m 'file-C add'
[develop dc37c06] file-C add
 1 file changed, 1 insertion(+)
 create mode 100644 file-C.txt

(develop)
$ git log --oneline --all --graph
* dc37c06 (HEAD -> develop) file-C add
* c326288 file-B add
* 153a3c9 (master) file-A add

(develop)
$ git checkout master
Switched to branch 'master'

(master)
$ git log --oneline --all --graph
* dc37c06 (develop) file-C add
* c326288 file-B add
* 153a3c9 (HEAD -> master) file-A add

cherry-pickの対象となるcommit(C)のcommit-hashを確認すると「dc37c06」となっています。

 

cherry-pickで「dc37c06」を指定して実行しましょう。

(master)
$ git cherry-pick dc37c06
[master e39d673] file-C add
 Date: Fri Apr 3 13:41:06 2020 +0900
 1 file changed, 1 insertion(+)
 create mode 100644 file-C.txt

 

git logとworking-directory(作業ディレクトリ)、staging-area(ステージングエリア)の内容を確認してみましょう。

(master)
$ git log --oneline --all --graph
* e39d673 (HEAD -> master) file-C add
| * dc37c06 (develop) file-C add
| * c326288 file-B add
|/
* 153a3c9 file-A add

(master)
$ ll
total 2
-rw-r--r-- 1 snow 1049089 4  4月  3 13:39 file-A.txt
-rw-r--r-- 1 snow 1049089 5  4月  3 13:41 file-C.txt

(master)
$ git ls-files
file-A.txt
file-C.txt

commit(B)の変更内容であるfile-B.txtが反映されていませんね。

これで、単独のcommitを取得することができました。

git cherry-pick の全てのオプションを確認する方法

以下のコマンドを実行するとブラウザでgit cherry-pickのヘルプページが表示される

git cherry-pick --help

Gitコマンドの使い方一覧

Git設定git config ~Gitリポジトリの設定~
初期化git init ~ローカルリポジトリの構築~
ログ&設定値確認git log ~commitログの履歴確認~
git status ~作業ディレクトリとステージングエリアの更新状態確認~
git diff ~commitやファイルの差分確認~
git show ~commitの内容確認~
git remote ~リモート追跡ブランチのリモートリポジトリの設定確認~
git reflog ~HEADやブランチの移動履歴の確認と整理~
ステージングエリアの操作git add ~ステージングエリア(インデックス)にファイル追加~
git ls-files ~ステージングエリア(インデックス)のファイル一覧表示~
git rm ~ステージングエリア(インデックス)のファイル削除~
ローカルリポジトリの操作git commit ~blobやtreeなどをまとめたcommitを作成~
git merge ~指定したブランチの内容を取り込み新しいcommitを作成~
git rebase ~commitの履歴の整理~
git cherry-pic ~特定のcommitの変更内容だけを取り込む~
git cat-file ~リポジトリのオブジェクト(commit,tree,blob)の内容表示~
git revert ~指定したcommitを取り消すcommitを作成~
commitのエイリアスなどgit branch ~commitツリーの枝(ブランチ)を作成~
git tag ~リリースなどのタイミングで特定のcommitに名前を付ける~
git stash ~commitを作成する前の変更内容を一時保存~
commitの内容をステージングエリアや作業ディレクトリに反映git checkout ~commitをステージングエリアと作業ディレクトリに展開~
git reset ~HEADの位置やステージングエリアと作業ディレクトリの内容を変更~
リモートリポジトリとのやり取りgit clone ~リモートリポジトリからローカルリポジトリ作成~
git fetch ~リモートリポジトリのブランチをローカルリポジトリに反映~
git pull ~git fetchとgit mergeを同時に行う~
git push ~ローカルリポジトリのブランチをリモートリポジトリに反映~