独り言

プログラミングの講師をしています。新人研修で扱う技術の解説と個人の技術メモ、技術書の紹介など

【Git】Git 入門(Git Bash - ローカルリポジトリ編)

Gitの概要は以下の記事に書いたので、概要を知りたい方はそちらを参照ください。

case10.hateblo.jp

Git Bashを動かしながらGitの動きを理解を深めます。
ここでは主にリモートリポジトリに操作について学びます。
まず「Bash」とは、LinuxなどのサーバーOSでよく利用されている、コマンドによって様々な操作を行うためのソフトウェアです。
WindowsでGitを単体でインストールすると、Git Bashが一緒にインストールされ、使用できるようになります。
ここではbashに関する詳細な解説はしません。
必要に応じて最小限の解説だけ行っていきます。

Git Bashの起動

まずは「Git Bash」を起動します。
Windowsの場合はColtanaで「Git」と入力して検索するとおそらく出てくると思います。

ユーザー名とメールアドレスの設定

Gitでは、変更内容をコミットしたときに、誰が修正したかの情報も一緒に登録されます。
その「誰が」の情報を事前に設定しておくことが必要で、ユーザー名とメールアドレスがの設定が必要です。
設定の確認や変更はcondigコマンドを使用します。

# ユーザー名の設定
git config --global user.name "<ユーザー名>"
# メールアドレスの設定
git config --global user.email "<メールアドレス>"
# 設定内容の確認
git config --list
# リポジトリ単位でのユーザーの設定
git config --loacl user.name "<ユーザー名>"
# リポジトリ単位でのメールアドレスの設定
git config --local user.email "<メールアドレス>"

簡単に解説

コメント

bashでは、#の後に続く文字はコメント扱いになります。
コマンドの細かい説明はコメントで書いていきます。

gitコマンド

Gitに関連するコマンドは、
git <コマンド名>
で実行します。
Gitの設定に関するコマンドがconfigです。

オプション

多くのコマンドはオプションを付けることができます。
オプションを付ける場合は、
--オプション名
または
-オプション名
となります。
どんなオプションがあるか、どのようにオプションを指定するかは、コマンドによって異なりますので、詳しくはマニュアルなどを参照しながら確認してください。

テキストエディタの変更

Gitではコミットする際など、テキストエディタが起動する場合があります。
Git Bashでは、テキストエディタが必要になった際、デフォルトではVimと呼ばれるテキストエディタが起動します。
Vimに慣れればデフォルトのままでも問題ありませんが、使用するテキストエディタを変更したい場合は、変更も可能です。
テキストでの編集でよく分からなかった場合は「Vim」で検索してみてください。

# テキストエディタの変更
git config --global core.editor "エディタのパス"

エイリアスの設定

TODO

作業ディレクトリの作成

Gitを使用するにあたって、まずは作業用のフォルダが必要です。
自分のPCの適当な場所に新規でフォルダを作成しましょう。
フォルダの名前は任意です。

フォルダが作成できたら、Git Bashで、カレントディレクトリを作業ディレクトリの場所まで移動します。
科連弩ディレクトリの移動はcdコマンドを使用します。
例えば、Cドライブ直下に「git-lesson」というフォルダを作成したとすると、

# カレントディレクトリの移動
cd C:\git-lesson

と入力します。

※ここではフォルダとディレクトリという用語を混合して使っていますが、基本的には同じ意味です。
GUIでの操作の場合にはフォルダと呼ばれることが多く、CUIでの操作ではディレクトリと呼ばれることが多いため、ここでもそのような使い分けをしています。

※Git Bashに限らず、コマンドで何かを操作するときには、今いる場所(カレントディレクトリ)を基準にして操作を行います。

※cdコマンドは「change directory」の略で、カレントディレクトリを変更するためのbashコマンドです。

ローカルリポジトリの作成

ローカルリポジトリを作成します。
リポジトリの作成はinitコマンドを使用します。

# ローカルリポジトリ作成(初期化)
git init

作業フォルダの中に「.git」というファイルが作成されていればOKです。
ちなみに、.から始まるファイルは、隠しファイルと呼ばれ、デフォルトではエクスプローラ上に表示されない設定になっています。
見えない場合はエクスプローラの表示タブから「隠しファイル」にチェックを入れて、見えるようにします。

bashでは

# ファイルの一覧表示
ls -la

とすることで確認することもできます。
lsコマンドはカレントディレクトリにあるファイルやディレクトリの一覧を確認するためのコマンドです。
ファイル名が.から始まるファイルはオプションで-aを付ける必要があります。
オプション-lを付けると、ファイルの権限なども同時に確認することができます。
2つのオプションをまとめて使用する場合は、-を1つにして-laとします。

この「.git」というフォルダがローカルリポジトリです。
この中に設定情報やファイルの変更履歴の情報などが格納されています。

ファイルを作成する

バージョン管理するために、ファイルを作成してみます。
ファイルは何でもよいですが「Hello.txt」というテキストファイルを作成してみます。
中身も何でもよいですが、1行目に「Hello」とだけ記述しておきます。 GUIで作成しても良いですが、コマンドで

echo "Hello" > Hello.txt

としても作成することができます。

※軽く解説
echoは文字や数値などを画面に出力するためのコマンドです。

echo "Hello"

とすると、画面に「Hello」の文字が出力されます。

「>」は、リダイレクトと呼ばれる機能で、この記号の左側のコマンドの実行結果を右側に引き渡すことができます。
ファイル名を指定すると、そのファイルに左側のコマンドの結果が書き込まれます。
ファイルが存在しない場合は新しく作成されます。

echo "Hello" > Hello.txt

とすると、Hello.txtというファイルが作成され、Helloという文字列が書き込まれます。

状況を確認する

今の作業ディレクトリの状況を確認します。
核にするにはstatusコマンドを使用します。

# ステータス確認
git status

私の環境では以下のような表示になります。

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Hello.txt

nothing added to commit but untracked files present (use "git add" to track)

masterブランチで
追跡されていないファイル「Hello.txt」があると言っています。
追跡されていないとは、ステージングエリアに追加されていないという意味です。
git addコマンドを使うことでステージングエリアに追加できます。

ブランチやステージングエリアという用語についてはGitの概要のページで確認ください。

ステージング環境へ移す

ということでステージングエリアに追加してみます。 ステージングエリアに追加するにはaddコマンドを使用します。

# ステージングエリアに追加
git add Hello.txt

追加したら再度ステータスを確認します。

# ステータス確認
git status

以下のような表示になります。

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   Hello.txt

Hello.txtがステージングエリアに追加されました。
このファイルがコミットの対象になります。

その他のaddに関するオプション

# 全てのファイルを追加
git add *
# 拡張子が.txtのファイルを全て追加
git add *.txt
# 変更したファイルを全て追加
git add -u
# 全てのファイルを追加
git add -A
git add .
git add --all

gitリポジトリにコミットする

コミットの準備が整ったので、コミットしてみます。
コミットはcommitコマンドを使用します。

# コミット
git commit -m "first commit"

以下のようなメッセージが表示されれば成功です。

[master 4b11e54] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Hello.txt

4b11e54というのはコミットIDの先頭の7桁です。
commitの後に付けた「-m」は、コミットメッセージを書くためのコマンドです。
Gitではコミット時にメッセージが必須です。
-mをつけなかった場合、設定したでテキストエディタ(デフォルトではVim)が起動し、コメントの入力を促されます。

ステータスを確認します。

# ステータス確認
git status
On branch master
nothing to commit, working tree clean

コミット対象がない旨が表示されます。

その他のコミットのオプション

# コミットの対象がなくてもコミットすることができる。
git commit --allow-empty

# ステージングエリアに移動していなくても、変更したファイルをコミットすることができる。
# ただし、新規に追加したファイルには行えない。
git commit -a

ログを確認

コミットをするとログが確認できるようになります。
ログの確認にはlogコマンドを使用します。

# ログの確認
git log
commit 4b11e54f096da84aae608b974f9f3d17e0ed1d3a (HEAD -> master)
Author: xxxx <xxx.xxxx@xxxx.co.jp>
Date:   Tue Feb 4 14:26:35 2020 +0900

    first commit

コミットID、ブランチ、コミット者、日時、コミットメッセージなどが表示されます。
複数のコミットがある場合は、一番最新のコミットが一番上で、時系列で並んで表示されます。

変更されたファイルの差分を表示することもできます。

git log -p
# 上部は省略
diff --git a/Hello.txt b/Hello.txt
index e69de29..e965047 100644
--- a/Hello.txt
+++ b/Hello.txt
@@ -0,0 +1 @@
+Hello

コミットのログはコミットするたびに追加されるため、コミットの数が増えてくると、絞り込みをしないと欲しい情報を取得するのが難しくなります。
絞り込むためのオプションが色々あるので、必要に応じて使い分けると良いでしょう。

git logのオプション色々

# 直近のコミット1つだけ表示
# 数値を変更することで、その数のログを表示する
git log -1

# 1コミットがコミットIDとメッセージの1行に集約される
git log --oneline
# マージ状況が視覚的に確認できるようになる
git log --graph
# 組み合わせて使うと便利
git log --oneline --graph

# 開発者名での絞り込み
git log --author="開発者名"
# 複数人での絞り込み
git log --author="開発者名1\|開発者名2"

# コミットメッセージでの絞り込み
git log --grep="キーワード"
# コミットされたファイルの中からキーワードで絞り込み
git log -S "キーワード"

# 日時での絞り込み
# 指定して日付以降のコミット
git log --after = "2019-01-01"
# 時間による絞り込み

# 特定のファイルのログの確認
git log ファイル名

ファイルの修正

コミットしたファイルに修正を加えた場合を見ていきます。
Hello.txtに更に文字を追加してファイルを更新します。

# Hello.txtに文字の追加
echo "World" >> Hello.txt
# ファイルの中身の確認
cat Hello.txt
# ステータスの確認
git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   Hello.txt

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

変更されたけどステージングエリアには追加されていない旨が表示されます。

※軽く解説 「>>」を使用すると、ファイルの内容を残したまま最後の行に追記される。

ステージングエリアに追加します。

# ステージングエリアに追加
git add Hello.txt
# ステータス確認
git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   Hello.txt

これでコミットの準備ができました。

ファイルを元の状態に戻す

ここでコミットを実行すれば、変更した内容がリポジトリに追記されます。
ここではコミットせずにバージョン管理の特性を活かしてHello.txtのファイルの中身を編集前に戻してみます。

まずは、resetコマンドを使ってステージングエリアにある状態を戻します。

# 直近のコミットの状態にリセット
git reset HEAD
# ステータス確認
git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   Hello.txt

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

ステージングエリアに追加される前(addコマンドを使用する前)の状態になっています。

次にcheckoutコマンドを使用して前回のコミットの状態に戻します。

# ファイルを元に戻す
# -- は、ブランチ名とファイル名が被っていた場合に、ファイル名が指定されるためのオプション
git checkout -- Hello.txt
# これでもできる。これだと全ファイルを対象にする
# git checkout .

# ステータスの確認
git status
# ファイルの中身の確認
cat Hello.txt

テキストファイルの中身がHelloだけになっているはずです。

checkoutコマンド

checkoutコマンドは、ブランチを切り替えるコマンドですが、ファイルを指定すると、リポジトリからファイルをワーキングディレクトリに引っ張ってきてくれます。

# 2つ前のバージョンに戻る
git checkout HEAD~2 .

なども可能

resetコマンド

addコマンドを取り消したりできるコマンドです。
ただ実はコミットも取り消したりと、色々できるコマンドです。

# 指定したコミットの一つ前の状態に戻れる。
git reset コミットID^
# 直前のコミットの状態に戻る
git reset HEAD^
git reset master^
# 2つ前のコミットの状態になる。
git reset HEAD~2

resetのオプション

resetコマンドには3つのオプションがある。

  • --mixed
  • --soft
  • --hard

デフォルトはmixed。これは、ステージングエリアのファイルをリセットされるが、ワーキングディレクトリのファイルは元のまま。
softは、ワーキングディレクトリもステージングエリアも元のまま。コミットだけが取り消させる。 hardは、ワーキングディレクトリもステージングエリアも取り消される。コミット前に戻る。 resetコマンドは、ファイルの状態がコミット前に戻るだけで、コミット自体がなくなるわけではない。

間違ってresetしてしまった場合

git reflogコマンドで、コミットIDを確認すれば、また元の状態に戻ることができる。 git log -g でも可。 このときは git reset --hard コミットID で戻る。

ファイルの削除

次はファイルを削除する場合を見ていきます。
Gitではファイルを削除する場合にもステージングエリアに追加してコミットすることが必要です。
rmコマンドを使用します。
rmコマンドにより、物理的に削除しつつ、Gitにも反映させることができます。

# ファイルの削除 & ステージングエリアへの追加
git rm Hello.txt
# ステータスの確認
git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    Hello.txt

削除された旨が表示されます。

#ディレクトリから削除されていることも確認
ls -la
# コミット
git commit -m "Hello.txtの削除"
# ログの確認
git log -1 
commit 94793ed5d9b64661a349dfde70c38f10eee87f0a (HEAD -> master)
Author: XXXXX <xxxxx@xxxx.co.jp>
Date:   Wed Feb 5 09:51:22 2020 +0900

    Hello.txtの削除

OS上から直接ファイルを消してしまったとき

Gitから削除せず、エクスプローラを使ってOS上から直接ファイルを削除した場合にどうなるかを確認してみます。

# 新たにファイルを追加
echo "test" > test.txt
# ステージングエリアに追加
git add test.txt
# コミット
git commit -m "test.txtの追加"
# ログの確認
git log 

コミットが完了した段階で、エクスプローラ上からファイルを削除してみる。
その後、ステータス確認してみる。

git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    test.txt

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

削除されたけどステージングエリアにないと表示されます。
ステージングエリアに追加してコミットすればGit上でも削除されます。

# ステージングエリアに追加
git add test.txt
# コミット
git commit -m "test.txtの削除"

ファイル名の変更

ファイル名の変更は、Gitから見ると元のファイルが削除されて新しいファイルが追加された状態になります。
mvコマンドでファイル名の変更が可能です。

# ファイル作成
echo "hello" > index.txt
# ステージングエリアに追加
git add index.txt
# コミット
git commit -m "index.txtの追加"
# ファイル名の変更
git mv index.txt index.html
# ステータスの確認
git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    index.txt -> index.html

変更された旨が表示されます。

# コミット
git commit -m "ファイル名の変更"

これでファイル名が変更されました。
git logコマンドなどで確認してみて下さい。

OS上で直接ファイル名を変更した場合

削除の時と同様、エクスプローラーを使ってOS上で直接ファイル名を修正した場合も確認してみましょう。

# ファイルの追加
echo "test" > test.txt
# ステージングエリアに追加
git add test.txt
# コミット
git commit -m "テストファイル追加"

ここで、エクスプローラ上でtest.txtのファイル名をsample.txtに変更します。

# ステータス確認
git status
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    test.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        sample.txt

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

test.txtが削除され、sample.txtが追加されました。

# それぞれをステージングエリアに追加
git add test.txt sample.txt
# ステータス確認
git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    test.txt -> sample.txt

ファイル名が変更された状態になりました。

# コミット
git commit -m "ファイル名変更"

特定のファイルをバージョン管理対象外にする

作業をしている中で、作業ディレクトリの中にあるファイルでも、特定のファイルをバージョン管理対象外にしたい場合もあります。
例えば、プログラム開発中の場合、ソースコードコンパイルして出来上がったバイナリファイルや中間コードのファイルなどは、ソースコードがあれば作成可能なため、バージョン管理する必要はありません。
また、設定ファイルなども、環境によって異なる場合があるため、共有させないためにもバージョン管理からは外しておいた方が無難です。

作成・修正したファイルはステージングエリアに追加しなければコミットされません。
なので、git addコマンドのときに除外し続ければバージョン管理はされませんが、複数のファイルをまとめてステージングエリアに追加する場合(「git add *」など)、誤って追加されてしまう可能性もあります。
このような事態を防ぐために、Gitではバージョン管理対象外を管理するための設定ファイルがあります。

「.gitignore」というファイルをgitリポジトリと同じ階層に配置し、そのファイルの中に対象外としたいファイルを記述します。

# .gitignoreファイルの作成
touch .gitignore
# 中身に対象外にしたいファイルを追加
echo "ignore.txt" > .gitignore
# ステージングエリアに追加
git add .gitignore
# コミット
git commit -m "gitignore追加"
# 中身の確認
cat .gitignore
# 対象外にしたファイルを確認作成する
echo "Hello" > ignore.txt
# ステータスの確認
git status
On branch master
nothing to commit, working tree clean

ファイルの追加が反映されていません。
gitから無視されていることが分かります。

途中からバージョン管理対象外にしたい場合

始めはバージョン管理していたものの、途中からバージョン管理の対象外にしたい場合もあります。
そういう場合に対処を見ていきます。
まずはファイルを追加してコミットまでしてしまいます。

# ファイルの追加
echo "Hello" > ignore2.txt
# ステージングエリアに追加
git add ignore2.txt
# コミット
git commit -m "ignore2追加"

次に.gitignoreに追加します。

# gitignoreに追記
echo "ignore2.txt" >> .gitignore
# ステージングエリアに追加
git add .gitignore
# コミット
git commit -m ".gitignore修正"
# 追記
echo "World" >> ignore2.txt
# ステータスの確認
git status

まだバージョン管理の対象になっていることが分かります。

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   ignore2.txt

つまり、一度バージョン管理に対象にしてしまったファイルは、後から.gitignoreに追記しただけでは管理対象外にはならないということ。
ここで管理対象がいにするには、rmコマンドで--cashedオプションを使用します。
※オプションを付けないと物理的に削除されるので注意。

# --cashedオプションをつけて、削除
git rm --cached ignore2.txt
# ファイルが物理的に削除されていないことを確認
ls -la
# ステータス確認
git status

削除されていることが確認できます。

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    ignore2.txt
# ステージングエリアに追加
git add ignore2.txt
# コミット
git commit -m "ignore2を削除"
# ファイルを確認
ls -la
# ファイルに追記
echo "Good Bye" >> ignore2.txt
# ステータス確認
git status

Gitから認識されていないことが分かります。

On branch master
nothing to commit, working tree clean

ということで、一度バージョン管理の対象にしたものを後から対象外に設定するのは以外と面倒。
.gitignoreについては、GitHubプログラミング言語ごと、あるいはフレームワークごとにテンプレが用意されてたりするので、環境に合わせて探して最初からある程度設定してた方が無難。

その他、管理対象に関連するオプション

# 無視の対象となっていても強制的に追加する
git add -f ファイル名
# 管理対象外のファイルを一気に強制削除する
# 物理的に削除される
git clean -fX

ブランチ

ブランチは枝という意味です。
複数の作業を同時並行で行うとき、ブランチの機能を使うことで、それぞれの作業で別の作業でのファイルの修正に干渉されずに作業を進めることができます。
ここではまず新しいブランチを作り、既存のファイルに新しい修正をしつつ、新しいファイルも作成します。
最終的にそのブランチを一つに統合するまでの過程からブランチについて学びます。

ブランチの確認

ブランチ関連の操作は、branchコマンドを使用します。

# ブランチの一覧と現在のブランチの確認
git branch

ブランチの一覧が表示されます。
masterは、リポジトリを作成したときに作成されるデフォルトのブランチです。
「*」がついているブランチが現在作業しているブランチを表します。

* master

新しいブランチの作成

新しいブランチを作成してみます。
ブランチを作成するときはbranchコマンドの後に作成するブランチを作成します。

# newbranchというブランチを作成
git branch newbranch
# 確認
git branch

新しいブランチが作成されました。

* master
  newbranch

既にあるブランチと同じ名前で作成しようとするとエラーになります。

# もう一度作成しようとするとエラーになる
git branch newbranch
fatal: A branch named 'newbranch' already exists.

ブランチを切り替える

ここから作業するにあたり、
現在、masterブランチではsample.txtというファイルがあり、中身が

test

となっている前提で話を進めます。

ブランチをnewbranchに切り替えて作業を進めます。
ブランチの切り替えはcheckoutコマンドを使用します。

# ブランチの切り替え
git checkout newbranch

ブランチが切り替わりました。

Switched to branch 'newbranch'
M       ignore2.txt
# 切り替わったか確認
git branch

切り替わりました。

  master
* newbranch

切り替えたブランチで既存のファイルの修正&新しいファイルの追加を行います。

# 既存のファイルへの追加
echo "add newbranch" >> sample.txt
# 新しいファイルの追加
echo "newbranch" > newbranch.txt
# 全てのファイルをステージングエリアに追加
git add *
# コミット
git commit -m "ファイルの修正と削除"

masterブランチに戻って、newbranchでの作業がmasterには反映されていないことを確認してみます。

# ブランチの切り替え
git checkout master
# newbranch.txtがないことを確認
ls -la
# 中身が修正前であることを確認
cat sample.txt

続いては新しいブランチをmasterにマージ(統合)してみます。
マージすると、newbranchの更新内容をmasterブランチに反映させることができます。
マージするには、マージされる側のブランチの部分で、mergeコマンドを使用します。

# マージ
git merge newbranch

うまくいきました。

Updating 97900cd..09652be
Fast-forward
 ignore2.txt   | 1 +
 newbranch.txt | 1 +
 sample.txt    | 1 +
 3 files changed, 3 insertions(+)
 create mode 100644 newbranch.txt
# ログの確認
git log --graph --oneline -1

マージされたのが確認できます。

* 09652be (HEAD -> master, newbranch) ファイルの修正と削除

競合(コンフリクト)

先ほどの操作では、2つのブランチで同じファイルに対しての修正はなかったため、正常にマージできましたが、2つのブランチで同じファイルに対して修正を行った場合は、競合を起こしてしまう場合があります。
ここではあえて競合を発生させてみます。

# ブランチの確認
# masterであることを確認する
# masterでないならmasterへ移動する
git branch
# sample.txtに1行追加する
echo "master" >> sample.txt
# ステージングエリアに追加
git add sample.txt
# コミット
git commit -m "sample.txtに追加"
# ブランチ切り替え
git checkout newbranch
# ブランチの確認
git branch
# sample.txtに1行追加する
echo "newbranch" >> sample.txt
# ステージングエリアに追加
git add sample.txt
# コミット
git commit -m "競合用に追加"
# ブランチの切り替え
git checkout master
# ブランチの確認
git branch
# マージ
git merge newbranch
Auto-merging sample.txt
CONFLICT (content): Merge conflict in sample.txt
Automatic merge failed; fix conflicts and then commit the result.

sample.txtで競合(コンフリクト)が発生しました。

ステータスを確認してみます。

# ステータスの確認
git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   sample.txt

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

マージがされなかった旨が表示されます。

競合が発生した場合は、手動で中身をなおすしかありません。
まずは中身を確認します。

# 内容確認
cat sample.txt
test
add newbranch
<<<<<<< HEAD
master
=======
newbranch
>>>>>>> newbranch

両方の内容が表示されます。
手動で修正してどちらかを採用することにします。
今回はmasterを採用することにします。
vim、またはご利用のテキストエディタを使って中身を修正します。

test
add newbranch
master
# ステージングエリアに追加
git add sample.txt
# ステータス確認
git status

修正が行われたがまだコミットされていない様です。

On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

コミットします。

# コミット
git commit -m "マージ解決"
# ステータス確認
git status
On branch master
nothing to commit, working tree clean

無事にコミットできました。

ログを確認します。

# ログの確認
git log --oneline --graph -2

無事統合されました。

*   54c0227 (HEAD -> master) マージ解決
|\
| * ab998fc (newbranch) 競合用に追加

ブランチの削除

いらなくなったブランチは削除します。
ブランチを削除するときは、branchコマンドで-dオプションをつけます。

# ブランチの削除
git branch -d newbranch
# ブランチ確認
git branch

その他の操作

色々な操作を確認しておきます。

一部の内容だけをコミットする

修正した内容の一部だけをコミットすることもできます。
addコマンドの-pオプションを使用します。

echo "100" >> sample.txt
echo "200" >> sample.txt
git add -p
diff --git a/sample.txt b/sample.txt
index 6872e1b..1eb7b3e 100644
--- a/sample.txt
+++ b/sample.txt
@@ -1,3 +1,5 @@
 test
 add newbranch
 master
+100
+200
Stage this hunk [y,n,q,a,d,/,e,?]?

eを選択すると、vim(エディタ)が起動し、コミットしたい部分だけを選ぶことができます。

ファイルの調査

一つのファイルを対象に調査したい場合、blameコマンドで、ファイルに対しての度のコミットで追加されたかが確認できます。

# 一つのファイルに対してどのコミットで追加されたかわかる
git blame sample.txt
623b805f test.txt   (kishimoto keisuke 2020-02-05 11:09:44 +0900 1) test
09652bee sample.txt (kishimoto keisuke 2020-02-06 16:15:17 +0900 2) add newbranch
b389beb9 sample.txt (kishimoto keisuke 2020-02-06 18:39:55 +0900 3) master
a21e26c7 sample.txt (kishimoto keisuke 2020-02-06 19:29:29 +0900 4) 100
00000000 sample.txt (Not Committed Yet 2020-02-06 19:32:01 +0900 5) 200

直近のコミットのやり直し

# 直近のコミットのコミットメッセージを変更したい場合
# --amend オプションは、直近のコミットをやり直すことしかできない
# コミットの際に追加し忘れたファイルがある場合などにも使える
# 追加し忘れた場合、addでステージングエリアに追加した後に、再度--amendオプションを使ってcommitし直す。
# --no-edit オプションを付けると、メッセージは修正されない。
git commit --amend -m "コミットメッセージ"

差分の確認

TODO