Gitはオープンソースの分散バージョン管理システムです。集中型バージョン管理システム(SVNなど)との最大の違いは、各開発者がローカルリポジトリを持ち、リモートコードリポジトリに依存せずにコードをローカルに送信できることです。
gitがプロジェクトの完全なスナップショット(完全なプロジェクトコード)を保存するたびに、必要なハードディスクスペースは比較的大きくなります(Gitチームはコードを極端に圧縮しており、実際に必要なスペースはsvnをはるかに超えていません。しかし、Gitロールバック速度は非常に高速です)。
gitのすべての送信は、増分ではなくスナップショットです。プロジェクトのバージョンは送信オブジェクトであり、プロジェクトのスナップショットはツリーオブジェクトです。バージョンをロールバックしたり、バージョンを切り替えたりする場合は、ハッシュを見つけてください。提出オブジェクトの。
リモートウェアハウスを作成する
- 通常、プロジェクトはリモートコードウェアハウスを作成する必要があります。GitHub、GitLab、その他のコードホスティングプラットフォームを使用することも、GitLab、Gitblitなどを使用してコードサーバーをデプロイすることもできます。
- リモートの空のウェアハウスを作成するときは、README、.gitignore、またはライセンスを追加しないでください。後続のプロジェクトを追加する必要があります。これらのファイルは最初はローカルコードに存在しないため、リモートウェアハウスが空のウェアハウスではなく、さらにいくつかのファイルがある場合、ローカルコードはプッシュされません。
- Android Studioでは、濃い赤のファイルはgitによって追跡されていないことを示し、黒のファイルはgitによって無視されるファイルを示し、緑のファイルはgitによって追跡されていることを示します。
- Git管理コードは、作業領域、一時ストレージ領域、バージョンライブラリの3つの領域に分かれています。コードを書き込む領域は作業領域に属します。記述後、作成したファイルまたは変更したコードを一時ストレージ領域に追加する必要があります。 (git add)、そしてリポジトリに送信する前。
- git addコマンドを使用すると、以前は暗赤色だったファイルが緑色に変わり、これらのファイルがgitによって追跡され、一時ストレージ領域に追加されたことを示します。
- git commitコマンドは、コードをローカルウェアハウスに送信することを意味し、git pushコマンドは、ローカルウェアハウス内のコードをリモートブランチにプッシュすることを意味します。送信後、ファイルは黒に戻りました。
ブランチ
ブランチは1つずつコミットすることで時系列に接続され、ブランチは平行線のようになります。2つのブランチがマージされた場合にのみ、クロスオーバーが発生します。Gitリポジトリを作成する場合、デフォルトで作成されるブランチはマスターブランチマスターブランチです。初めてプッシュするときは、実際にローカルマスターブランチをリモートコードウェアハウスにプッシュします。このとき、リモートコードウェアハウスにもオリジン/マスターと呼ばれるブランチ。
注:ブランチを作成すると、新しいブランチはローカルウェアハウスでのみ使用できます。ブランチをリモートコードウェアハウスに保存する必要がある場合は、gitpushコマンドを実行する必要があります。
同様に、ローカルマスターブランチを削除しても、リモートマスターブランチは削除されません。リモートマスターブランチを削除しても、ローカルマスターブランチは削除されません。
Android Studioでは、ローカルブランチとリモートブランチは「ローカルブランチ」と「リモートブランチ」で区別できます。ロゴはAndroidStudioの右下にあります。
フェッチ
フェッチは、現在のブランチに対応するリモートブランチの最新のコミットレコードを取得することです。これは、リモートブランチの更新を同期することとして簡単に理解できます。対応するコマンドはgitfetchです。
引く
現在のローカルブランチに対応するリモートブランチの更新を取得し、これらの更新をローカルブランチにマージします。ローカルブランチは実際にフェッチされてからマージされます。対応するコマンドはgitpullです。
リベース
実際の作業では、通常、ローカルマスターブランチにはさらにいくつかの送信があり、オリジン/マスターブランチにはありません。また、オリジン/マスターブランチには、ローカルマスターブランチにはない他の開発者の送信もあります。この場合、リモートに直接プッシュすることはできませんウェアハウスでは、リモートブランチのコミットを最初にマージしてから、リモートブランチにプッシュする必要があります。または、リベースを使用します。リモートブランチの最新のコミットを開始点として取得し、ローカルブランチの新しいコミットを後ろに追加します。リベース後に送信されるレコードは直線です。
注:リベースをできるだけ少なくし、さらにマージします
隠し場所
このような状況は開発中に発生する可能性があります。ブランチで開発中です。この時点で、バグを修正するために突然別のブランチに切り替えるタスクを受け取りましたが、現在のブランチの開発がうまく行われていないため、できません。ブランチを強制的に切り替えると、変更は失われます。このとき、git stashコマンドを使用する必要があります。他のタスクが処理されて元に戻ると、以前に保存した変更を適用できます(前のブランチに戻るときは、コマンドgit unstashを使用してください)。
セレクション(チェリーピック)
特定のブランチの変更を新しいコミットとして現在のブランチに適用します。コマンドgitcherry-pickを使用します。
頭を動かす
HEADは、特定のコミットの特定のブランチを指します。ここで、はHEADです。AndroidStudioに表示されるコードは、特定のコミットのコード状態です。Android Studioで以前の送信に移動する場合は、移動する送信レコードを選択し、マウスを右クリックして、ポップアップメニューオプションで[チェックアウトリビジョン]を選択します。
Gitの初期構成
初めてgitを使用するときは、最初にGitの作業環境を構成する必要があります。構成は1回だけ行う必要があり、現在の構成は将来のアップグレードで使用されます。もちろん、必要に応じて、同じコマンドで既存の構成をいつでも変更できます。
Gitは、対応する作業環境変数を構成または読み取るためのgit configというコマンドを提供します。これらの環境変数が、各リンクでのGitの特定の作業方法と動作を決定します。これらの変数は、次の3つの異なる場所に保存できます。
- / etc / gitconfigファイル:システム内のすべてのユーザーに普遍的に適用できる構成。git configを使用するときに--systemオプションを使用すると、このファイルの読み取りと書き込みが行われます。このファイルはgitのダウンロードディレクトリにあります。
- 〜/ .gitconfigファイル:ユーザーディレクトリ内の構成ファイルは、ユーザーにのみ適用されます。git configを使用するときに--globalオプションを使用すると、このファイルの読み取りと書き込みが行われます。ファイルはcドライブのユーザーディレクトリにあります。
- .git / configファイル:現在のプロジェクトのGitディレクトリにある構成ファイル(つまり、作業ディレクトリにある.git / configファイル)。ここでの構成は、現在のプロジェクトにのみ有効です。
Windowsシステムを例にとると、Windowsシステムのシングルユーザーマルチプロセスシステムです。〜 / .gitconfigファイルは現在のユーザーでのみ有効です。ユーザーを切り替えると、ファイルは使用できなくなります。/etc / gitconfigファイルはWindows用です作成されたすべてのユーザーが有効です。
注:各レベルの構成は、上位レベルの同じ構成をカバーします。
ユーザー情報
最初に構成するのは、個人のユーザー名と電子メールアドレスです。これらの2つの構成は非常に重要です
。Gitが送信されるたびに、更新を送信したユーザーを示すためにこれら2つの情報が引用されるため、更新とともに履歴レコードに永続的に含まれます。$ git config --global user .name“ xxx”
$ git config --global user.email [email protected]
既存の構成情報を確認するには、git config--listコマンドを使用します。構成情報を削除します。gitconfig--global--unset user 。Eメール
.gitディレクトリ
ファイル名 | 効果 |
---|---|
フック | ディレクトリには、クライアントまたはサーバーのフックスクリプトが含まれています |
情報 | .gitignoreファイルに類似したグローバル除外ファイルが含まれています。ファイルに書き込まれたファイルは、gitバージョン管理に含まれません。 |
ログ | ログ情報を保存します。gitlogコマンドはディレクトリ内のログ情報を読み取ります |
オブジェクト | gitデータベースのように、すべてのデータコンテンツを格納するリポジトリ |
refs | データのコミットオブジェクトへのポインタを格納します(つまり、ブランチ) |
設定 | このファイルには、プロジェクト固有の構成オプションが含まれています |
説明 | 倉庫の説明情報を表示します |
頭 | 現在のブランチを示します |
インデックス | git addコマンドを使用して、ファイルに情報を保存します。インデックスに同じファイル名がある場合、ファイルは上書きされます。 |
gitの3つの主要なオブジェクト
Gitのコア部分は、単純なKey-Valueデータベースです。任意のタイプのコンテンツをデータベースに挿入でき、コンテンツをいつでも取得できるキー値(ハッシュ値)を返します。
- gitオブジェクト
開発者はファイルが変更されるたびにgitオブジェクトを生成します。したがって、プロジェクトのバージョンは複数のファイルを変更する可能性があり、ツリーオブジェクトはプロジェクトのバージョンを表すことができるため、gitオブジェクトはプロジェクトのバージョンを表すことができません。 。
向数据库写入内容 并返回对应键值
命令:
echo 'test content' | git hash-object -w --stdin
-w 选项指示 hash-object 命令存储数据对象;若不指定此选项,则该命令仅返回对应的键值
--stdin(standard input)选项则指示该命令从标准输入读取内容;
若不指定此选项,则须在命令尾部给出待存储文件的路径
git hash-object -w 文件路径 存文件
git hash-object 文件路径 返回对应文件的键值 d670460b4b4aece5915caf5c68d12f560a9fe3e4
返回:
该命令输出一个长度为 40 个字符的校验和。 这是一个 SHA-1 哈希值
查看 Git 是如何存储数据的
命令:
find .git/objects -type f
返回:
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4
这就是开始时 Git 存储内容的方式:一个文件对应一条内容。校验和的前两个字符用于命名子目录,余下的 38 个字符则用作文件名。
git cat-file -p hash: 拿对应对象的内容
git cat-file -t hash: 拿对应对象的类型
注:現在の操作はすべてローカル・データベースで操作されており、作業域内のバージョン・ライブラリーと直接対話しており、一時記憶域は含まれていません。上記の操作により、ファイル名ではなく、ファイルの内容のみを保存しました。
- ツリーオブジェクト
ツリーオブジェクト(ツリーオブジェクト)。ファイル名の保存の問題を解決でき、複数のファイルをまとめて整理することもできます。Gitは、UNIXファイルシステムと同様の方法でコンテンツを保存します。すべてのコンテンツはツリーオブジェクトとデータオブジェクト(gitオブジェクト)の形式で保存されます。ツリーオブジェクトはUNIXのディレクトリアイテムに対応し、データオブジェクト(gitオブジェクト)はおおよそファイルコンテンツに対応します。ツリーオブジェクトには、1つ以上のレコードが含まれます(各レコードには、gitオブジェクトまたはサブツリーオブジェクトへのSHA-1ポインターと、対応するモード、タイプ、およびファイル名の情報が含まれます)。ツリーオブジェクトには、別のツリーオブジェクトを含めることもできます。
操作
1. 利用 update-index 命令 为 test.txt 文件的首个版本——创建一个暂存区。并通过 write-tree 命令生成树对像。
命令:
git update-index --add --cacheinfo 100644 83baae61804e65cc73a7201a7252750c76066a30 test.txt
git write-tree
文件模式为 100644,表明这是一个普通文件
100755,表示一个可执行文件;
120000,表示一个符号链接。
--add 选项:
因为此前该文件并不在暂存区中 首次需要—add
--cacheinfo 选项:
因为将要添加的文件位于 Git 数据库中,而不是位于当前目录下 所有需要—cacheinfo
2. 将第一个树对象加入第二个树对象,使其成为新的树对象
命令:
git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579(树对象的hash值)
git write-tree
read-tree 命令,可以把树对象读入暂存区
3.查看暂存区当前的样子
git ls-files -s
4.查看树对象
命令:
git cat-file -p master^{tree}(或者是树对象的 hash) master^{tree} 语法表示 master 分支上最新的提交所指向的树对象。
- オブジェクトを送信する
创建提交对象
echo 'first commit' | git commit-tree d8329f
返回:
fdf4fc3344e67ab068f836878b6c4951e3b15f3d
查看提交对象
git cat-file -p fdf4fc3
返回:
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
author Scott Chacon <[email protected]> 1243
committer Scott Chacon <[email protected]> 1243
first commit
注:git commit-treeは、送信オブジェクトを生成するだけでなく、対応するスナップショット(ツリーオブジェクト)をローカルライブラリに送信します
Git後悔薬
工作区
如何撤回自己在工作目录中的修改 : git checkout --filename
暂存区
如何何撤回自己的暂存 : git reset HEAD filename
版本库
如何撤回自己的提交(实际上提交对象是不会被删的): git commit --amend,本质是重新给用户一次机会改注释,并不是真正的后悔药
三部作をリセット
git reset --soft commithash ---> 用commithash的内容重置HEAD内容
git reset [--mixed] commithash ---> 用commithash的内容重置HEAD内容 重置暂存区
git reset --hard commithash ---> 用commithash的内容重置HEAD内容 重置暂存区 重置工作目录
git reset [--mixed] commithash filename --> 用commithash中filename的内容重置暂存区,不会重置HEAD内容
チェックアウトの深い理解
git checkout brancname 跟 git reset --hard commithash特别像
共同点
都需要重置 HEAD 暂存区 工作目录
区别
checkout对工作目录是安全的,意味着在工作区中新增文件时,如果没有加入到git中,该文件不会被删除
reset --hard是强制覆盖,没有纳入git管理的文件会被删除
checkout动HEAD时不会带着分支走而是切换分支
reset --hard时是带着分支走
checkout + 路径
git checkout commithash filename
重置暂存区
重置工作目录
git checkout -- filename
重置工作目录