工欲善其事,必先利其器#
最重要的当然是要下载 Git 🚀
Terminal プラグイン:oh-my-zsh(mac)|oh-my-posh(windows)
Vscode プラグイン:Git Lens | Git Graph
なぜ git なのか?#
プログラム開発が複雑化するにつれて、協調作業はプロジェクト開発において不可欠なものとなりました。他の人と協力する際に、どのようにして仲間の最新のコードを取得するか、皆さんはどうしていますか?プロジェクトファイルを送信することを多くの人が行ったことがあると思いますが、私自身もそうです。
しかし、QQ を使用して協調開発を行うと、以下のような問題が発生します。
- コードのマージを手動で行う必要がある(目視での diff)
- 複数人が同時に開発することができない
- 単純に上書きするだけでは、自分のコードが上書きされる可能性がある
- コードの変更履歴を記録できない(Ps:誰が書いたのかわからない屎山、バグを誰が解決するのかわからない)
- コードのバージョンを戻せない(毎回圧縮するのは馬鹿げている)
もちろん、QQ などのコミュニケーションソフトを使用して協調開発を行うと、上記の問題だけでなく、さまざまな痛点が発生します。したがって、git を使用して協調開発を行うことが非常に重要です。git はこのような理由から生まれました。では、git の公式な説明を見てみましょう。
git は、各コード変更を個別の commit として粒度化し、異なるローカルブランチや上流のオンラインブランチを通じて、各自がローカルで開発し、最終的にリモートリポジトリにマージすることを可能にします。これにより、小規模な 2、3 人のプロジェクトから、数百人が共同開発する複雑なプロジェクトまで、効率的に協調開発を行うことができます。
したがって、git を学ぶことはすべてのプログラマーが習得すべきことです。教師のためのプロジェクトであれ、将来の会社での仕事であれ、git は不可欠です。無駄話はさておき、git の学習を始めましょう。
git 基本概念#
- ローカルリポジトリはリモートリポジトリに対してのものである(ローカルリポジトリはリモートリポジトリに遅れている可能性があるため、開発前にリモートリポジトリの情報を取得し、コードの衝突を防ぐ必要がある)
- ローカルリポジトリ = 作業領域 + バージョン領域
- 作業領域はディスク上のファイルの集合である。
- バージョン領域(バージョンリポジトリ)は.git ファイルである。
- バージョンリポジトリ = ステージングエリア + ブランチ(master) + ポインタ Head
- 私が最も頻繁に使用する git コマンドの例として、github へのコミットを挙げます。
- git init は、元々ローカルリポジトリには作業領域しか含まれておらず、これは最も一般的な作業状態です。この時、git init を実行すると、ローカル領域に.git ファイルが作成され、バージョン領域が構築されます。
- git add . は、作業領域のすべてのファイルをバージョン領域のステージングエリアに追加することを意味します。
- もちろん、git add ./xxx/ を使用して、一つずつ分割してステージングエリアに追加することもできます。
- git commit -m "xxx" は、ステージングエリアのすべてのファイルをリポジトリ領域にコミットし、ステージングエリアは空になります。
- git remote add origin https://github.com/name/name_cangku.git は、ローカルリポジトリとリモートリポジトリを接続します。
- git push -u origin master は、リポジトリ領域のファイルをリモートリポジトリに送信します。
- 一度コミットした後、作業領域に何の変更も加えなければ、作業領域は「クリーン」になります。その場合、"nothing to commit, working tree clean" というメッセージが表示されます。
git コードホスティングプラットフォームの使用(github)#
国内のネットワーク環境の問題により、github に正常にアクセスできない場合があります。
プロキシを使用し、git プロキシを設定する必要があります。#
// ここでは実際のプロキシポートに基づいてください。
git config --global https.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080
アカウントを設定する#
// githubを多く使用する場合、グローバルにgithubアカウントを設定できます。
git config --global user.name "あなたの名前" //すべてのGitリポジトリにあなたの名前をバインドします。
git config --global user.email "あなたのメール" //すべてのGitリポジトリにあなたのメールをバインドします。
リモートリポジトリを取得する#
// 最も簡単なのは直接cloneすることです。
git clone https://github.com/withastro/docs.git
// 手動でリポジトリを作成し、リモートリポジトリにバインドします。
git init
git remote add origin https://github.com/withastro/docs.git
git pull origin main
変更をコミットしてリモートリポジトリにプッシュする#
git add .
git commit -m "現在のコミットのタイトル" //コミットの説明は非常に重要で、詳細は後述します。
git push -u origin main
git 規範化協調開発#
ブランチ管理#
多くの学生が最初に git を学ぶと、main ブランチで直接開発を行うことがありますが、これにより多くの問題が発生します。一般的に、main ブランチは生産ブランチであり、このブランチは安定して信頼できることを保証する必要があります。main ブランチで開発およびテストを行うと、バグが発生した場合、ユーザーが感知できる生産事故となります。協調開発では、少なくとも各自が自分の開発ブランチを持つべきであり、これによりコードの衝突リスクを効果的に回避できます。しかし、最良の方法は、要件を粒度として、要件ブランチを作成し、開発およびテストが完了した後に生産ブランチにマージすることです。以下に、image コンポーネントを開発するためのブランチを作成する例を示します。
git checkout -b feat-image-component
// コンポーネント開発を完了
git status //作業領域の変更されたファイルを確認し、要件外の変更を避ける
git add . //コードをステージングエリアに追加
git commit -m "feat: image component"
git log --oneline //ローカルリポジトリのコミット履歴を確認
git push -u origin feat-image-component
// コンポーネントが要件を満たしていることを確認した後、生産ブランチにマージ
// mainブランチとオンラインリポジトリを一致させる
git checkout main
git pull
git checkout feat-image-component (現在のブランチ:feat-image-component)
git rebase main //リベース、コミット履歴をクリーンに保つ
// ブランチをマージ
git checkout main
git merge feat-image-component
これが要件開発の正常なプロセスです。このプロセスを通じて、開発の効率を保証し、コードの衝突やオンラインバグを最大限に回避できます。ある学生は、コミット時に前置詞「feat」があることに気づくかもしれませんが、これは何を意味するのでしょうか?それについては git の規範について話す必要があります。
git merge と git rebase の違い#
https://joyohub.com/2020/04/06/git-rebase/
commit message 規範#
規範は非常に重要です。commit message の規範化は、コードリポジトリの堅牢性と保守性を向上させます。一般的に使用される規範は、Google が提案したAngular規範です。上記で使用しているのも Angular 規範であり、feat は新機能を表します。多くのオープンソースプロジェクトが Angular 規範を使用していることがわかります。
以下は一般的な前置詞のいくつかです。
echo ""
echo "feat 新機能(feature)"
echo "fix バグ修正"
echo "docs ドキュメント(追加または修正)"
echo "style フォーマット(コードの実行に影響しない変更)"
echo "refactor リファクタリング(新機能でもバグ修正でもないコードの変更)"
echo "perf パフォーマンス最適化"
echo "test テストの追加"
echo "chore ビルドプロセスまたは補助ツールの変更"
echo ""
小技#
- git rebase -i
- git cherry-pick
- git worktree
- git stash
- git commit --amend
git よく使う構文#
- git config --global user.name "あなたの名前" すべての Git リポジトリにあなたの名前をバインドします。
- git config --global user.email "あなたのメール" すべての Git リポジトリにあなたのメールをバインドします。
- git init リポジトリを初期化します。
- git add . 作業領域のファイルをすべてステージングエリアに追加します。
- git add .// 作業領域のファイルをステージングエリアに追加します。
- git commit -m "xxx" ステージングエリアのすべてのファイルをリポジトリ領域にコミットします。ステージングエリアは空になります。
- git remote add origin https://github.com/name/name_cangku.git ローカルリポジトリとリモートリポジトリを接続します。
- git push -u origin master リポジトリ領域の主ブランチ master をリモートリポジトリに送信します。
- git push -u origin <他のブランチ> 他のブランチをリモートリポジトリに送信します。
- git status 現在のリポジトリの状態を確認します。
- git diff ファイルの変更内容を確認します。
- git log 最近から最も古いコミット履歴を表示します。
- git clone + リポジトリアドレスでファイルをダウンロードしてクローンします。
- git reset --hard + バージョン番号 バージョンを戻します。バージョン番号はコミット時に master と一緒に表示されます(--soft は変更を保持しコミットを取り消し、--hard は reset したコミットのすべての変更を失います)。
- git reflog コマンド履歴を表示します。
- git checkout -- コマンドを取り消し、リポジトリ内のファイルで作業領域のファイルを置き換えます。私はこれを Git の世界の ctrl + z のようだと思います。
- git rm リポジトリのファイルを削除します。
- git branch 現在のすべてのブランチを表示します。
- git branch <ブランチ名> ブランチを作成します。
- git checkout <ブランチ名> ブランチに切り替えます。
- git merge <ブランチ名> ブランチをマージします。
- git branch -d <ブランチ名> ブランチを削除します。マージされていないブランチは削除できない場合があります。
- git branch -D + <ブランチ名> 強制的に削除し、マージされていないブランチを破棄します。
- git log --graph ブランチのマージグラフを表示します。
- git log --oneline コミットの概要を表示します。
- git merge --no-ff <ブランチ名> ブランチをマージする際に Fast forward モードを無効にします。このモードではブランチの履歴情報が失われます。
- git stash 他のタスクが入ってきたときに、現在の作業現場を「保存」し、後で復元して作業を続けます。
- git stash list 最近「保存」した作業がどこに行ったかを確認します。
- git stash apply 復元するが stash 内容を削除しません。
- git stash drop stash 内容を削除します。
- git stash pop 復元しながら stash 内容も削除します。
- git remote リモートリポジトリの情報を表示します。origin が表示され、リモートリポジトリのデフォルト名は origin です。
- git remote -v より詳細な情報を表示します。
- git pull リモートリポジトリから最新のコミットを取得し、ローカルでマージします。git push とは反対です。
- git rebase 分岐したコミット履歴を「整理」して一本の直線にします。見た目がより直感的になります(開発中は通常 rebase を使用し、直接 merge を使用しません)。
- git tag すべてのタグを表示し、履歴バージョンのタグを確認します。
- git tag タグを付けます。デフォルトは HEAD です。例えば git tag v1.0。
- git tag <バージョン番号> バージョン番号にタグを付けます。バージョン番号はコミット時に隣に表示される一連の文字と数字です。
- git show タグ情報を表示します。
- git tag -a -m "<説明>" 説明付きのタグを作成します。-a はタグ名を指定し、-m は説明文を指定します。
- git tag -d タグを削除します。
- git push origin 特定のタグをリモートにプッシュします。
- git push origin --tags 一度にすべての未プッシュのローカルタグをリモートにプッシュします。
- git push origin /tags/ リモートタグを削除します。
- git config --global color.ui true Git に色を表示させ、コマンド出力をより目立たせます。
- git add -f 除外されたファイルを強制的にコミットします。
- git check-ignore -v なぜ Git がそのファイルを無視するのかを確認します。
- git cherry-pick <commit hash 値>
- git worktree 新しい作業領域を作成し、ローカルで複数のブランチのリポジトリを同時に開発できます(ローカルリポジトリのコピーを作成できます)。