目次
- 目次
- はじめに
- 前回コミットした時の状態に戻す
- 直前のコミットをなかったコトにする
- 無理やりリモートリポジトリにローカルを合わせる
- 更新されたファイルの一覧を表示する
- あるコミットメッセージを変更する
- 複数のコミットをまとめる
- 以前のコミットを分割する
- 他のブランチの、ある特定のコミットのみをマージする。
- GitHubのForkリポジトリを更新する
- GitHubでforkした自分のリポジトリを更新する
- コマンドラインではできて、IDEからはできないこと
- 参考資料
- MyEnigma Supporters
はじめに
以前、困った時の逆引きGitメモの
コマンドライン編を書きましたが、
今回はPyCharmやClion, InteliJで有名な
JetbrainsのIDEを使った場合のGit逆引きメモです。
IDEのGit用のGUIを使うことで、
インタラクティブにGitのヒストリーを整理したり、
様々なブランチやリモートに対する差分管理がしやすくなります。
JetBrainsのIDEに関しては、前述の記事や、
下記の記事を参照ください。
Gitそのものに関しては、下記を参照ください。
前回コミットした時の状態に戻す
ファイルブラウザから、該当のファイルを右クリックして、
Git->revertで、最終コミットまで戻して、変更を廃棄できます。
複数のファイルが変更されている場合は、
元に戻したいファイルのみを選んで、revertすることができます。
直前のコミットをなかったコトにする
Version Control -> Log で、直前のコミットの一つ前のコミットを
右クリックして、Ret current branch to hereを押します。
すると下記のように、4つのResetモードを選ぶ画面が出てくるので、
いずれかを選択して、Retすれば直前のコミットをなかったことにできます。
4つのモードはそれぞれ
Soft: コミットは無かったことにするが、現在のファイルはそのままで、変更ファイルはstagingされた状態になります。(取り消したコミットで追加されたファイルはaddされた状態になる)
Mixed: コミットは無かったことし、現在のファイルはそのままで、変更ファイルはstaginsされない。(取り消したコミットで追加されたファイルは再度addが必要)
Hard: コミットも取り消し、ファイルも指定したコミットまで戻す。コミットしていないローカルの変更も削除される
Keep: コミットも取り消し、ファイルも指定したコミットまで戻す。コミットしていないローカルの変更はそのまま保持される。
無理やりリモートリポジトリにローカルを合わせる
なんか変なことしてパニックになった時に、
とりあえずリモートリポジトリと同じにしたい場合は、
まず、VCS -> Git -> Fetchしたあと、
VCS -> Git -> Reset HEADを選び
下記のように、Reset TypeをHardにして、
To CommitをHEADから、origin/masterなど、
参照したいリモートリポジトリとブランチを指定して、Resetすれば、
参照先の状態と同じにすることができます。
更新されたファイルの一覧を表示する
Version Control -> Local ChangesのDefault Changelistを見れば、
変更したファイルのリストの一覧を見ることができます。
あるコミットメッセージを変更する
Pushする前であれば、Version Controlタブ->logの修正したいコミットを右クリックして、
Rewordすれば、コミットメッセージを変更することができます。
rebase画面でもコミットメッセージを変更できます。
変更したいコミットを選択して、rewordすればOKです。
すでにpushしている場合は、force-pushが必要になります。
複数のコミットをまとめる
不要なコミットをまとめたい場合は、
元となる一番古いコミットをlogタブで右クリックして、
Interactive Rebaseを選びます。
そして、下記のようにまとめたいなコミットを選択して、
squash or fixupすれば、コミットが一つにまとまります。
squashの場合は、新しいコミットメッセージを、
元の2つのコミットメッセージがマージされた状態で入力する必要があり、
fixupの場合は、一番元のコミットメッセージでコミットがまとまります。
あまり自分は使いませんが、
左上の矢印でコミットの順番を変えたり、
Dropボタンで、あるコミットをなかったことにできます。
以前のコミットを分割する
過去にしたコミットを、分割したい場合にも、
Interactive Rebaseが便利です。
例えば、複数のファイルを一度にコミットしてしまい、
あとから、それぞれのファイルを別々のコミットにしたい時に、
それぞれのコミットに分割できます。
具体的には、
まずVersion Control -> logから、
分割したいコミットを右クリックしてInteractive Rebaseします。
続いて、分割したいコミットをeditにして、
start rebasingを押します。
すると、IDEの右下に下記のような表示がでます。
これはRebasingをしている最中のモードです。
続いて、Version Control -> logから、
分割したいコミットの一つ前のコミットを右クリックして、
Reset current branch to hereを選びます。
Resetのモードが選択できますが、分割したい場合はMixedでOKです。
これで、一旦分割したいコミットを無かったことにできます。
あとは、そのコミットのファイルがUnstaged状態なので、
それぞれのファイル用のコミットを複数回実施します。
あとは、先程の右下のポップアップのcontinueを押せば、
コミットが分割できます。
他のブランチの、ある特定のコミットのみをマージする。
別のブランチのあるコミット(その前のコミットは不要)だけをmergeしたい場合は、
cherry-pickを利用します。
JetBrains IDEでは、Version Control -> logから、
マージしたいコミットを右クリックで選んで、
Cherry pickを選ぶと、そのコミットが現在のブランチにマージされます。
GitHubのForkリポジトリを更新する
GitHubでOSS活動をする際には、
元のリポジトリからForkしてPRを作ると思いますが、
Forkしたリポジトリのmasterを、
元のリポジトリのmasterに追従させたい場合は、
VSC->Remotesで、元のリポジトリを登録し、
Git Pullする際に、元のリポジトリを指定することで、
Fork先のリポジトリを更新することができます。
参考:
GitHubでforkした自分のリポジトリを更新する
GitHubでOSSを開発していると、
forkした自分のリポジトリを元のリポジトリの最新で更新したい時があります。
普通にfetchしてきて、mergeすることも可能ですが、
下記の記事の通り、gitのhistoryが読みにくくなります。
そこで使うのが、rebaseです。
JetBrains IDEで実行する場合は、具体的には下記を参照ください。
現在の開発ブランチにupstream/masterを取り込みたいときは、
開発ブランチにいる状態で、branchのupstream/masterを右クリックして、
"Rebase current onto the selected"を選びます。
または、Git -> rebase my github forkで
upstreamのリポジトリを選ぶと、今のbranchのrebaseで更新してくれます。
最後にoriginにpushするときは、
通常のpushでpushするとエラーがでるので、
force-pushを選ぶ必要があります。
コマンドラインではできて、IDEからはできないこと
色々調べてみましたが、現時点でコマンドラインからは可能ですが、
JetBrains IDEからは不可能な事柄がいくつかあるようです。
その場合は、コマンドラインが実施する必要があります。
空のコミットを作る
git cleanコマンドの実行
リビジョン番号を指定してリモートリポジトリにpush
参考資料
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。