LoginSignup
17
17

More than 5 years have passed since last update.

初心者向けGit操作FAQ

Last updated at Posted at 2016-04-02

はじめに

次の操作はなんとなくできるけど、その他が分からない人向けのFAQです。
このあたりが怪しい人は、次のおすすめの教材は?で基本を確認してください。

  • はじめにgit cloneして、git pull, git add, git commit, git pushする
  • git branch, git checkoutでブランチを操作する
  • git log, git statusで状態を確認する

0. おすすめの教材は?

いろいろありますが、無料でわかりやすい次のサイトがおすすめです。

次をみるとよく使うものは大体調べられます。

サルでもわかるGit入門 逆引きGit

1. Gitをはじめたばかりの初心者からよく聞かれる質問

pullできない

よくあるのは、pullしたときに次のメッセージがでる場合です。

Please, commit your changes or stash them before you can merge.

pullはリモートリポジトリからコードをダウンロード(fetch)して、自分のコードとマージ(merge)する行為です。

pull = fetch + merge origin/master

commitしていないというのは作業中ということなので、このような操作をすることは本来ありえないはずです。
そのため、gitではcommitしていない状態でpullするとエラーになります。
commitしてからpullしましょう。
commitをしたくないという場合はstashで一時退避すればpullできます。

マージしていいの?

どこからどこにマージするかが重要です。
masterへのマージは、ローカルで実施しないルールがよくあります。
例えば、GitLab Flowの場合、masterへのマージはマージリクエストで実施します。
その場合は、ローカルで自分のブランチをmasterにマージしてはいけません。

まずは自分がどのブランチいるかを確認しましょう。

git status

On branch fooと表示されれば、fooブランチにいることになります。
この状態で、barをマージしたいのであれば、次のコマンドを実行します。

git merge bar

競合を解消したい

pullしたときなどに、次のようなメッセージがでているときは、他の人の変更と競合が発生しています。

CONFLICT (content): Merge conflict in <file>
Automatic merge failed; fix conflicts and then commit the result.

競合しているファイル(部分)を開くと次のように競合している箇所がマーキングされています。

<<<<<<< HEAD
## gitlesson1
=======
## lesson1
>>>>>>> 9cb71b3e2bfa1be8b2f5a85d360ffe215a46235b

=======の上が自分、下が他の人の変更です。
HEADは自分が今使っているブランチの先頭で、9cb71b3e2bfa1be8b2f5a85d360ffe215a46235bは他の人の変更のcommit IDです。
この部分を適切に修正して、commitすれば競合が解消されます。
例えば、自分の変更を正とする場合であれば、次のとおりに変更します。

## gitlesson1

その後、commitします。

git commit -m "XXのため発生した競合をYYで解消"

2. 少し慣れてきた初心者からよく聞かれる質問

元に戻したい

全体を元に戻したい

全体を元に戻したいときは次のようにします。
--hardは自分の作業領域まで元に戻すオプションで、--softは、作業領域は戻さずにローカルリポジトリだけ元に戻します(commitを消したい参照)。

git reset --hard

特定のcommitポイントまで戻したいときは次のようにします。

git reset --hard <commit ID>

commit IDはgit logで確認します。

特定のファイルを元に戻したい

あるファイルだけ、直前のcommitまで戻したいときは次のようにします。

git checkout <file>

特定のcommitポイントまで戻したいときは次のようにします。

git checkout <commit ID> <file>

git logで確認します。

作成済みのブランチを引き継ぎたい

例えば、他の人が作業しているブランチを途中で引き継いで作業する場合には、リモートリポジトリのブランチをローカルリポジトリに持ってくる必要があります。
その場合は、次のようにブランチを作成します。

git checkout -b feature/#99 origin/feature/#99

origin/feature/#99というのが他の人が作成してリモートリポジトリに存在するブランチです。
(originというのがリモートリポジトリを表していますあるのがポイントです。)
ローカルリポジトリにfeature/#99を作成して、origin/feature/#99とひも付けています。

タグをつけたい

特定のcommitにタグをつける場合は次のようにします。

git tag <tag name>
git push --tags

タグをつけたところに戻す場合は、次のようにします。

git reset --hard <tag name>

変更を比較したい

直前のcommitと比較する場合は次のようにします。

git diff HEAD

特定のcommitポイントと比較するときは次のようにします。

git diff <commit ID>

commit IDはgit logで確認します。

作成中のコードを避難したい

作業中のコードを一時的に避難するときは次のようにします。
messageは省略できます。

git stash save "<message>"

避難したものを確認するときは次のようにします。

git stash list

避難したものを復元する場合は次のようにします。
nはstashしたときの番号です。
stash@{n}部分を省略すると最新のものが復元されます。

git stash pop stash@{n}

避難したものを削除する場合は次のようにします。
nはstashしたときの番号です。
stash@{n}部分を省略すると最新のものが削除されます。

git stash drop stash@{n}

避難したもの全てを削除する場合は次のようにします。

git stash clear

3. 初心者から聞かれるとうれしい質問

commitログをキレイにしたい

ローカルで作業するときに、細かくcommitするのはよい習慣ですが、リモートにpushするときにはトレースしやすいようにキレイに整理したいものです。
なお、リモートにpushしてしまったものは変更できないので注意してください。
(つまり、commitログはpushする前にキレイにしなければならない。)

commitを消したい

直前のcommitを消したいときは次のようにします。
--softは作業領域は戻さずにローカルリポジトリだけ元に戻すオプションで、--hardは自分の作業領域まで元に戻します(元に戻したい参照)。

git reset --soft HEAD^

特定のcommitポイントまで消したいときは次のようにします。

git reset --soft <commit ID>

commit IDはgit logで確認します。

commitをまとめたい

あるcommitだけを残して、それまでのcommitは履歴から消したいときは次のようにします。
(commit IDを省略すると、pushしていない最も古いcommitまでを編集できます。)

git rebase -i <commit ID>

ここで、編集画面がでてきます。

pick 6d614bd a
pick 10f8cbb b
pick 53ae876 c

# Rebase b03024d..53ae876 onto b03024d (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

pickの部分をコメントの説明のとおりに編集します。
例えば、aとbを消してしまって、cだけを残したい場合は次のようにして保存します。

d 6d614bd a
d 10f8cbb b
pick 53ae876 c

ここで、競合が発生することがあるので、注意してください。
aとbのcommitを削除するだけなのに、なぜ競合が発生するのかと思うかもしれませんが、rebaseは新たなコミットを生成して、そこに移動するコマンドです。
そのため、競合が発生することがあります。
ともかく、メッセージをよくみて、競合が発生していたら、通常どおりに競合を解消してください。

最後に、rebaseを完了させるコマンドを実行します。

git rebase --continue

もし、rebaseをやめる場合は次のようにします。

git rebase --abort
17
17
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
17
17