Git コマンド操作に関する個人メモ

### ＜リモートブランチを取得してローカルの状態を更新する方法＞
例：リモートブランチ「feature/123456」

#### ◯pull を使う場合
``` git:gitコマンド
git fetch origin
git reset --hard origin/feature/123456
```
・[git pull]は、内部的に[git fetch]と[git merge]を実行する。
・ローカルに変更がある場合、その変更とリモートの変更が自動的にマージされる。
・コンフリクトが発生した場合、手動で解消し、マージを続行する必要がある。


#### ◯reset を使う方法
``` git:gitコマンド
git fetch origin
git reset --hard origin/feature/123456
```



### ＜リモートブランチ「master」の内容をブランチ「feature/123456」へ反映する場合＞
#### ◯rebase を使う場合
``` git:gitコマンド
# master ブランチに切り替えて、最新の変更を取得
git checkout master
git pull origin master

# feature/123456 ブランチに切り替える
git checkout feature/123456

# リモートの最新情報を取得
git fetch origin

# master ブランチの変更をリベースして feature/123456 に反映する
git rebase origin/master
```

#### ◯merge を使う場合
``` git:gitコマンド
git checkout feature/123456
git fetch origin
git merge origin/master
```

#### ◯メモ
※順次追記予定

##### git merge:
・2つのブランチの履歴を統合する。
・マージ先ブランチ(例:feature/123456)の履歴のみ書き換えられ、マージ元ブランチ(例:master)の履歴は書き換えられない？

##### git rebase:
・リベース元ブランチ(例:master)の最新のコミットを、リベース先ブランチ(例:feature/123456)の最新の変更の上に再適用する。
・リベース先ブランチ(例:feature/123456)の履歴のみ書き換えられ、リベース元ブランチ(例:master)の履歴は書き換えられない。


#### ◯イメージ図
＜マージ＞
```
○マージ前
  A---B---C   master
       \
        D---E---F   feature/123456

○マージ後
  A---B-------C   master
       \       \
        D---E---F---M   feature/123456

※ M:マージコミット
```

＜リベース＞
```
○リベース前
  A---B---C   master
       \
        D---E---F   feature/123456

○リベース後
  A---B---C   master
           \
            D'---E'---F'   feature/123456
```


### ＜マージの取り消し＞
#### ◯コミット前の場合
##### 変更内容ごと取り消す
``` git:gitコマンド
git merge --abort
```

#### ◯コミット済みの場合
##### コミット履歴だけを取り消し、変更はステージングに保持する
``` git:gitコマンド
git reset --soft HEAD^
```

##### コミット履歴と変更内容ごと取り消す
``` git:gitコマンド
git reset --hard HEAD^
```

##### 履歴を残したままマージの変更を取り消す
``` git:gitコマンド
git revert -m 1 <マージコミットのハッシュ>
```
※-m 1 は、最初の親（通常はベースブランチ）を指す。

### ＜ファイルの変更の取り消し＞
#### ステージされたファイルを取り消す

``` git:gitコマンド
git reset HEAD <ファイル名>
```

``` git:例
c:\workspace\projectA>git status
On branch develop
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   .settings/org.eclipse.wst.common.component;

c:\workspace\projectA>git reset HEAD .settings/org.eclipse.wst.common.component
Unstaged changes after reset:
M       .settings/org.eclipse.wst.common.component

c:\workspace\projectA>git status
On branch develop
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .settings/org.eclipse.wst.common.component

no changes added to commit (use "git add" and/or "git commit -a")

c:\workspace\projectA>
```


#### 未ステージのファイルの変更を取り消す

``` git:gitコマンド
git checkout -- <ファイル名>
```

``` git:例
c:\workspace\projectA>git status
On branch develop
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .settings/org.eclipse.wst.common.component

no changes added to commit (use "git add" and/or "git commit -a")

c:\workspace\projectA>git checkout -- .settings/org.eclipse.wst.common.component

c:\workspace\projectA>git status
On branch develop
nothing to commit, working tree clean

c:\workspace\projectA>
```