#Git チュートリアル
###はじめに
ちょっとした歴史、気に入らない方はこちらをクリックしてスキップ
2002 年までに、Linux システムは 10 年発展し、コードベースの巨大さにより Linus は手動での管理が困難になりました。コミュニティの開発者たちもこの方法に強い不満を表明しました。そこで Linus は商用のバージョン管理システム BitKeeper を選択しました。BitKeeper の親会社 BitMover 社は人道的精神から、Linux コミュニティにこのバージョン管理システムを無料で使用する権利を授与しました。
2005 年にこの安定した状況は破られました。Linux コミュニティには達人が集まっており、どうしても梁山泊の好漢たちの江湖気質を帯びていました。Samba を開発した Andrew が BitKeeper のプロトコルをクラックしようとし(実際に彼だけでなく他にもいました)、BitMover 社に発見されました(監視作業が素晴らしかった!)。そこで BitMover 社は怒り、Linux コミュニティの無料使用権を回収すると宣言しました。
Linus は BitMover 社に謝罪し、今後兄弟たちを厳しく管理すると約束するかもしれません。ええ、それはありえません。実際の状況は以下の通りです:
Linus は 2 週間かけて C 言語で分散型バージョン管理システムを自分で書きました。これが Git です!1 ヶ月以内に、Linux システムのソースコードは Git によって管理されるようになりました!牛とはどのように定義されるのでしょうか?皆さんも味わってみてください。
Git は急速に最も人気のある分散型バージョン管理システムとなりました。特に 2008 年、GitHub ウェブサイトがオンラインになり、オープンソースプロジェクトに Git ストレージを無料で提供しました。無数のオープンソースプロジェクトが GitHub に移行し始めました。jQuery、PHP、Ruby などを含みます。
###1.vim で中文が文字化け
コマンドラインで直接 vim を使用して編集すると、漢字の文字化けが発生します。また、QQ 拼音入力法を使用して vim 内で一部の漢字を入力できません。例えば、中 wen の wen、还有 wu 法の wu が 1 になります utf8 文字化け問題はまだ解決していません(見つけた解決策はすべて突破できませんでした)。vim で直接編集しないことをお勧めします
###2.MINGW32 はデフォルトでコピーペーストをサポートしていません。手動設定が必要です
-
タイトルバーを右クリックし、【プロパティ】を選択
-
【オプション】を選択
-
【クイック編集モード Q】にチェック
-
【OK】-【OK】
設定はすぐに有効になり、コピー/ペーストをサポートします:
-
コピー:左ボタンでドラッグして選択し、右クリックするとコピー完了
-
ペースト:ウィンドウ内で右クリック
ご質問がある場合はChinaUnix ブログ:windows 下の mingw のコピーペースト をご覧ください
##一.git のインストール
Windows/Mac/Linux での git のインストール方法は廖雪峰的官方网站:Git のインストール をご覧ください
P.S. 廖雪峰先輩の git チュートリアルは非常に優れていますが、あなたはきっと最初から最後まで見る耐心はありません。でも大丈夫です。なぜなら私は見ましたから。できるだけ無駄なくまとめます
##二.ローカル操作
###1.リポジトリの作成
- 気に入ったフォルダを見つけて、
cdで移動し、その中でリポジトリ(Repository)を作成します
P.S. git コマンドラインツールは実際には簡易版 Linux 仮想マシンであり、Shell コマンドをサポートしています。Linux コマンドをいくつか覚えていれば、より使いやすくなります。一般的な Shell コマンドは博客园:一般的なファイルとディレクトリ操作コマンド (転載) をご覧ください
- Git リポジトリを初期化します。
git initコマンドを使用します
現在のディレクトリを git リポジトリとして初期化できます。実際にはディレクトリ下に git 管理情報を自動生成するだけです
- ファイルの新建
そのディレクトリ下にファイルを新建します。コマンドラインの touch またはエクスプローラーで右クリックして作成することもできます
-
ファイルを Git リポジトリに追加します。2 つのステップがあります:
-
git add <file>コマンドを使用してファイルを一時的な保存領域に追加します。注意:複数回使用して複数のファイルを追加できます; -
git commitコマンドを使用して一時的な保存領域の変更をコミットします。完了。
-
P.S. フォルダ下に作成したファイルやファイル内容の追加削除変更は、同期クラウドディスクのように自動同期されません。add-commit して初めて新しいバージョンを作成します
###2.日常業務
- ステータスの確認
ワークスペースのステータスを常に把握するには、git status コマンドを使用します。
git status がファイルが変更されたと通知した場合、git diff を使用して変更内容を確認できます。
- バージョンの後退と前進
HEAD が指すバージョンが現在のバージョンです。したがって、Git はバージョンの歴史間を移動することを許可します。git reset --hard commit_id コマンドを使用します。
移動する前に、git log を使用してコミット履歴を確認し、どのバージョンに後退するかを決定します。
未来に戻るには、git reflog を使用してコマンド履歴を確認し、どのバージョンに戻るかを決定します。
-
変更の取り消し
-
シナリオ 1:ワークスペースの某个ファイルの内容を混乱させて変更し、ワークスペースの変更を直接破棄したい場合、
git checkout -- fileコマンドを使用します。 -
シナリオ 2:ワークスペースの某个ファイルの内容を混乱させただけでなく、一時的な保存領域に追加した場合、変更を破棄するには 2 つのステップが必要です。最初のステップで
git reset HEAD fileコマンドを使用すると、シナリオ 1 に戻ります。2 番目のステップでシナリオ 1 のように操作します。 -
シナリオ 3:不適切な変更をリポジトリにコミットしてしまった場合、このコミットを取り消したい場合は、バージョン後退のセクションを参照してください。ただし、リモートリポジトリにプッシュしていないことが前提です。
-
-
ファイルの削除
git rm コマンドはファイルを削除するために使用されます。ファイルがすでにリポジトリにコミットされている場合、誤って削除することを心配する必要はありません。ただし注意が必要です。ファイルを最新バージョンにしか復元できず、最後のコミット後に変更した内容は失われます。
- ブランチの操作
実際の開発では、いくつかの基本的な原則に従ってブランチ管理を行うべきです:
まず、master ブランチは非常に安定しているべきです。つまり、新しいバージョンのリリースにのみ使用され、普段はそこで作業してはいけません;
ではどこで作業するのか?作業はすべて dev ブランチで行います。つまり、dev ブランチは安定していません。ある時点で、例えば 1.0 バージョンのリリース時に、dev ブランチを master にマージし、master ブランチで 1.0 バージョンをリリースします;
あなたとあなたの仲間たちは皆 dev ブランチで作業し、それぞれが自分のブランチを持ち、時々 dev ブランチにマージするだけです。
ブランチをマージする際、--no-ff パラメータを追加すると通常モードでマージできます。マージ後の履歴にはブランチがあり、かつてマージを行ったことがわかります。fast forward マージではかつてマージを行ったことがわかりません。例:git merge --no-ff -m "merge with no-ff" dev
具体的なコマンド:
- ブランチの確認:`git branch`
- ブランチの作成:`git branch <name>`
- ブランチの切り替え:`git checkout <name>`
- ブランチの作成 + 切り替え:`git checkout -b <name>`
- 某ブランチを現在のブランチにマージ:`git merge <name>`
- ブランチの削除:`git branch -d <name>`
Git が自動的にブランチをマージできない場合、競合を解決する必要があります。競合を解決した後、コミットすると、マージが完了します。
Git は <<<<<<<、=======、>>>>>>> で異なるブランチの内容をマークします。手動で変更して競合を解消した後、add-commit すればよいです
git log --graph コマンドを使用すると、ブランチのマージ図を確認できます
- バグの処理
バグを修正する際、新しい bug ブランチを作成して修正し、その後マージし、最後に削除します;
手元の作業が完了していない場合、まず作業現場を git stash して、その後バグを修正し、修正後、git stash pop して作業現場に戻ります。
- 新機能の開発
新しい feature を開発する際、新しいブランチを作成するのが最善です;
マージされていないブランチを破棄したい場合、git branch -D <name> を使用して強制的に削除できます。
###3.人間的な設定オプション
- 特殊ファイルの無視
一部のファイルを無視する際、.gitignore を作成する必要があります;
.gitignore ファイル自体はリポジトリに配置し、.gitignore のバージョン管理もできます
- コマンドエイリアスの設定
一般的に受け入れられているエイリアス(マクロのようなもので、指を保護するために使用):
- st は status を表します。コマンド `git config --global alias.st status`
- co で checkout を表します。コマンド `git config --global alias.co checkout`
- ci は commit を表します。コマンド `git config --global alias.ci commit`
- br は branch を表します。コマンド `git config --global alias.br branch`
3. エイリアスの削除
各リポジトリの Git 設定ファイルは .git/config ファイルにあり、エイリアスは [alias] の後ろにあります。エイリアスを削除するには、対応する行を削除するだけです
グローバル Git 設定ファイルは ~/gitconfig ファイルにあり、直接編集できます
- その他の設定オプション
カスタマイズできる部分は比較的多く、例えばコマンド出力結果のカラーリングスキーム(ファイル名のハイライトなど)
###4.git サーバーの構築
詳細な手順は廖雪峰的官方网站:Git サーバーの構築 をご覧ください
##三.リモート操作
リモート操作とは、ローカルプロジェクトと GitHub 上のプロジェクトを定期的に同期することを指します
###0.準備作業
GitHub アカウントの登録、リポジトリの作成、公開鍵の設定などが必要です。詳細は廖雪峰的官方网站:リモートリポジトリの追加 をご覧ください
###1.リモートリポジトリの関連付け
リモートリポジトリを関連付けるには、git remote add origin git@server-name:path/repo-name.git コマンドを使用します;
関連付け後、git push -u origin master コマンドを使用して初めて master ブランチのすべての内容をプッシュします;
その後、ローカルでコミットするたびに、必要であれば git push origin master コマンドを使用して最新の変更をプッシュできます;
分散型バージョン管理システムの最大の利点の 1 つは、ローカルでの作業がリモートリポジトリの存在を完全に考慮する必要がないことです。つまり、ネットワーク接続の有無にかかわらず正常に作業できます。SVN はネットワーク接続がない場合、作業を拒否します!ネットワークがある場合、ローカルコミットをプッシュするだけで同期が完了します。本当に便利です!
###2.リモートリポジトリのクローン
リポジトリをクローンするには、まずリポジトリのアドレスを知る必要があり、その後 git clone コマンドを使用してクローンします。
Git は複数のプロトコルをサポートしています。https を含みますが、ssh を通じたネイティブ git プロトコルが最も高速です。
###3.複数人での協力
リモートリポジトリの情報を確認するには、git remote -v を使用します;
ローカルで新規作成したブランチは、リモートにプッシュしない場合、他の人には表示されません;
ブランチをローカルからプッシュするには、git push origin branch-name を使用します。プッシュに失敗した場合、まず git pull を使用してリモートの新しいコミットを取得します;
ローカルブランチとリモートブランチに対応するブランチを作成するには、git checkout -b branch-name origin/branch-name を使用します。ローカルとリモートブランチの名前は一致させるのが最善です;
ローカルブランチとリモートブランチの関連付けを設定するには、git branch --set-upstream branch-name origin/branch-name を使用します;
リモートからブランチを取得するには、git pull を使用します。競合がある場合、まず競合を処理する必要があります。
###4.タグの使用
タグはリポジトリのスナップショットであり、一般的に新しいバージョンのリリース前に現在のバージョンをマークするために使用されます
- タグの作成
git tag <name> コマンドは新しいタグを作成するために使用されます。デフォルトは HEAD です。commit id を指定することもできます;
git tag -a <tagname> -m "blablabla..." はタグ情報を指定できます;
git tag -s <tagname> -m "blablabla..." は PGP 署名タグを使用できます;
git tag コマンドはすべてのタグを確認できます。
- タグの操作
git push origin <tagname> コマンドはローカルタグをプッシュできます;
git push origin --tags コマンドはすべての未プッシュのローカルタグをプッシュできます;
git tag -d <tagname> コマンドはローカルタグを削除できます;
git push origin :refs/tags/<tagname> コマンドはリモートタグを削除できます。
###5.GitHub での fork
P.S. fork は Linux の Shell コマンド fork から取られたもので(現在のプロセスを複製し、得られた子プロセスは親プロセスに影響されない)、他人のプロジェクトリポジトリを自分の GitHub に転送するために使用されます。その後、相互に独立します
GitHub では、任意のオープンソースリポジトリを Fork できます;
Fork 後のリポジトリの読み書き権限を所有します;
公式リポジトリに pull request をプッシュしてコードを貢献できます。
###6.一般的なリモート操作
-
リモートプロジェクトの取得
git clone git@github.com:ayqy/git-helloworld.git。現在のディレクトリ下にプロジェクトフォルダが作成されます -
オンライン修正、
git pull origin masterを通じてローカルに取得します -
ローカル修正、
git push -u origin masterを通じてアップロードして同期します(まず add-commit する必要があることに注意してください)
##四.一般的なコマンド
-
mkdir:XX(空のディレクトリ XX を作成します。XX はディレクトリ名を指します) -
pwd:現在のディレクトリのパスを表示します。 -
cat XX:XX ファイルの内容を確認します -
git init:現在のディレクトリを管理可能な git リポジトリに変換し、隠し.git ファイルを生成します。 -
git add XX:xx ファイルを一時的な保存領域に追加します。 -
git commit –m "XX":ファイルをコミットします –m の後ろは注釈です。 -
git status:リポジトリのステータスを確認します -
git diff XX:XX ファイルがどの内容を変更したかを確認します -
git log:履歴記録を確認します -
git reset--hard HEAD^ または git reset --hard HEAD~:1 つ前のバージョンに後退しますP.S. 100 バージョン前に後退したい場合、git reset --hard HEAD~100 を使用します
-
git reflog:履歴記録のバージョン id を確認します -
git checkout -- XX:XX ファイルのワークスペースの変更をすべて取り消します。 -
git rm XX:XX ファイルを削除します -
git remote add origin https://github.com/ayqy/test.git:リモートリポジトリを関連付けます -
git push –u(初めては-u が必要、以降は不要) origin master:現在の master ブランチをリモートリポジトリにプッシュします -
git clone https://github.com/ayqy/test.git:リモートリポジトリからクローンします -
git checkout –b dev:dev ブランチを作成し、dev ブランチに切り替えます -
git branch:現在すべてのブランチを確認します -
git checkout master:master ブランチに切り替えます -
git merge dev:現在のブランチ上で dev ブランチをマージします -
git branch –d dev:dev ブランチを削除します -
git branch name:ブランチを作成します -
git stash:現在の作業を隠し、後で現場を回復して継続して作業します -
git stash list:隠されたすべてのファイルリストを確認します -
git stash apply:隠されたファイルを回復しますが、内容は削除しません -
git stash drop:ファイルを削除します -
git stash pop:ファイルを回復すると同時に、ファイルも削除します -
git remote:リモートリポジトリの情報を確認します -
git remote –v:リモートリポジトリの詳細情報を確認します -
git push origin master:Git は master ブランチをリモートリポジトリに対応するリモートブランチにプッシュします -
git push origin :branch-name:コロン前のスペースを減らしてはいけません。原理は空のブランチを server 上に push することで、そのブランチを削除するのと同じです -
git push --force origin master:バージョンを後退する際に、ローカルの旧バージョンで最新バージョンを上書きしたい場合に使用します。新バージョンの log 記録を削除し、痕跡を残しません
##五.コマンド大全
###1.CREATE
-
既存のリポジトリをクローン
git clone ssh://user@domain.com/repo.git -
新しいローカルリポジトリを作成
git init
###2.LOCAL CHANGES
-
ワークキングディレクトリの変更されたファイル
git status -
追跡ファイルの変更
git diff -
すべての現在の次のコミットに追加
git add . -
の一部の変更を次のコミットに追加
git add -p <file> -
追跡ファイルのすべてのローカル変更をコミット
git commit -a -
以前にステージングされた変更をコミット
git commit -
最後のコミットを変更 公開されたコミットを修正しないでください!
git commit --amend
###3.COMMIT HISTORY
-
最新から始まるすべてのコミットを表示
git log -
特定のファイルの時間経過による変更を表示
git log -p <file> -
で誰がいつ何を変更したか
git blame <file>
###4.BRANCHES & TAGS
-
すべての既存のブランチをリスト
git branch -av -
HEAD ブランチを切り替え
git checkout <branch> -
現在の HEAD に基づいて新しいブランチを作成
git branch <new-branch> -
リモートブランチに基づいて新しい追跡ブランチを作成
git checkout --track <remote/branch> -
ローカルブランチを削除
git branch -d <branch> -
現在のコミットにタグをマーク
git tag <tag-name>
###5.UPDATE & PUBLISH
-
現在設定されているすべてのリモートをリスト
git remote -v -
リモートに関する情報を表示
git remote show <remote> -
という名前の新しいリモートリポジトリを追加
git remote add <shortname> <url> -
からすべての変更をダウンロードしますが、HEAD に統合しない
git fetch <remote> -
変更をダウンロードし、直接 HEAD にマージ/統合
git pull <remote> <branch> -
リモート上のローカル変更を公開
git push <remote> <branch> -
リモートのブランチを削除
git branch -dr <remote/branch> -
タグを公開
git push --tags
###6.MERGE & REBASE
-
を現在の HEAD にマージ
git merge <branch> -
現在の HEAD を にリベース 公開されたコミットをリベースしないでください!
git rebase <branch> -
リベースを中止
git rebase --abort -
競合を解決した後、リベースを継続
git rebase --continue -
設定されたマージツールを使用して競合を解決
git mergetool -
エディタを使用して手動で競合を解決し、(解決後)ファイルを解決済みとしてマーク
git add <resolved-file>git rm <resolved-file>
###7.UNDO
-
ワークキングディレクトリのすべてのローカル変更を破棄
git reset --hard HEAD -
特定のファイルのローカル変更を破棄
git checkout HEAD <file> -
コミットを元に戻す(反対の変更を持つ新しいコミットを生成することにより)
git revert <commit> -
HEAD ポインタを以前のコミットにリセット
…その後すべての変更を破棄:
git reset --hard <commit>…すべての変更を未ステージングの変更として保持:
git reset <commit>…コミットされていないローカル変更を保持:
git reset --keep <commit>
###参考資料
コメントはまだありません