国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Git 基本原理介紹

共 17648字,需瀏覽 36分鐘

 ·

2021-09-27 19:22

點(diǎn)擊上方 藍(lán)字關(guān)注我們




簡(jiǎn)單地說(shuō),Git 究竟是怎樣的一個(gè)系統(tǒng)呢?請(qǐng)注意接下來(lái)的內(nèi)容非常重要,若你理解了 Git 的思想和基本工作原理,用起來(lái)就會(huì)知其所以然,游刃有余。在學(xué)習(xí) Git 時(shí),請(qǐng)盡量理清你對(duì)其它版本管理系統(tǒng)已有的認(rèn)識(shí),如 CVS、Subversion 或 Perforce, 這樣能幫助你使用工具時(shí)避免發(fā)生混淆。盡管 Git 用起來(lái)與其它的版本控制系統(tǒng)非常相似, 但它在對(duì)信息的存儲(chǔ)和認(rèn)知方式上卻有很大差異,理解這些差異將有助于避免使用中的困惑。


Git 初始化代碼倉(cāng)庫(kù)

執(zhí)行完成了 git init 命令,究竟做了什么呢?

執(zhí)行完成如下命令之后,我們可以得到下圖所示的內(nèi)容,右側(cè)的就是 Git 為我們創(chuàng)建的代碼倉(cāng)庫(kù),其中包含了用于版本管理所需要的內(nèi)容。

# 左邊執(zhí)行
$ mkdir git-demo
cd git-demo && git init
$ rm -rf .git/hooks/*.sample

# 右邊執(zhí)行
$ watch -n 1 -d find .


我們這里可以一起看下生成的 .git 目錄的結(jié)構(gòu)如何:

? tree .git
.git
├── HEAD
├── config
├── description
├── hooks
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags


.git/config - 當(dāng)前代碼倉(cāng)庫(kù)本地的配置文件

  • 本地配置文件(.git/config)和全局配置文件(~/.gitconfig)

  • 通過(guò)執(zhí)行如下命令,可以將用戶(hù)配置記錄到本地代碼倉(cāng)庫(kù)的配置文件中去

  • git config user.name "demo"

  • git config user.email "[email protected]"


? cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true

[user]
    name = demo
    email = [email protected]
.git/objects - 當(dāng)前代碼倉(cāng)庫(kù)代碼的存儲(chǔ)位置

  • blob 類(lèi)型

  • commit 類(lèi)型

  • tree 類(lèi)型


# 均無(wú)內(nèi)容
? ll .git/objects
total 0
drwxr-xr-x  2 escape  staff    64B Nov 23 20:39 info
drwxr-xr-x  2 escape  staff    64B Nov 23 20:39 pack

? ll .git/objects/info
? ll .git/objects/pack


.git/info - 當(dāng)前倉(cāng)庫(kù)的排除等信息
? cat ./.git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

.git/hooks - 當(dāng)前代碼倉(cāng)庫(kù)默認(rèn)鉤子腳本

./.git/hooks/commit-msg.sample
./.git/hooks/pre-rebase.sample
./.git/hooks/pre-commit.sample
./.git/hooks/applypatch-msg.sample
./.git/hooks/fsmonitor-watchman.sample
./.git/hooks/pre-receive.sample
./.git/hooks/prepare-commit-msg.sample
./.git/hooks/post-update.sample
./.git/hooks/pre-merge-commit.sample
./.git/hooks/pre-applypatch.sample
./.git/hooks/pre-push.sample
./.git/hooks/update.sample


.git/HEAD - 當(dāng)前代碼倉(cāng)庫(kù)的分支指針

? cat .git/HEAD
ref: refs/heads/master


.git/refs - 當(dāng)前代碼倉(cāng)庫(kù)的頭指針

# 均無(wú)內(nèi)容
? ll .git/refs
total 0
drwxr-xr-x  2 escape  staff    64B Nov 23 20:39 heads
drwxr-xr-x  2 escape  staff    64B Nov 23 20:39 tags

? ll .git/refs/heads
? ll .git/refs/tags


.git/description - 當(dāng)前代碼倉(cāng)庫(kù)的描述信息

? cat .git/description
Unnamed repository; edit this file 'description' to name the repository.


add 之后發(fā)生了什么

執(zhí)行完成了 git add 命令,究竟做了什么呢?

執(zhí)行完成如下命令之后,我們可以得到下圖所示的內(nèi)容,我們發(fā)現(xiàn)右側(cè)新增了一個(gè)文件,但是 Git 目錄里面的內(nèi)容絲毫沒(méi)有變化。這是因?yàn)?,我們現(xiàn)在執(zhí)行的修改默認(rèn)是放在工作區(qū)的,而工作區(qū)里面的修改不歸 Git 目錄去管理。

而當(dāng)我們執(zhí)行 git status 命令的時(shí)候,Git 又可以識(shí)別出來(lái)現(xiàn)在工作區(qū)新增了一個(gè)文件,這里怎么做到的呢?—— 詳見(jiàn)[理解 blob 對(duì)象和 SHA1]部分

而當(dāng)我們執(zhí)行 git add 命令讓 Git 幫助我們管理文件的時(shí)候,發(fā)現(xiàn)右側(cè)新增了一個(gè)目錄和兩個(gè)文件,分別是 8d 目錄、index 和 0e41.. 文件。

# 左邊執(zhí)行
echo "hello git" > helle.txt
$ git status
$ git add hello.txt

# 右邊執(zhí)行
$ watch -n 1 -d find .


我們這里重點(diǎn)看下,生成的 8d 這個(gè)目錄以及下面的文件。而其名稱(chēng)的由來(lái)是因?yàn)?Git 對(duì)其進(jìn)行了一個(gè)叫做 SHA1 的 Hash 算法,用于將文件內(nèi)容或者字符串變成這么一串加密的字符。

# 查看 objects 的文件類(lèi)型
$ git cat-file -t 8d0e41
blob

# 查看 objects 的文件內(nèi)容
$ git cat-file -p 8d0e41
hello git

# 查看 objects 的文件大小
$ git cat-file -s 8d0e41
10

# 拼裝起來(lái)
blob 10\0hello git

現(xiàn)在我們就知道了,執(zhí)行 git add 命令將文件從工作區(qū)添加到暫存區(qū)里面,Git 會(huì)把幫助我們生成一些 Git 的對(duì)象,它存儲(chǔ)的是文件的內(nèi)容和文件類(lèi)型并不存儲(chǔ)文件名稱(chēng)。

為了驗(yàn)證我們上述的說(shuō)法,我們可以添加同樣的內(nèi)容到另一個(gè)文件,然后進(jìn)行提交,來(lái)觀察 .git 目錄的變化。我們發(fā)現(xiàn),右側(cè)的 objects 目錄并沒(méi)有新增目錄和文件。這就可以證明,blob 類(lèi)型的 object 只存儲(chǔ)的是文件的內(nèi)容,如果兩個(gè)文件的內(nèi)容一致的話(huà),則只需要存儲(chǔ)一個(gè) object 即可。

話(huà)說(shuō)這里 object 為什么沒(méi)有存儲(chǔ)文件名稱(chēng)呢?這里因?yàn)?SHA1 的 Hash 算法計(jì)算哈希的時(shí)候,本身就不包括文件名稱(chēng),所以取什么名稱(chēng)都是無(wú)所謂的。那問(wèn)題來(lái)了,就是文件名的信息都存儲(chǔ)到哪里去了呢?—— 詳見(jiàn)[理解 blob 對(duì)象和 SHA1]部分

# 左邊執(zhí)行
echo "hello git" > tmp.txt
$ git add tmp.txt

# 右邊執(zhí)行
$ watch -n 1 -d find .



理解 blob 對(duì)象和 SHA1

了解 Git 的 blob 對(duì)象和 SHA1 之前的關(guān)系和對(duì)應(yīng)計(jì)算!

Hash 算法是把任意長(zhǎng)度的輸入通過(guò)散列算法變化成固定長(zhǎng)度的輸出,根據(jù)算法的不同,生成的長(zhǎng)度也有所不同。

Hash 算法:

  • MD5 - 128bit - 不安全 - 文件校驗(yàn)

  • SHA1 - 160bit(40位) - 不安全 - Git 存儲(chǔ)

  • SHA256 - 256bit- 安全 - Docker 鏡像

  • SHA512 - 512bit - 安全


但是,當(dāng)我們使用工具對(duì)上述文件內(nèi)容進(jìn)行 SHA1 計(jì)算的時(shí)候,會(huì)發(fā)現(xiàn)并沒(méi)有我們?cè)?.git 目錄里面看到的那樣,這是為什么呢?

echo "hello git" | shasum
d6a96ae3b442218a91512b9e1c57b9578b487a0b  -

這里因?yàn)?Git 工具的計(jì)算方式,是使用類(lèi)型 長(zhǎng)度 \0 內(nèi)容的方式進(jìn)行計(jì)算的。這里,我們算了下文件內(nèi)容只有九位,但是這里是十位,這里因?yàn)閮?nèi)容里面有換行符的存在導(dǎo)致的。現(xiàn)在我們就可以使用 git cat-file 命令來(lái)拼裝 Git 工具存儲(chǔ)的完整內(nèi)容了。

? ls -lh hello.txt
-rw-r--r--  1 escape  staff    10B Nov 23 21:12 hello.txt

echo "blob 10\0hello git" | shasum
8d0e41234f24b6da002d962a26c2495ea16a425f  -

# 拼裝起來(lái)
blob 10\0hello git


當(dāng)我們使用 cat 命令來(lái)查看 object 對(duì)象里面的內(nèi)容的時(shí)候,發(fā)現(xiàn)看著像是一串亂碼。其實(shí)這是 Git 工具將文件的原始內(nèi)容進(jìn)行一個(gè)壓縮,然后再存儲(chǔ)到 object 對(duì)象里面。奇怪的是,我們發(fā)現(xiàn)壓縮之后的內(nèi)容反而比原始內(nèi)容還大!

這是因?yàn)槠溥M(jìn)行了壓縮,存儲(chǔ)了一些壓縮相關(guān)的信息。上例所示的比原始文件大,是因?yàn)槲覀儎?chuàng)建的內(nèi)容實(shí)在是太小了。當(dāng)我們常見(jiàn)一個(gè)比較大的文件時(shí),就會(huì)看到壓縮之后的文件大小遠(yuǎn)小于原始文件的。

? cat .git/objects/8d/0e41234f24b6da002d962a26c2495ea16a425f
xKOR04`HWH,6A%

? ls -lh .git/objects/8d/0e41234f24b6da002d962a26c2495ea16a425f
-r--r--r--  1 escape  staff    26B Nov 23 21:36 .git/objects/8d/0e41234f24b6da002d962a26c2495ea16a425f

? file .git/objects/8d/0e41234f24b6da002d962a26c2495ea16a425f
.git/objects/8d/0e41234f24b6da002d962a26c2495ea16a425f: VAX COFF executable not stripped - version 16694

其實(shí),我們這里也是可以通過(guò) Python 代碼來(lái)獲取二進(jìn)制 object 對(duì)象的內(nèi)容的。

import zlib

contents = open('0e41234f24b6da002d962a26c2495ea16a425f''rb').read()
zlib.decompress(contents)



聊聊工作區(qū)和暫存區(qū)

聊聊工作區(qū)和暫存區(qū),以及文件如何在工作區(qū)和緩存區(qū)之間同步的問(wèn)題。

之前的章節(jié)我們也聊到了,當(dāng)我們執(zhí)行 git status 命令的時(shí)候,Git 工具怎么知道我們有一個(gè)文件沒(méi)有追蹤,以及文件名的信息都存儲(chǔ)到哪里去了?

這一切的答案,都要從工作區(qū)和索引區(qū)講起。Git 根據(jù)其存儲(chǔ)的狀態(tài)不同,將對(duì)應(yīng)狀態(tài)的“空間”分為工作區(qū)、暫存區(qū)(也可稱(chēng)為索引區(qū))和版本區(qū)三類(lèi)。具體示例,可以參考下圖。

而更加深層次的理解,就要從執(zhí)行 git add 命令后生成相關(guān)的 object 對(duì)象,但是其存儲(chǔ)的是文件的類(lèi)容、大小和內(nèi)容,并不包含文件名稱(chēng)的信息。而文件名稱(chēng)相關(guān)的信息就包含在生成的 index 文件(索引文件)里面。

當(dāng)我們直接查看 index 文件里面的內(nèi)容,發(fā)現(xiàn)使我們無(wú)法理解的亂碼,但是通過(guò)基本的輸出,我們可以看到其文件名稱(chēng)。要想查看 index 文件的內(nèi)容,可以通過(guò) Git 提供的相關(guān)命令進(jìn)行查看。

# 左邊執(zhí)行
echo "file1" > file1.txt
$ git add file1.txt
$ cat .git/index

$ git ls-files     # 列出當(dāng)前暫存區(qū)的文件列表信息
$ git ls-files -s  # 列出當(dāng)前暫存區(qū)文件的詳細(xì)信息

# 右邊執(zhí)行
$ watch -n 1 -d tree .git


當(dāng)添加文件的時(shí)候,文件或目錄會(huì)從工作區(qū)流向暫存區(qū),加之一些其他操作,會(huì)導(dǎo)致工作區(qū)和暫存區(qū)是會(huì)有一定差別的。這就會(huì)導(dǎo)致,當(dāng)我們執(zhí)行 git status 的結(jié)果就是兩者的差別。

經(jīng)過(guò)如下操作,會(huì)使工作區(qū)和暫存區(qū)和的內(nèi)容不一致了,通過(guò)命令我們也是可以查看區(qū)別的。當(dāng)我們使用 add 命令將新文件添加到暫存區(qū)的時(shí)候,會(huì)發(fā)現(xiàn)這下就一致了。
# 左邊執(zhí)行
$ git status
echo "file2" > file2.txt
$ git ls-files -s
$ git status
$ git add file2.txt
$ git ls-files -s
$ git status

# 右邊執(zhí)行
$ watch -n 1 -d tree .git


如果我們這里去修改一個(gè)文件的話(huà),很顯然這個(gè)時(shí)候我們的工作區(qū)和暫存區(qū)又不一致了。當(dāng)我們使用命令去查看文件狀態(tài)的時(shí)候,發(fā)現(xiàn)一個(gè)文件被修改了,而 Git 是怎么知道的呢?咳咳,就是通過(guò)查找 index 文件的內(nèi)容,找到對(duì)應(yīng)文件名稱(chēng)以及其內(nèi)部引用的 object 對(duì)象,與工作區(qū)的文件內(nèi)容進(jìn)行對(duì)比而來(lái)的。

# 左邊執(zhí)行
$ git ls-files -s
echo "file.txt" > file1.txt
$ git status

# 右邊執(zhí)行
$ watch -n 1 -d tree .git


而這個(gè)時(shí)候,我們?cè)偈褂?git add 命令將其修改內(nèi)容保存至?xí)捍鎱^(qū)的話(huà),會(huì)發(fā)現(xiàn)對(duì)應(yīng)文件的 object 的 blob 對(duì)象的引用值發(fā)生改變了。這時(shí)可以發(fā)現(xiàn),objects 目錄下面有三個(gè)對(duì)象了,其中 file1.txt 占了兩個(gè),但是文件卻只有兩個(gè)。通過(guò)命令查看對(duì)應(yīng) blob 對(duì)象的內(nèi)容,發(fā)現(xiàn)各有不同。

# 左邊執(zhí)行
$ git ls-files -s
$ git add file1.txt
$ git ls-files -s

# 右邊執(zhí)行
$ watch -n 1 -d tree .git



理解 commit 提交原理

執(zhí)行完成了 git commit 命令,究竟做了什么呢?

Git 倉(cāng)庫(kù)中的提交記錄保存的是你的目錄下所有文件的快照,就像是把整個(gè)目錄復(fù)制,然后再粘貼一樣,但比復(fù)制粘貼優(yōu)雅許多!Git 希望提交記錄盡可能地輕量,因此在你每次進(jìn)行提交時(shí),它并不會(huì)盲目地復(fù)制整個(gè)目錄。條件允許的情況下,它會(huì)將當(dāng)前版本與倉(cāng)庫(kù)中的上一個(gè)版本進(jìn)行對(duì)比,并把所有的差異打包到一起作為一個(gè)提交記錄。Git 還保存了提交的歷史記錄。這也是為什么大多數(shù)提交記錄的上面都有父節(jié)點(diǎn)的原因。

當(dāng)我們使用 add 命令將工作區(qū)提交到暫存區(qū),而暫存區(qū)其實(shí)保存的是當(dāng)前文件的一個(gè)狀態(tài),其中包括有哪些目錄和文件,以及其對(duì)應(yīng)的大小和內(nèi)容等信息。但是我們最終是需要將其提交到代碼倉(cāng)庫(kù)(本地)的,而其命令就是 git commit 了。

而當(dāng)我們執(zhí)行 git commit 命令的時(shí)候,究竟都發(fā)生了什么呢?可以看到當(dāng)提交之后,.git 目錄中生成了兩個(gè)信息的 object 對(duì)象,其中 logs 和 refs 目錄都有新的文件生成。通過(guò)如下操作,我們可以查看到其提交的類(lèi)型和對(duì)應(yīng)內(nèi)容。

# 左邊執(zhí)行
$ git commit -m "1st commit"

$ git cat-file -t 6e4a700  # 查看 commit 對(duì)象的類(lèi)型
$ git cat-file -p 6e4a700  # 查看 commit 對(duì)象的內(nèi)容

$ git cat-file -t 64d6ef5  # 查看 tree 對(duì)象的類(lèi)型
$ git cat-file -p 64d6ef5  # 查看 tree 對(duì)象的內(nèi)容

# 右邊執(zhí)行
$ watch -n 1 -d tree .git


這樣我們就理解了,當(dāng)我們執(zhí)行 git commit 命令之后,會(huì)生成一個(gè) commit 對(duì)象和一個(gè) tree 對(duì)象。commit 對(duì)象內(nèi)容里面包含了一個(gè) tree 對(duì)象和相關(guān)提交信息,而 tree 對(duì)象里面則包含了這次我們提交版本里面的文件狀態(tài)(文件名稱(chēng)和 blob 對(duì)象),這樣我們就知道了這次提交的變動(dòng)了。

我們這次提交之后,處理 objects 目錄發(fā)生變動(dòng)之外,還有一些其他的變化。比如 logs 和 refs 的目錄有所變化。我們查看 refs 目錄里面的內(nèi)容,發(fā)現(xiàn)其指向了 6e4a70 這個(gè) commit 對(duì)象,即當(dāng)前 master 分支上面最新的提交就是這個(gè) 6e4a70 了。

而這個(gè) 6e4a70 這個(gè) commit 對(duì)象,有一個(gè) HEAD 的指向,就是 .git 目錄下的 HEAD 文件。其實(shí)質(zhì)就是一個(gè)指針,其永遠(yuǎn)指向我們當(dāng)前工作的分支,即這里我們工作在 master 分支上。當(dāng)我們切換分支的時(shí)候,這個(gè)文件的指向也會(huì)隨機(jī)改變的。

# 左邊執(zhí)行
$ cat .git/refs/heads/master
$ cat .git/HEAD

# 右邊執(zhí)行
$ watch -n 1 -d tree .git


加深理解 commit 提交

執(zhí)行完成了 git commit 命令,究竟做了什么呢?

當(dāng)我們?cè)俅螌?duì) file2.txt 文件的內(nèi)容進(jìn)行變更、添加以及提交之后,發(fā)現(xiàn)在提交的時(shí)候,查看的 commit 對(duì)象的內(nèi)容時(shí),其包含有父節(jié)點(diǎn)的 commit 信息。而對(duì)于理解的話(huà),可以看看下面的這個(gè)提交流程圖。

# 左邊執(zhí)行
echo "file2.txt" > file2.txt
$ git status
$ git add file2.txt
$ git ls-files -s
$ git cat-file -p 0ac9638
$ git commit -m "2nd commit"
$ git cat-file -p bab53ff
$ git cat-file -p 2f07720

# 右邊執(zhí)行
$ watch -n 1 -d tree .git



在 Git 中空文件夾是不算在追蹤范圍內(nèi)的,而且添加文件夾并不會(huì)增加 object 對(duì)象。當(dāng)我們查看 index 內(nèi)容的時(shí)候,會(huì)發(fā)現(xiàn)文件名稱(chēng)是包含相對(duì)路徑的。

而當(dāng)我們通過(guò) commit 命令提交之后,會(huì)發(fā)現(xiàn)生成了三個(gè) object 對(duì)象,因?yàn)?commit 操作不會(huì)生成 blob 對(duì)象,所以分別是一個(gè) commit 對(duì)象和兩個(gè) tree 對(duì)象??梢园l(fā)現(xiàn),tree 對(duì)象里面有包含了一個(gè)目錄的 tree,其里面包含對(duì)象文件內(nèi)容。

下圖所示的文件狀態(tài),可以體會(huì)到 Git 中版本的概念。即 commit 對(duì)象指向一個(gè)該版本中的文件目錄樹(shù)的根(tree),然后 tree 在指向 blob 對(duì)象(文件)和 tree 對(duì)象(目錄),這樣就可以無(wú)限的往復(fù)下去形成一個(gè)完整的版本。

# 左邊執(zhí)行
$ mkdir floder1
echo "file3" > floder1/file3.txt
$ git add floder1
$ git ls-files -s
$ git commit -m "3rd commit"
$ git cat-file -p 1711e01
$ git cat-file -p 9ab67f8

# 右邊執(zhí)行
$ watch -n 1 -d tree .git



文件的生命周期狀態(tài)

總結(jié)一下,Git 里面的文件狀態(tài)和如何切換。

現(xiàn)在,我們已經(jīng)基本理解了文件如何在工作區(qū)、暫存區(qū)以及代碼倉(cāng)庫(kù)之間進(jìn)行狀態(tài)的跟蹤和同步。在 Git 的操作中,文件的可能狀態(tài)有哪些,以及如何進(jìn)行狀態(tài)切換的,我們這里一起總結(jié)一下!


Branch 和 HEAD 的意義

執(zhí)行完成了 git branch 命令,究竟做了什么呢?

到底什么是分支?分支切換又是怎么一回事?我們通過(guò)查看 Git 的官方文檔,就可以得到,分支就是一個(gè)有名字的(master/dev)指向 commit 對(duì)象的一個(gè)指針。

我們?cè)诔跏蓟瘋}(cāng)庫(kù)的時(shí)候,提供會(huì)默認(rèn)給我們分配一個(gè)叫做 master 的分支(在最新的版本默認(rèn)倉(cāng)庫(kù)已經(jīng)變更為 main 了),而 master 分支就是指向最新的一次提交。為什么需要給分支起名字呢?就是為了方便我們使用和記憶,可以簡(jiǎn)單理解為 alias 命令的意義一致。

有了上述基礎(chǔ),我們就需要考慮下,分支到底是如何實(shí)現(xiàn)和工作的。要實(shí)現(xiàn)一個(gè)分支,我們最基本需要解決兩個(gè)問(wèn)題,第一個(gè)就是需要存儲(chǔ)每一個(gè)分支指向的 commit,第二個(gè)問(wèn)題就是在切換分支的時(shí)候幫助我們標(biāo)識(shí)當(dāng)前分支。

在 Git 中,它有一個(gè)非常特殊的 HEAD 文件。而 HEAD 文件是一個(gè)指針,其有一個(gè)特性就是總會(huì)指向當(dāng)前分支的最新的一個(gè) commit 對(duì)象。而這個(gè) HEAD 文件正好,解決了我們上面提出的兩個(gè)問(wèn)題。

當(dāng)我們從 master 切換分支到 dev 的時(shí)候,HEAD 文件也會(huì)隨即切換,即指向 dev 這個(gè)指針。設(shè)計(jì)就是這么美麗,不愧是鬼才,好腦袋。

# 左邊執(zhí)行
$ cat .git/HEAD
$ cat .git/refs/heads/master
$ git cat-file -t 1711e01

# 右邊執(zhí)行
$ glo = git log


分支操作的背后邏輯

執(zhí)行完成了 git branch 命令,究竟做了什么呢?

這里我們可以看到分支切換之后,HEAD 指向發(fā)生變動(dòng)了。
# 左邊執(zhí)行
$ git branch
$ git branch dev
$ ll .git/refs/heads
$ cat .git/refs/heads/master
$ cat .git/refs/heads/dev
$ cat .git/HEAD
$ git checkout dev
$ cat .git/HEAD

# 右邊執(zhí)行
$ glo = git log


這里需要注意的是,即使我們刪除了分支,但是該分支上一些特有的對(duì)象并不會(huì)被刪除的。這些對(duì)象其實(shí)就是我們俗稱(chēng)的垃圾對(duì)象,還有我們多次使用 add 命令所產(chǎn)生的也有垃圾對(duì)象,而這些垃圾對(duì)象怎么清除和回收呢?后續(xù),我們會(huì)涉及到的。

# 左邊執(zhí)行
echo "dev" > dev.txt
$ git add dev.txt
$ git commit -m "1st commit from dev branch"
$ git checkout master
$ git branch -d dev
$ git branch -D dev
$ git cat-file -t 861832c
$ git cat-file -p 861832c
$ git cat-file -p 680f6e9
$ git cat-file -p 38f8e88

# 右邊執(zhí)行
$ glo = git log


checkout 和 commit 操作

我們一起聊一聊,checkout 和 commit 的操作!

我們執(zhí)行 checkout 命令的時(shí)候,其不光可以切換分支,而且可以切換到指定的 commit 上面,即 HEAD 文件會(huì)指向某個(gè) commit 對(duì)象。在 Git 里面,將 HEAD 文件沒(méi)有指向 master 的這個(gè)現(xiàn)象稱(chēng)之為 detached HEAD。

這里不管 HEAD 文件指向的是分支名稱(chēng)也好,是 commit 對(duì)象也罷,其實(shí)本質(zhì)都是一樣的,因?yàn)榉种Q(chēng)也是指向某個(gè) commit 對(duì)象的。

# 左邊執(zhí)行
$ git checkout 6e4a700
$ git log

# 右邊執(zhí)行
$ glo = git log


當(dāng)我們切換到指定的 commit 的時(shí)候,如果需要在對(duì)應(yīng)的 commit 上繼續(xù)修改代碼提交的話(huà),可以使用上述圖片中提及的 swtich 命令創(chuàng)建新分支,再進(jìn)行提交。但是,通常我們都不會(huì)這樣玩,都會(huì)使用 checkout 命令來(lái)創(chuàng)建新分支的。

$ git checkout -b tmp
$ git log

即使可以這樣操作,我們也很少使用。還記得我們上一章節(jié)創(chuàng)建的 dev 分支嗎?我們創(chuàng)建了該分支并有了一個(gè)新的提交,但是沒(méi)有合并到 master 分支就直接刪除了?,F(xiàn)在再使用 log 命令查看的話(huà),是看不到了。

實(shí)際,真的看不到了嗎?大家要記住,在 Git 里面任何的操作,比如分支的刪除。它只是刪除了指向某個(gè)特定 commit 的指針引用而已,而那個(gè) commit 本身并不會(huì)被刪除,即 dev 分支的那個(gè) commit 提交還是在的。

那我們?cè)趺凑业竭@個(gè) commit 呢?找到之后,我們就可以在上面繼續(xù)工作,或者找到之前的文件數(shù)據(jù)等。

第一種方法:

  • [費(fèi)勁不太好,下下策]

  • 在 objects 目錄下面,自己一個(gè)一個(gè)看,然后切換過(guò)去。


第二種方法:

  • [推薦的操作方式]

  • 使用 Git 提供的 git reflog 專(zhuān)用命令來(lái)查找。

  • 該命令的作用就是用于將我們之前的所有操作都記錄下來(lái)。


# 左邊執(zhí)行
$ git reflog
$ git checkout 9fb7a14
$ git checkout -b dev

# 右邊執(zhí)行
$ glo = git log


聊聊 diff 的執(zhí)行邏輯

當(dāng)我們執(zhí)行 diff 命令之后,Git 的邏輯它們是怎么對(duì)比出來(lái)的呢?

就在本節(jié)中中,我們使用上節(jié)的倉(cāng)庫(kù),修改文件內(nèi)容之后,看看 diff 命令都輸出了哪些內(nèi)容呢?我們這里一起來(lái)看看,研究研究!

echo "hello" > file1.txt
$ git diff
$ git cat-file -p 42d9955
$ git cat-file -p ce01362

# 下述命令原理也是一樣的
$ git diff --cached
$ git diff HEAD


Git 如何添加遠(yuǎn)程倉(cāng)庫(kù)

如何將我們本地的倉(cāng)庫(kù)和遠(yuǎn)程服務(wù)器上面的倉(cāng)庫(kù)關(guān)聯(lián)起來(lái)呢?

初始化倉(cāng)庫(kù)

$ git init
$ git add README.md
$ git commit -m "first commit"


關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)

當(dāng)我們使用上述命令來(lái)關(guān)聯(lián)遠(yuǎn)程服務(wù)器倉(cāng)庫(kù)的時(shí)候,我們本地 .git 目錄也是會(huì)發(fā)生改變的。通過(guò)命令查看 .git/config 文件的話(huà),可以看到配置文件中出現(xiàn)了 [remote] 字段。

# 關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
$ git remote add origin [email protected]:escapelife/git-demo.git

? cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true

[remote "origin"]
    url = [email protected]:escapelife/git-demo.git
    fetch = +refs/heads/*:refs/remotes/origin/*


推送本地分支

當(dāng)我們執(zhí)行如下命令,將本地 master 分支推送到遠(yuǎn)程 origin 倉(cāng)庫(kù)的 master 分支。之后,我們登陸 GitHub 就可以看到推送的文件及目錄內(nèi)容了。

推送分支內(nèi)容的時(shí)候,會(huì)列舉推送的 objects 數(shù)量,并將其內(nèi)容進(jìn)行壓縮,之后推送到我們遠(yuǎn)程的 GitHub 倉(cāng)庫(kù),并且創(chuàng)建了一個(gè)遠(yuǎn)程的 master 分支(origin 倉(cāng)庫(kù))。

# 推送本地分支
$ git push -u origin master

推送之后,我們可以發(fā)現(xiàn),本地的 .git 生成了一些文件和目錄,它們都是什么呢?如下所示,會(huì)新增四個(gè)目錄和兩個(gè)文件,皆為遠(yuǎn)程倉(cāng)庫(kù)的信息。當(dāng)我們通過(guò)命令查看 master 這個(gè)文件的內(nèi)容時(shí),會(huì)發(fā)現(xiàn)其也是一個(gè) commit 對(duì)象。此時(shí)與我們本地 master 分支所指向的一致。而其用于表示遠(yuǎn)程倉(cāng)庫(kù)的當(dāng)前版本,用于和本地進(jìn)行區(qū)別和校對(duì)的。

? tree .git
├── logs
│   ├── HEAD
│   └── refs
│       ├── heads
│       │   ├── dev
│       │   ├── master
│       │   └── tmp
│       └── remotes     # 新增目錄
│           └── origin  # 新增目錄
│               └── master  # 新增文件
└── refs
    ├── heads
    │   ├── dev
    │   ├── master
    │   └── tmp
    ├── remotes     # 新增目錄
    │   └── origin  # 新增目錄
    │       └── master  # 新增文件
    └── tags

遠(yuǎn)程倉(cāng)庫(kù)存儲(chǔ)代碼

使用 GitLab 來(lái)了解遠(yuǎn)程倉(cāng)庫(kù)的服務(wù)器到底是如何存儲(chǔ),我們的代碼的!

當(dāng)我們編寫(xiě)完代碼之后,將其提交到對(duì)應(yīng)的遠(yuǎn)程服務(wù)器上面,其存儲(chǔ)結(jié)構(gòu)和我們地址是一模一樣的。如果我們仔細(xì)想想的話(huà),不一樣的話(huà)才見(jiàn)怪了。

Git 本來(lái)就是代碼的分發(fā)平臺(tái),無(wú)中心節(jié)點(diǎn),即每個(gè)節(jié)點(diǎn)都是主節(jié)點(diǎn),所以其存儲(chǔ)的目錄結(jié)構(gòu)都是一直的。這樣,不管哪一個(gè)節(jié)點(diǎn)的內(nèi)容發(fā)生丟失或缺失的話(huà),我們都可以通過(guò)其他節(jié)點(diǎn)來(lái)找到。而 Git 服務(wù)器就是一個(gè)可以幫助我們,實(shí)時(shí)都可以找到的節(jié)點(diǎn),而已。

原文鏈接:https://www.escapelife.site/posts/da89563c.html

文章轉(zhuǎn)載:分布式實(shí)驗(yàn)室
(版權(quán)歸原作者所有,侵刪)

Linux命令查詢(xún)工具

有收獲,點(diǎn)個(gè)在看 

瀏覽 36
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 蜜桃AV在线| 欧美亚洲综合在线观看| 国产精品内射| 黄片AAA| 国产91探花秘入口| 国产操逼电影| 黄色内射视频| 婷婷中文字幕亚洲| 亚洲中文字幕免费观看视频| 国产无遮挡又黄又爽在线观看| 99re| 国产三级在线播放| 岛国免费av| 18禁一区| 欧美夜夜骑| 成人性爱视频网站| 国产一区一区| 人人妻人人爱人人| 深爱开心激情| 亚洲欧美手机在线| www.青青草视频| 亚洲色图偷拍| 亚洲色情电影| 一级电影网站| 人人操人人操人人操人人操| 老司机精品视频在线观看| 台湾成人视频| 欧美亚洲日韩一区二区三区| 亚洲欧美日韩高清| 午夜性爱视频| 免费AV影片| 日本黄色电影在线播放| 国产女人高潮的AV毛片| 日韩成人AV在线播放| 国产无套在线| 欧美成人精品| 色男人的天堂| 天天干天天射天天操| 日韩欧美中文在线| 91狠狠色丁香婷婷综合久久| 中文有码视频| 国产精品911| 日韩精品在线观看免费| 日韩欧美成人在线观看| 色亭亭影院| 色先锋资源站| 四虎成人在线| 日韩成人免费在线| 水多多成人视频| 欧美日韩中文在线观看| 777国产盗摄偷窥精品0000| 999成人电影| 日韩美女毛片| 中文字幕高清免费看| 久草福利视频| 中文字幕在线看| 五月天婷婷激情| 俺去日| 亚洲69| 青青草视频在线免费观看| 青青青视频在线| 97人妻视频| 欧美一级免费观看| 无码理论片| 日本无码免费视频| 2025AV天堂网| 欧美日韩在线视频观看| 情侣av| 日韩小黄片| 中文字幕日韩电影| 中文字幕永久在线观看| 国产女同性系列| 亚洲精品911| 国产色综合视频| 欧美精品18| 国产日韩在线视频| 国产综合久久777777麻豆| www.精品视频| 操逼视频无码| 国产一区二| 国产h视频在线观看| 99在线精品视频免费观看软件| 伊人激情五月天| 日韩成人小电影| 黑人操白人| 在线免费观看黄| 日韩欧美色图| 亚洲国产91| 国产在线激情| 欧美亚洲天堂| 国产91视频| 日韩人妻无码一区二区三区七区| 欧美日p| 国产中文字幕AV| 99久久精品一区二区成人| 天天爽天天爽夜夜爽| 亚洲人一级电影| 日韩最新高清无码| 国产免费啪啪视频| 99三级片| 蜜桃传媒在线播放| 亚洲无码AV在线观看| 久操99| 欧美成年人网站| 亚洲中文字幕不卡| 成人啪啪网站| www.17c嫩嫩草色蜜桃网站| 亚洲成人av在线观看| 欧美日韩A| 偷拍综合| 男女日皮视频| 午夜福利100| 亚洲精品字幕久久久久| 91大熟女91大腚女人| 欧美熟妇擦BBBB擦BBBB| 国产成人精品a视频一区| 欧洲综合视频| 国产欧美日韩视频| 亚洲区中文字幕| 黄色视频在线网站| 青青伊人久久| 青青草大香蕉| 久久ww| 肏逼网| 成人色播播| 亚洲精品国产成人| 少妇性受XXXX黑人XYX性爽| 18成人网站在线观看| 国产aaaaaa| 老司机视频在线视频18| 四虎成人网址| 麻豆国产精品一区| 伊人无码视频| 久久久大香蕉| 日韩高清久久| 婷婷激情六月| 欧美A级成人婬片免费看| 国产精品国产三级国产专区53 | 猫咪成人网站| 搡BBB搡BBBB搡BBBB-百度| 嫩草视频在线观看免费网站 | 国产精品成人国产乱| 黄色美女毛片| 国产欧美综合一区二区| 精品中文字幕在线| 99高清无码| 亚洲AV成人精品日韩在线播放| 一区二区毛片| 一区二区三区免费| 玖玖91| 亚洲精品白浆高清久久久久久| 精品少妇人妻一区二区| 亚洲美女免费视频| 日日夜夜天天| 国产自偷自拍| 亚洲乱码一区| 亚洲日韩精品成人无码专区AV| 久久久波多野结衣| 99无码人妻| 北条麻妃被操| 日韩免费视频在线观看| 人妻无码HEYZO少妇精品| 九月婷婷综合| 波多野59部无码喷潮| 欧美性色网| 亚洲AV动漫| 精品人妻无码| AV天堂小说| 日韩视频免费在线| 九九久久免费视频| 三级网站免费观看| 超碰成人免费| 91性爱小视频| 亚洲无码AV免费观看| 久久AV网站| 少妇白洁视频| 中国老女人操逼| 五丁香在线观看AV| 国产熟妇搡BBBB搡BBBB搡| 成人在线中文| 人妻天天干| 国模精品无码一区二区免费蜜桃 | 福利视频免费观看| 日韩欧美在线中文字幕| AV在线免费观看网址| 久草这里只有精品| 免费无码在线看| 18禁无码网站| 成人片毛片| 亚洲图片一区| 日韩Av无码一区二区三区不卡| 亚洲福利天堂| 国产又爽又黄视频在线看| 国产一区二区三区在线观看免费视频免费视频免费视频 | 国产精品福利视频| 欧美操| 成人无码高清在线观看| 国产成人在线视频免费| 18AV在线观看| 特级西西西西4444级酉西88wwww特 | 国产高清一区| 91国产精品视频在线| 久久久久亚洲精品| 日韩视频――中文字幕| 日韩精品五区| 国产Av婬乱麻豆| 欧美一区二区三区在线播放| 天天摸天天干| 三级成人网| 三级片AAA成人免费| 日本色情在线| 精品人妻无码一区二区三区四川人| 三级片91| 影音先锋av在线资源站| 国产婬片lA片www777| 大香蕉1024| 日韩一级黄色| 手机AV网站| 这里精品| 二区在线观看| 成人精品鲁一鲁一区二区| 亚洲无码免费视频在线观看| 操逼毛片视频| www.一区二区三区| 白虎高清无码大尺度免费在线观看 | 日韩色图在线观看| 国产精品视频无码| 久久无码精品| 国产AV一区二区三区四区五区| 亚洲一| 3p绿帽黑人看自己老婆| 亚洲色图15P| 欧美性爱内射| 日本欧美在线视频| 91在线精品一区二区| 午夜午夜福利理论片在线播放| 亚洲精品国产精品国自产A片同性| 国产精品色视频| 中文字幕无码在线| 超碰免费视| 国产色情视频在线观看| 国产一级无码| 五月丁香婷婷成人| 人人看人人搂人人摸| 亚洲一区二区在线免费观看| 国产变态另类| 欧美区亚洲区| 国产日皮视频| 国产精品一级二级三级| 色婷婷av在线| 欧美黄色小视频| 亚洲精品图片| 亚洲一区二区在线播放| 东北嫖老熟女一区二区视频网站| www.日韩系列| 91人妻无码精品一区二区三区| 大香伊人久久| 日本久久婷婷| 色婷婷小说| 成人免费无码婬片在线观看免费 | 九九九九综合| 国产在线观看av| 91人妻人人澡人人爽人人精吕| 成人网中文字幕| 激情五月天影院| 色a视频| 亚洲黄色电影在线| 亚洲精品国产精品国自产在线| 熟女啪啪| 婷婷久久在线| 欧美一级日韩一级| 特级西西444www大胆高清图片 | 国产黄色视频在线观看| 风间由美大荫蒂无码AV| 天天操免费视频| 北条麻妃无码一区三区| 韩国三级HD久久精品| av无码网站| 亚洲视频在线观看播放| 国产精品国三级国产a11| 99欧美| 国产农村乱婬片A片AAA图片| 丁香婷婷视频| 女人自慰在线观看| 亚洲日韩欧美成人| 西西人体444大胆高清张悠雨| 97色碰| 一级黄色视频免费看| 久久久桃色| 五十路老国产| 人人草人人草| www.91在线视频| 欧美成人三级在线| 亚洲香蕉av| 手机av在线观看| 六月色| 嫩BBB搡BBB搡BBB四川| 欧美一区二区三曲的| 伊人丁香| 人妻福利导航| 欧美一区二区| 超碰牛牛| 日韩美女视频19| 日本黄色大片网站| 亚洲欧美精品在线| 91天天综合在线| 日韩精品久久久| 就要操| 一本加勒比HEZYO东京热无码 | 影音先锋成人在线资源| 激情欧美| AV片免费看| 99视频热| 亚洲A片视频| 无码操B| 亚洲中文自拍| 97天天干| 香蕉婷婷亚洲丁香| 高清无码第一页| 麻豆精品视频| 最新免费一区二区三区| 日韩视频一区二区| 一本久道无码| 臭小子啊轻点灬太粗太长了的视频| 日本绿色精品视频| 97人妻在线视频| 国产一级二级三级视频| jizzjizz欧美| 亚洲成人中文字幕在线| 毛片黄色| 黄色片免费视频网站| 日韩免费视频观看| 丁香婷婷色五月激情综合三级三级片欧美日韩国 | 日韩黄色网址| 日韩日韩日韩日韩日韩| 91精品久久香蕉国产线看观看| 免费欧美成人网站| 午夜福利亚洲| 18禁无码网站| 成人网站在线观看视频| 五月天久久久久久久| 亚洲中文字幕2025| 亚洲日本中文字幕在线| 国产欧美综合视频| 91精品国产乱码久久久久| 精品视频国产| 香蕉视频a| 国产免费黄色片| 亚洲jiZZjiZZ日本少妇| 午夜成人免费视频| 51嘿嘿嘿国产精品伦理| 激情开心五月天| 国产一区二区三区四区五区六区七区| 免费无码毛片| 亚洲无码免费在线视频| 一区二区三区四区免费| 天堂无码高清| 人人操人人插| 有码视频在线观看| 久草福利在线| 一区二区三区四区五区| 高清免费无码| av第一页| 亚洲一线在线观看| 国产91精品探花一区二区| AAA级片| 人人操人人干人人爽| 伊人久久久影视大全| 久久艹大香蕉| 成人福利视频在线| 久久逼逼| 日本色网址| 亚洲免费在线观看| 91人妻综合| 欧美操逼免费视频| 激情视频在线免费观看| 黄片视频在线免费播放| 东北女人操逼| 操亚洲| 日逼黄片| 亚l洲视频在线观看| 国产三级国产三级国产普通话| 无码人妻在线| 久操新在线| 在线观看黄片视频| 欧美成人手机在线观看| 高清无码视频网站| AV天堂电影网| 亚洲AAAAAA| www.777av| 性爱福利导航| 超碰久热| 可以免费看的黄色| 中文字幕高清在线中文字幕中文字幕 | 国产白丝在线观看| 四色影视| 麻豆传媒视频观看| 视频在线一区| 国产伦精品一区二区三区色大师| 不卡中文字幕| 国产一级AV免费观看| 99在线观看| 91麻豆香蕉| 久久香视频| 水蜜桃一曲二区| 影音先锋成人AV资源| 欧美激情四射老司机| 狠狠干中文字幕| 先锋av资源在线| 香蕉伊人网| 日韩一级成人片| 高清操逼| 香蕉视频在线看| 亚洲丰满熟妇| 操一操| 丁香色五月婷婷| 无码人妻av一区| 欧美视频在线播放| A片网站在线观看| 天天撸免费视频| 在线中文av| 91久久精品日日躁夜夜躁欧美| 国产高清在线| 五月中文字幕| 玖玖婷婷| 操逼一区| 国产欧美综合在线| 熟女人妻在线视频| 天天色播| 99热在线观看免费| 一级片在线免费看| 一级欧美一级日韩| 九色PORN视频成人蝌蚪自拍| 天天草B| 99久久综合| 草草国产| 中国熟睡妇BBwBBw| 无码视频在线免费观看| 欧美日韩精品一区| 四虎无码视频| 日韩性视频| 小泬BBBBBB免费看| 亚洲三级黄片| 91在线免费视频| 被黑人猛躁10次高潮视频| 青娱乐无码视频| 亚洲无码影视| 中文无码一区| 熟女高潮| 操逼AV无码| 亚洲AV无码电影| 3d啪啪动漫| 91精品酒店视频| 婷婷日韩中文字幕| 日韩无码视频网站| 嫩BBB槡BBBB槡BBBB| 爱操AV| 久久精品www人人爽人人| 在线免费观看av网站| 久久这里有精品| 国产精品夜夜爽7777777| 在线观看日本黄| 淫荡五月天视频导航| 水密桃网站| 夜夜撸日日| 成人亚洲性情网站www在线| 日韩一二三| AV无码免费一区二区三区不卡 | 青青操在线观看| 黄色视频在线网站| 亚洲中文字幕在线无码| 色色免费黄色视频| 影音先锋二区| 日韩视频中文| 无码在线播| 久草福利| 欧美夜夜爽| 欧美国产综合| 亚洲网站免费在线观看| 97国产| 99热免费观看| 国产思思99re99在线观看| 成人黄色在线视频| 午夜欧美| 国产老骚逼| 射射AV| 成人伊人网| 婷久久| 亚洲午夜久久久久久久久| 欧美日韩中文在线视频| 精品无码视频| 国产亚洲Av| 日本一区二区视频在线| 中文字幕无码乱伦| 免费v片| 中文字幕+乱码+中文字幕在线| 欧美在线| 二区三区无码| 99热精品在线观看| 北条麻妃人妻中文无码| 亚洲第一视频在线观看| 欧美黄网站在线观看| 黄频免费观看| 青青草青娱乐| 北条麻妃人妻中文字幕91影视| 九九内射| 亚洲午夜精品久久久久久APP| 亚洲高清无码在线| 乖我硬了让老子cao你小视频| 91无码人妻精品1国产四虎| 熟女资源站| 91一区| 内射无码专区久久亚洲| 青青草精品在线视频| 亚洲综合中文字幕在线播放| 四虎无码丰满人妻| 黑人毛片| 日韩无码www| 影音先锋亚洲AV| 欧美日韩国产成人在线观看| 按摩忍不住BD中文字幕| 成人香蕉网| 日韩高清无码一区二区三区| 国产中文字幕波多| 开心五月色婷婷综合开心网| 天天日很很操| 国产乱国产乱老熟300部视频 | 成人激情在线视频| 91人妻人人澡人人爽人人爽| 亚洲国产中文字幕在线播放| 蜜桃av秘无码一区二区三| 操逼操| 麻豆视频在线| 亚洲AV中文无码| 牛牛在线精品视频| 91久久久久久久久久久| 欧美打炮网| 国产福利av| 丝袜美腿亚洲综合| 国产精品天天干| 日本黄色免费网站| 亚洲中文字幕日本| 九九re精品视频在线观看| 欧美肏屄视频| 日韩一区不卡| 你懂得视频在线观看| 黄片91| 操逼逼视频| 五十路在线视频| 国产又爽又黄免费网站在线看| 日本中文视频| 53岁露大奶熟女偷情贴吧| 中文字幕第一页亚洲| 97色色得| 黄片视频免费看| 影音先锋AV啪啪资源| av无码中文| 色综合久久久无码中文字幕999 | 国产色情视频在线观看| 亚洲AV无码久久寂寞少妇多毛| 久久久久久久久久久国产精品| 五月婷婷色欲| 精品一区二区三区四区| 老熟女视频| 91乱子伦国产乱子伦海的味道| 18岁成人毛片| 久久久精品欧美| 亚欧精品久久久| 色色在线观看| 午夜亚洲AV永久无码精品蜜芽| 欧美性爱在线观看| 91精品人妻一区二区三区蜜桃欧美 | 国产乱╳╳AⅤ毛片| 久久久久久久久久久久成人| 欧美aaaaaa| 最近中文字幕高清2019中文字幕| 亚洲国产精品视频| 北条麻妃无码观看| 精品乱子伦一区二区三区免费播放| 日韩欧美精品18| 97精品欧美91久久久久久久| www.99热视频| 中文字幕婷婷五月天| 99久久久久久久无码| 波多野结衣无码流出| 豆花视频在线观看| 500部大龄熟乱4K视频| 日韩国产高清无码| 一区二区网站| 无码区一区二区三区| 懂色AV一区二区三区国产中文在线 | 日韩免费福利视频| 人操人人| 成人精品无码| 欧美日韩黄色| 成人性爱视频在线观看| 精品国产AⅤ麻豆| 囯产精品久久久久久久| 色色婷婷五月| 一级片学生妹| 97国产资源| 国产熟女av| 玖玖爱这里只有精品| 91精品国产91久久久久久吃药| 无码人妻91| 无码精品一区二区三区在线观看| 中文字幕午夜福利| 亚洲精品无码视频| 亚洲色婷婷| 亚洲欧美精品| 中文字幕日韩欧美| 中文字幕乱| 高清无码视频在线免费观看| 国产在线拍揄自揄拍无码网站新闻 | 午色婷婷国产无码| 国产免费视频69| 91免费在线视频| 国产在线小视频| 亚洲日韩AV在线| 人人妻人人澡人人爽人人| 人妻互换一二三区免费| 日逼大片| 91探花国产综合在线精品| 国产成人av网站| 91禁樱桃在线| 国精产品一品二品国精| 国产黄A| 色香蕉在线| av青青草| 久久成人电影院| 亚洲成人第一页| 成人精品视频网站| 97爱爱爱| 日韩精品一区二区三区黄冈站长 | 亚洲黄色大片| www.高清无码| 无码人妻一区二区一牛影视| 国产一区二区三区免费| 婷婷中文字幕| www.91久久| 影音先锋成人资源站| 国产精品秘久久久久久99| 美女做爱视频| 插菊花综合网2| 超碰日本| 三级片在线看| 日韩黄色电影在线观看| 91在线无码精品秘国产色多多 | 欧美日韩卡一卡二在线播放视频 | www香蕉成人片com| 人妻视频网站| 天天艹逼| www日韩| 欧美999| 成人黄色电影| 亚洲男人综合| 中文字幕永久在线5| 久草新| www.久久网| 99在线视频播放| 2019中文字幕mv第三季歌词| 国产99久久久精品| 国产无码电影网| 亚洲无码在线精品| 国产成人秘在线观看免费网站| 四虎综合网| 无码H| 韩国三级HD中文字幕的背景音乐| 182av| 中文无码专区| 午夜精品久久久| 亚洲老鸭窝| 日韩a电影| 思思99热| 亚洲日逼| 91人妻成人精品一区二区| 大香蕉一区| 国产九九九| A级毛片网站| 精品一区二区三区av| 四川揉BBB搡BBB| 狠狠搞狠狠操| 大香蕉伊人视频在线观看| 91久久久青青青青草| 成人无码国产| 亚洲电影AV| 翔田千里无码破解| 国产91在线亚洲| 男女日比视频| 国产免费久久| 手机看片福利| 久久亚洲中文字幕乱码| 激情av在线观看| 大香蕉第一页| 看免费黄色录像| 人人人爽| 国产精品毛片视频| 狼人综合在线| 亚洲无码视频免费| 国产精品黄色视频| 亚洲视频播放| 色综合99| 免费18蜜桃久久19| 熟妇人妻久久中文字幕| 人人av在线| 人妻18无码人伦一区二区三区精品| 精品人妻一区二区免费蜜桃| 欧美AAA片| 午夜精品视频在线观看| 中文字幕不卡在线| 青青草青娱乐| 欧美精品一区二区三区成人片在线 | 国产精品大全| 日韩人妻在线视频| 日韩欧美色图| 免费在线观看AV| 91熊猫视频| 国产精品一级A片| 精品国精品自拍自在线| 婷婷伊人中文字幕| 97人妻精品一区二区三区图片 | 三级视频在线播放| 99成人乱码一区二区三区在线 | 加勒比综合无码| 亚洲黄色视频免费观看| 嫩草久久99www亚洲红桃| 欧美一级aaa| 在线黄| 北条麻妃久久| 女人特级毛片18| 无码婬片A片AAA毛片艳谭| 人妻人操| 欧美日韩人妻| 日韩毛片中文字幕| 北条麻妃二区| 欧美精产国品一二三产品动漫| 亚洲国产一区二区在线| 在线观看黄色| 日韩高清成人无码| 日韩一级片在线播放| 国产精品免费看| 亚洲最大成人网站| 视频一视频二在线视频| 亚洲国产精| 91看片看婬黄大片Videos| 老熟女91| 操逼视频在线看| 无码久久| 高清av免费| 2017天天干天天射| 97国产精品久久| 91精品内射| 久射久| 国产成人秘一区二区三区东京热 | 北条麻妃人妻中文无码| 成人网在线视频| 蜜桃导航-精品导航| 欧美韩日一区二区| 亚洲天堂手机在线| 久久午夜影院| 欧美熟女18| 免费的黄色录像| 99热官网| 色视频在线播放| 操人网站| AV在线天堂| 亚洲国产精品成人网站| 大香蕉伊人视频在线观看| 中文字幕精品在线视频| 亚洲无码制服| av麻豆| 欧美精品xxx| 日韩av免费在线| 蜜桃91精品入口| 国产A视频| 亚洲免费在线视频| 99国产精品久久久久久久| 免费成人视频在线观看| 日本一区二区三区免费观看| 日韩精品五区| 屌国产精品| 国产成人小电影| 欧美二区三区| 91久久久久久| 青青草原av| 欧美操大逼| 欧性猛交ⅩXXX乱大交| 日韩精品91| 插进去综合网| 亚洲欧洲在线播放| 91久久午夜无码鲁丝片久久人妻| 在线观看日韩AV| www.91爱爱,com| 国产一区二区三区成人| 亚洲欧美日韩中文字幕在线观看| 小h片| 黄色av免费在线观看| 丁香五月少妇| 成年片免费观看网站免费观看,亚洲+欧... | 欧美视频一区| 日韩欧美日韩| 精品国产毛片| 亚洲第一免费视频| 成人在线网| AV在线播放中文字幕| 91豆花成人社区| 国产女同性系列| 亚洲无码高清在线观看| 欧美性爱XXXX| 99免费热视频在线| 91麻豆精品国产91久久久吃药 | 精品亚洲一区二区三区四区五区| 台湾成人视频| 欧美成人免费| 国产免费性爱视频| 日日搔av一区二区三区| 在线免费看a| 在线看片a| 在线观看免费黄视频| 日韩操片| 97人人爽人人爽人人人| 国产96在线亚洲| 日韩黄色免费网站| 日韩成人网站在线观看| 国产毛片777777| 自拍偷拍中文字幕| 在线观看AV91| 欧美自拍第一页| 深爱五月激情| 亚洲色图偷拍| 在线观看黄色小电影| 成人网站免费视频| 国产777777| 91麻豆精品在线| 中文在线无码| 四虎成人网站| 亚洲精品无码人妻| 色悠悠国产| 欧一美一婬一伦一区二区三区黑人 | 日韩小视频+国产| 国产主播在线播放| 无码乱伦| 人人妻人人操人人干| 日本视频一区二区三区| 91在线视频免费观看| 中文字幕在线视频无码| 亚洲区欧美区| 北条麻妃视频在线观看| 成人中文字幕在线视频| 中文字幕国产精品| av高清无码| 欧美一级性爱在线观看| 亚洲日韩欧美一区二区天天天| 色情五月| 水果派红桃AV解说| 亚洲视频高清无码| 三级片视频网站| 国产精品视频导航| 欧美三级黄色| 精品九九| 亚洲国产成人久久| 五月丁香婷婷在线| 欧美性爱超碰| 91精品视频网| 91乱子伦国产乱子伦海的味道| 激情一级片| 草逼视频免费看| 99久久精品国产一区色| 午夜福利sw| 五月天婷婷久久| 成人一级A片| 999在线视频| 人人操人人摸人人爱| 五月婷婷六月丁香| 欧美精品不卡| 伊人久久电影| 先锋影音资源站av每日资源在线 | 蜜臀精品| 奇米超碰| 亚洲大逼| 夜夜操夜夜爽| aV无码av天天aV天天爽第一| 天天弄天天操| 2025最新国产精品每日更新| 久久久久久9| 97人人爽人人爽人人人| 又粗又硬又爽18级A片| 51妺嘿嘿午夜福利在线| 黄色片在线看| 欧美一级A片在免费看| 日韩欧美分区视频| 丁香五月激情中文字幕| 亚洲在线成人视频| 中文一级片| 大地资源中文第二页导读内容| 午夜色婷婷| 三级电影久久麻豆| 毛片资源| 小骚逼操死你| 97免费视频在线观看|