git の使い方

開発

以前書いたメモだと分からなかったので、使う流れに合わせて書いてみました

すでにブランチがある場合

まず、clone する

$ git clone https://ikuboh@dev.azure.com/ikuboh/Rework/_git/Rework
Cloning into 'Rework'...
remote: Azure Repos
remote: Found 3 objects to send. (27 ms)
Unpacking objects: 100% (3/3), 751 bytes | 8.00 KiB/s, done.

ファイルが一式クローンされている。ディレクトリ内に移動する。

$ ls
Rework/
$ cd Rework/

ブランチの確認。まずローカル。続いて全部。

$ git branch
* main
$ git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/test001

目的のブランチ(test001) に移動する。

$ git checkout test001
branch 'test001' set up to track 'origin/test001'.
Switched to a new branch 'test001'

ディレクトリを作成したり、いくつかファイルを置く。

$ mkdir demo
$ touch demo/main_csv.py

追加したファイルを STAGE に上げる

$ git add .

状態を確認する

$ git status
On branch test001
Your branch is up to date with 'origin/test001'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   demo/main_csv.py
        new file:   demo/main_excel.py
        new file:   demo/main_v01.py
        new file:   demo/requirements.txt

コミットする。-m はメッセージなので、本来はきちんと書くべき

$ git commit -m test
[test001 8107c7b] test
 4 files changed, 317 insertions(+)
 create mode 100644 demo/main_csv.py
 create mode 100644 demo/main_excel.py
 create mode 100644 demo/main_v01.py
 create mode 100644 demo/requirements.txt

再度、状態を確認。

$ git status
On branch test001
Your branch is ahead of 'origin/test001' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

プッシュする

$ git push
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 20 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 2.55 KiB | 2.55 MiB/s, done.
Total 7 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Analyzing objects... (7/7) (7 ms)
remote: Validating commits... (1/1) done (0 ms)
remote: Storing packfile... done (27 ms)
remote: Storing index... done (82 ms)
To https://dev.azure.com/ikuboh/Rework/_git/Rework
   25750dc..8107c7b  test001 -> test001
$

ブランチを事前に作らずに開始する場合

同様に、まず clone する

$ git clone https://ikuboh@dev.azure.com/ikuboh/Rework/_git/Rework
Cloning into 'Rework'...
remote: Azure Repos
remote: Found 3 objects to send. (27 ms)
Unpacking objects: 100% (3/3), 751 bytes | 8.00 KiB/s, done.

ファイルが一式クローンされている。ディレクトリ内に移動する。

$ ls
Rework/
$ cd Rework/

先にブランチを作っていない場合はここで作る

git checkout -b newbranch

-b は、ブランチを作成後、そのブランチに checkout するオプション。

git branch newbrach をしてから git checkout newbranch してもよい

ディレクトリを作成したり、いくつかファイルを置く。

$ mkdir demo
$ touch demo/main.py

追加したファイルを STAGE に上げる

$ git add .

コミットする。-m はメッセージ。

$ git commit -m "test commit: add new files"

状態を確認。

$ git status

プッシュする

$ git push origin newbranch

これで、リモートに newbranch というブランチが作成されプッシュされる

マージ

リモート情報を最新化

git fetch origin

develop ブランチに切り替え、プル

git checkout develop
git pull origin develop

main ブランチをマージ

git merge origin/main

ここでコンフリクトが発生します。

コンフリクト解消

git mergetool

WinMerge 上で対立箇所を選択・編集し、保存→閉じる

  • 3列出ているなら、左と中央を見比べて、一番右に反映する
  • 中央を採用する場合は、右に反映するだけで良い
  • 左を採用する場合は、一度中央に反映して、右に反映する。
  • 全部終わったら保存→閉じる

※ コンフリクトしたファイルの数だけWinMerge が繰り返し起動する

対応が終わったらファイルをコミットして、push

git add .
git commit -m "Resolve conflict"
git push

ブランチが更新されると、プルリクエストに自動で反映されます。

競合の解消に Winmerge を使う

以下の設定を .gitconfig に追記することで、Winmerge を競合の解消に使用できます。
※ バックスラッシュ必須です。

[diff]
    tool = WinMerge
[difftool "WinMerge"]
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -f \"*.*\" -e -u -r \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = WinMerge
[mergetool "WinMerge"]
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -u \"$LOCAL\" \"$REMOTE\" \"$MERGED\"