0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Git操作をちゃんと分かろう

Last updated at Posted at 2023-04-09

はじめに

腰を据えて勉強してこなかったGitに、入社後速攻でつまづいてしまったのでブランチ操作について勉強しました。

基本的な操作(checkout、add、commit、push)は出来る状態だったのですが、コンフリクトの解消や誤った操作の取り消し方法が分からなかったのでその辺りを中心にまとめます。

前提知識

そもそも私はここを全然理解せずに触っていた(危険)。

  • Gitとはバージョン管理をするためのもの

    • どのファイルが最新なのか、誰が編集したのか、どんな変更を行なったかの履歴を残す
    • チーム内で同時編集した場合に先に編集した人の変更内容が消えることを防ぐ
  • Github上にファイルをUPする際に、ローカルでcommit/pushをする意味

    • 自分が作業しているディレクトリを「ワークツリー」と呼ぶ
    • commitはローカルリポジトリに直接状態を記録するのではなく、その間に設けられた「インデックス」に状態を記録する
      • これがcommitコマンドで行われていること
      • インデックスを間に挟むことで必要なファイルのみローカルリポジトリにコミットできる
    • つまり「ワークツリー」→→add→→「インデックス」→→commit→→「ローカルリポジトリ」→→push→→「リモートリポジトリ」

コンフリクトが起きそう/起きた時

作業が遅い分、自分が作業している間にリモートリポジトリの状態が進んでしまうことは多い

  • mainブランチに戻ってリモートブランチをpull
  • 作業していたブランチに戻ってmainブランチをpull(ここ忘れがち!)
    • コマンド:git pull プル先のリモートリポジトリ名 プルするブランチ名
      • プル先は「origin」という名称のことが多い
  • この時にエラーになるはずなので、ここでコンフリクトを解消する

直前のコミットを取り消したい時

  • 作業したファイルは残したい&ステージングも取り消したいgit reset --soft HEAD^(これが一番使う)
  • 作業したファイルは残したいgit reset --mixed HEAD^
  • 作業したファイルごと消したいgit reset --hard HEAD^(これはあまり無さそう)
    • 直前のコミットなのでキャレット^は1個だが、数を増やすと取り消す数を指定できる
    • 数の指定方法も色々ある
      • HEAD^^^HEAD~3HEAD~~~HEAD~{3}@^^^は同じ意味」(以下記事参照)

コミットメッセージを修正したい時

「ルール通りにコミットメッセージを作成していない!」と気付いた時の対処法

  • コミットを取り消さなくてもメッセージだけ書き換えられる
    • これを使えば直前のコミット漏れしたファイルを後から追加することも可能
  • amendオプションを指定してコミットを行うgit commit --amend
    • ファイルを修正
    • git add 修正したファイル名
    • git commit --amend(修正したいファイルがないときはここから実施)
    • エディタが表示されるのでコミットメッセージを変更して終了
  • git logで履歴を見ると綺麗に修正されているはず=修正履歴が残らない

〜修正したいメッセージが複数ある/直前のコミットメッセージではない場合〜

  • git rebase -iを使用する
    • git logでコミット履歴を確認、修正したいコミットのうち一番古いもののコミット番号を確認
    • git rebase -i 該当のコミット番号
      • 表示されるエディタで修正したいコミットの「pick」を「edit」に書き換え、エディタを閉じる
    • git commit --amend -m 正しいコミットメッセージ
      • 複数editにした場合は古いコミットから順に表示されるので、修正したい内容の正しいコミットメッセージをここで入力する
    • git rebase --continue
      • 複数editにした場合はこのコマンドで次の修正ポイントに飛ぶ、全て修正完了していればこれで完了

〜push後だった場合〜

  • push後だった場合、上記作業のみではリモートリポジトリは変更前の状態のままなのでgit push -f(強制プッシュ)を行う

PR出す準備中に修正点に気付いた時

  • 基本的には、再度ファイルを修正してリモートリポジトリにpushすれば良い
  • コミット履歴をどうしても綺麗にしたい場合はrebaseを使用する

その他

他にも色々あったので実際に使う場面が出てきたら追記していきます

  • 他ブランチの作業を取り込むcherry-pick
  • 散乱したコミットをまとめるrebase -i ~~~

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?