git clone してきた場合は不要
$ git init
ここで設定した名前やメールアドレスはリポジトリを clone できる人なら確認できるので注意すること。
$ git config --local user.email "<メールアドレス>"
$ git config --local user.name "<名前>"
どのファイルが編集されているか、どのファイルがステージされているかを確認できる
# 基本
$ git status
# 圧縮表示(見やすい)
$ git status -s
# 基本
$ git log
# 圧縮表示(たくさん見たい時)
$ git log --oneline
# 変更されたすべてのファイルをステージ
$ git add -A
# 特定のファイルをステージ
$ git add hoge.txt
# 今いるフォルダ配下の全体をステージ
$ git add .
コミットされるのはステージされた変更のみ
$ git commit -m "メッセージ"
push, pull は本当はもっと奥が深い。
# 手元の修正をリモートリポジトリに反映
$ git push
# リモートリポジトリの修正を手元に反映
$ git pull
元々のリポジトリが GitHub なら Web UI 上で fork するのが簡単だが、 そうでないなら一度ローカル環境を経由する必要がある。
追記: 同じリポジトリの fork を複数作れないので、相手が GitHub であってもこの手順を踏んでください。
$ git remote -v
origin https://gitlab.com/inkscape/inkscape (fetch)
origin https://gitlab.com/inkscape/inkscape (push)
この例では、origin という名前で fetch(pull), push した場合に https://gitlab.com/inkscape/inkscape
に接続することを示す。
git clone したリポジトリの中にいると仮定
# 元々のリポジトリに対応する名前を origin から upstream に変更
$ git remote rename origin upstream
# origin という名前で GitHub の URL を登録
# リポジトリ名は「年度-班番号2桁-ソフトウェア名」にする(事前に作成しておく)
$ git remote add origin [email protected]:doss-eeic/2022-01-inkscape.git
# 今いるブランチ(master)を origin(GitHub)に master という名前で登録
# -u をつけるとデフォルト設定にできる(その後このブランチからは git push だけで origin/master に push される)
$ git push -u origin master
この設定をすると、接続先リポジトリは以下のようになるはず。
$ git remote -v
upstream https://gitlab.com/inkscape/inkscape (fetch)
upstream https://gitlab.com/inkscape/inkscape (push)
origin [email protected]:doss-eeic/2022-01-inkscape.git (fetch)
origin [email protected]:doss-eeic/2022-01-inkscape.git (push)
# 今いるブランチを元に新しいブランチを作成し、そのブランチに移動する
# この段階では、ブランチは作成した本人の手元にしかない
$ git checkout -b <新ブランチ名>
# 新しく作成したブランチを GitHub に登録
$ git push -u origin <新ブランチ名>
ある時点でのコミットから別の作業を開始したい場合。
# まず git のログを確認し、戻りたいコミットのハッシュ値(commit の横に書いてあるもの)を確認
$ git log
# 確認したコミットから新たにブランチを作成し、移動
$ git checkout <ハッシュ値> -b <新ブランチ名>
上記作業のイメージ。main
ブランチの HEAD
にいるときに、git checkout 234567 -b new-branch
して新しいブランチを作り、さらにそのブランチ上でコミット 567890
をした例。
gitGraph
commit id: "123456"
commit id: "234567"
branch new-branch
checkout main
commit id: "345678"
commit id: "456789" tag: "HEAD"
checkout new-branch
commit id: "567890"
$ git branch
* master
hoge
この例では、手元の環境に master, hoge という2つのブランチがあり、今は master にいることを示している。
# 手元の情報を最新に更新
$ git fetch
# 全てを一覧
$ git branch -a
* master
hoge
remotes/origin/master
remotes/origin/hoge
remotes/origin/fuga
この例では、手元の環境に master, hoge、GitHub 上に master, hoge, fuga というブランチがあることを示している。
$ git checkout <ブランチ名>
# 手元の情報を最新に更新
$ git fetch
# origin(GitHub)上のブランチを元に、新たに手元にブランチを作るイメージ
$ git checkout -b <ブランチ名> origin/<ブランチ名>
手元のブランチ名と対応する GitHub 上のブランチ名を変えることもできるが、混乱するのでやめたほうが良い。
ブランチ fix をブランチ master に統合する例。コンフリクトすると厄介なので慎重に。
# マージ先のブランチに移動
$ git checkout master
# マージ
# これを実行するとエディタ(vim とか)が開き、コミットメッセージを入力して確定
$ git merge fix
Pull Request を出す前に以下を確認すること。
-
リポジトリ内の CONTRIBUTING.md などを読んだか ある程度の規模のプロジェクトであれば上記のようなファイルが存在するはず。必ず良く読み、その基準を満たしているかどうかを確認すること。
-
ブランチ 1 本にまとめているか 複数のブランチで作業していたとしても、適宜手元でマージして 1 本の Pull Request 用ブランチを作成すること。
-
コミット内容は適切か 複数の問題に対する変更が混ざったりしていないか。コミットメッセージはわかりやすいものになっているか(ルールが存在する場合もある)。
-
本家の最新に追従しているか 開発が活発なリポジトリであれば、自分たちが作業している間にも master が伸びているはず。以前の章で示したように本家リポジトリを upstream として残していれば、作業ブランチ上で
$ git pull --rebase upstream master
とすれば本家レポジトリの変更を取り込んだ上でその最新のコミットからブランチをはやしたような形になる。
もしそのコミットしていない変更を後で使う可能性があるなら次節の方法を使う。
# すべてのファイルを戻す
$ git checkout .
# 特定のファイルを戻す
$ git checkout <ファイル名>
# コミットしていない変更を新しく追加したものも含め退避(stash)する
$ git stash -u
# stash した変更一覧
$ git stash list
# stash した変更を戻す
$ git stash pop
ステージの取り消しだけで、ファイルの変更は残る
# 全ての add を取り消す
$ git reset .
# 特定のファイルの add を取り消す
$ git reset <ファイル名>
まだ push してないとき。
# エディタが開く
$ git commit --amend
既に push してしまったものを書き換えるのは避けたほうが良い(force push が必要になるので)。
まだ push してないとき。
$ git add <追加したいファイル>
$ git commit --amend
既に push してしまったものを書き換えるのは避けたほうが良い。
【危険】push していないことを確認すること。push 後のコミットに対しこれをやってはならない。
# 直前のコミットを「なかったこと」にする(履歴から消える)
# コミットに含まれていた変更はステージング状態に戻る
$ git reset --soft HEAD^
git revert
は、指定したコミットと逆の操作をするコミットを作ることでコミットを取り消す。
# 直前のコミット前の状態にする
$ git revert HEAD
- does-eeic上に自分達のリポジトリを作る(PublicでもPrivateでもお好きな方で)、名前は「年度-班番号2桁-ソフトウェア名」にする。
- 次にチームの内1人がローカル環境にOSSのソースが入ったリポジトリを作るが、公開されているリポジトリをフォークする方法、クローンする方法、公式が配布している tar ボールをダウンロードしてくる方法がある。後者についてはテキストも参照。以下ではgnuplotの例を示す。
- フォークする場合。(強制的にpublic repositoryとなってしまうことに注意) 公式チュートリアルを参照。
- クローンする場合。
$ git clone [email protected]:gnuplot/gnuplot.git $ cd gnuplot # ここで作業する $ git remote rename origin upstream
- tar ボールでダウンロードする場合。
$ wget https://sourceforge.net/projects/gnuplot/files/gnuplot/5.4.2/gnuplot-5.4.2.tar.gz $ tar xvfz gnuplot-5.4.2.tar.gz $ cd gnuplot-5.4.2 # ここで作業する $ git init
- リポジトリを登録してpush
$ git remote add origin [email protected]:doss-eeic/2023-00-test.git $ git branch -M main $ git push -u origin main
- 他のチームメンバーがリポジトリをクローンする。
$ git clone [email protected]:doss-eeic/2023-00-test.git