Git は分散バージョン管理システムです (列ファミリー データベース Hbase に似ていると感じます。Hbase でセルが変更されるたびに、古いコンテンツが新しく変更されたコンテンツによって上書きされることはなく、古いコンテンツと新しいコンテンツを使用できます。異なる時点でのアクセス)、Git はドキュメントの状態をいつでも更新レコードとして保存できます。そのため、編集した文書を元の状態に戻すことができ、編集前後の内容の差分も表示することができます。
1. ローカル ライブラリの変更
追加したファイルを追加または変更するたびに、それをローカル データベースに保存する場合は、ファイルを送信する必要があります。送信後、データベースは最後の送信ステータスと現在のステータスの差分レコードを生成します。
次に、sample.txt ファイルを変更します。
hello world //原来的内容
hello world! //修改后的内容,对比第一次多了一个感叹号
次に、git status コマンドを使用してデータベースのステータスを確認します。
これは、sample.txt ファイルが変更されていることを示していますが、まだ送信されていません。cat コマンドを使用して変更前後のコンテンツを表示しないと、ファイルのどこが変更されたのかわかりません。この時点で、 git diff コマンドを使用して、何が変更されたかを確認できます。
現時点では、提出はまだ 2 つのステップに分かれています。最初にインデックスに提出し、次に提出します。最後に、ローカル ライブラリのステータスを確認します。
git add sample.tx
tgit stauts
git commit -m "add mark"
git status
次に、ローカル ライブラリのフォールバック
1. git ワークスペース、一時ストレージ領域、およびローカル ライブラリの基本概念
1.1 ワーキングエリア(ワーキングディレクトリ)
ワークスペースはローカル フォルダーです。たとえば、/Users/qianying/learngit の learngit フォルダーが私のワークスペースです。
sample.txt を変更する操作は、ワークスペースの下で実行されます。
1.2 一時記憶領域 (インデックスまたはステージ)
通常は .git ディレクトリ配下のインデックスファイル (.git/index) に格納されるため、一時的な格納領域をインデックス (index) と呼ぶことがあります。
コマンド git add sample.txt を使用して、ファイルをステージング領域に追加します。
1.3 ローカル ライブラリ (リポジトリ)
ワークスペースには隠しディレクトリ .git があります。これはワークスペースではなく、Git のローカル ライブラリと見なされます。
コマンド git commit -m "xxx" を使用して、一時ストレージ領域のコンテンツをローカル ライブラリに送信します。
1.4ヘッド
用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
HEAD相当于一个指向不同版本的指针。
2.回退操作
上面我们学会了如何修改文件,并提交到本地库。接下来我们利用git的特性,把修改过的文件恢复到以前的状态。
现在我们再对sample.txt文件进行一次修改,并提交到本地库。那么三个版本的内容为:
hello world //版本
1hello world! //版本2,对比版本1多了一个感叹号
hello worold!hello qy //版本3,对比版本2添加了'hello qy'语句
我们可以使用git log命令查看本地库的历史记录,添加选项--pretty=oneline可以使输出内容更简洁
每一个记录前面的一大串字符串就是commit id(版本号),我们可以通过版本号将文件恢复到任何一个以前的状态。
使用git reset命令可以实现这个目的,它有三种选项:
–-mixed 重置HEAD和暂存区,默认参数,即相当于不带任何参数的git reset,保留工作区
–-soft 重置 HEAD,保留暂存区(或索引区)和工作区,让仓库恢复到执行git commit之前的状态
–-hard 重置HEAD,暂存区和工作区
2.1--hard
这里还没彻底了解这三个参数的含义,先用--hard试一下:
git reset --hard HEAD^
cat sample.txt
git log
git status
此时本地库的没有需要提交的文件。
使用命令git log后发现版本3不见了,如果想再次回到版本3,而且此时终端也没有关闭,就可以往上翻找版本3的版本号,然后使用版本号回到版本3,这里我的版本3的版本号是:180dcab564e6ffb124156d4aae35ff68fcbd36da。当然,版本号不用写全,git会自动取查找,但是也不能写太少。
git reset --hard 180dc
cat sample.txt
git log --pretty=oneline
git status
sample.txt文件内容变成版本3的内容,对应重置工作区;本地库的状态显示提交了两次,暂存区没有要提交的文件,对应重置暂存区。
带有选项--hard的git reset会彻底回退到某个版本,本地的文件也会变为上一个版本的内容 ,文件不会变成未add状态。索引(暂存区)内容和工作目录内容都会变给定提交时的状态。
2.2--soft
我们现在再试试选项--soft:
git reset --soft HEAD^
cat sample.txt
git log --pretty=oneline
git status
sample.txt文件内容并没有变化,还是版本3,对应保留工作区;历史记录也没有版本3,本地库的状态显示sample.txt被改变,对应保留暂存区。
带有选项--soft的git reset仅仅回退了commit的信息,本地文件的修改内容没有变,文件变为未commit状态(如果想要提交,直接commit即可)。索引(暂存区)和工作目录的内容是不变的,在三个命令中对现有版本库状态改动最小。
2.3--mixed
我们先恢复三个版本的状态,然后使用git reset --mixed HEAD^命令回到上一个版本:
git commit -m "add hello qy"
cat sample.txt
git log --pretty=oneline
git reset --mixed HEAD^
cat sample.txt
git status
工作区的内容没变,对应保留工作区;本地库状态显示sample.txt文件未被添加到暂存区,对应重置暂存区。
不带参数或者带有参数--mixed的参数git reset命令会回退到add之前的状态,本地文件修改的内容没有变,但是文件变为未add状态(如果想要提交,就需要add和commit命令)。
三、总结
本地库的文件被修改后,需要使用add命令现将工作区的文件交到暂存区,然后commit命令提交到本地库。
想要查看两次版本的不同,可以使用git diff命令。
想要历史记录更加简洁,就使用git log --pretty=oneline命令。
工作区、暂存区、本地库和HEAD的基本概念。
使用git reset命令进行回退操作,分析比较了三种参数的区别。--mixed是默认选项,--soft是三种选项中对本地库修改最小的,--hard是三种选项中对本地库修改最大的。