一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - 編程技術(shù) - Git科普文,Git基本原理及各種騷操作(推薦)

Git科普文,Git基本原理及各種騷操作(推薦)

2020-08-30 14:49iisheng 編程技術(shù)

這篇文章主要介紹了Git科普文,Git基本原理及各種騷操作,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

git簡單介紹

git是一個分布式版本控制軟件,最初由linus torvalds創(chuàng)作,于2005年以gpl發(fā)布。最初目的是為更好地管理linux內(nèi)核開發(fā)而設(shè)計。

git工作流程以及各個區(qū)域

Git科普文,Git基本原理及各種騷操作(推薦)

  • workspace:工作區(qū)
  • staging/index:暫存區(qū)
  • local repository:本地倉庫(可修改)
  • /refs/remotes:遠(yuǎn)程倉庫的引用(不可修改)
  • remote:遠(yuǎn)程倉庫

git文件狀態(tài)變化

Git科普文,Git基本原理及各種騷操作(推薦)

git各種命令

git簡單命令

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 在當(dāng)前目錄新建一個git倉庫
git init
 
# 打開git倉庫圖形界面
gitk
 
# 顯示所有變更信息
git status
 
# 刪除所有untracked files
git clean -fd
 
# 下載遠(yuǎn)程倉庫的所有更新
git fetch remote
 
# 下載遠(yuǎn)程倉庫的所有更新,并且merge
git pull romote branch-name
 
 
# 查看上次commit id
git rev-parse head
 
# 將指定分支合并到當(dāng)前分支
git merge branch-name
 
# 將最近的一次commit打包到patch文件中
git format-patch head^
 
# 將patch文件 添加到本地倉庫
git am patch-file
 
# 查看指定文件修改歷史
git blame file-name

git常用命令

git clone

?
1
2
3
4
5
# 將遠(yuǎn)程git倉庫克隆到本地
git clone url
 
# 將遠(yuǎn)程git倉庫克隆到本地
git clone -b branch url

git stash

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 將修改過,未add到staging區(qū)的文件,暫時存儲起來
git stash
 
# 恢復(fù)之前stash存儲的內(nèi)容
git stash apply
 
# 保存stash 并寫message
git stash save "stash test"
 
# 查看stash了哪些存儲
git stash list
 
# 將stash@{1}存儲的內(nèi)容還原到工作區(qū)
git stash apply stash@{1}
 
# 刪除stash@{1}存儲的內(nèi)容
git stash drop stash@{1}
 
# 刪除所有緩存的stash
git stash clear

git config

?
1
2
3
4
5
6
7
8
9
# 配置git圖形界面編碼為utf-8
git config --global gui.encoding=utf-8
 
# 設(shè)置全局提交代碼的用戶名
git config --global user.name name
# 設(shè)置全局提交代碼時的郵箱
git config --global user.email email
# 設(shè)置當(dāng)前項(xiàng)目提交代碼的用戶名
git config user.name name

git remote

?
1
2
3
4
5
6
7
8
9
10
11
# 顯示所有遠(yuǎn)程倉庫
git remote -v
 
# 增加一個新的遠(yuǎn)程倉庫
git remote add name url
 
# 刪除指定遠(yuǎn)程倉庫
git remote remove name
 
# 獲取指定遠(yuǎn)程倉庫的詳細(xì)信息
git remote show origin

git add

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 添加所有的修改到staging區(qū)
git add .
git add --all
 
# 添加指定文件到staging區(qū)
git add file
 
# 添加多個修改的文件到staging區(qū)
git add file1 file2
 
# 添加修改的目錄到staging區(qū)
git add dir
 
# 添加所有src目錄下main開頭的所有文件到staging區(qū)
git add src/main*

git commit

?
1
2
3
4
5
6
7
8
9
10
11
# 提交staging區(qū)的代碼到本地倉庫區(qū)
git commit -m "message"
 
# 提交staging中在指定文件到本地倉庫區(qū)
git commit file1 file2 -m "message"
 
# 使用新的一次commit,來覆蓋上一次commit
git commit --amend -m "message"
 
# 修改上次提交的用戶名和郵箱
git commit --amend --author="name <email>" --no-edit

git branch

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 列出本地所有分支
git branch
 
# 列出本地所有分支 并顯示最后一次提交的哈希值
git branch -v
 
# 在-v 的基礎(chǔ)上 并且顯示上游分支的名字
git branch -vv
 
# 列出上游所有分支
git branch -r
 
# 新建一個分支,但依然停留在當(dāng)前分支
git branch branch-name
 
# 刪除分支
git branch -d branch-name
 
# 設(shè)置分支上游
git branch --set-upstream-to origin/master
 
# 本地分支重命名
git branch -m old-branch new-branch

git checkout

?
1
2
3
4
5
6
7
8
9
10
11
# 創(chuàng)建本地分支并關(guān)聯(lián)遠(yuǎn)程分支
git checkout -b local-branch origin/remote-branch
 
# 新建一個分支,且切換到新分支
git checkout -b branch-name
 
# 切換到另一個分支
git checkout branch-name
 
# 撤銷工作區(qū)文件的修改,跟上次commit一樣
git checkout commit-file

git tag

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 創(chuàng)建帶有說明的標(biāo)簽
git tag -a v1.4 -m 'my version 1.4'
 
# 打標(biāo)簽
git tag tag-name
 
# 查看所有標(biāo)簽
git tag
 
# 給指定commit打標(biāo)簽
git tag tag-name commit-id
 
# 刪除標(biāo)簽
git tag -d tag-name

git push

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 刪除遠(yuǎn)程分支
git push origin :master
 
# 刪除遠(yuǎn)程標(biāo)簽
git push origin --delete tag tag-name
 
# 上傳本地倉庫到遠(yuǎn)程分支
git push remote branch-name
 
# 強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程分支
git push remote branch-name --force
 
# 推送所有分支到遠(yuǎn)程倉庫
git push remote --all
 
# 推送所有標(biāo)簽
git push --tags
 
# 推送指定標(biāo)簽
git push origin tag-name
 
# 刪除遠(yuǎn)程標(biāo)簽(需要先刪除本地標(biāo)簽)
git push origin :refs/tags/tag-name
 
# 將本地dev分支push到遠(yuǎn)程master分支
git push origin dev:master

git reset

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 將未commit的文件移出staging區(qū)
git reset head
 
# 重置staging區(qū)與上次commit的一樣
git reset --hard
 
# 重置commit代碼和遠(yuǎn)程分支代碼一樣
git reset --hard origin/master
 
# 回退到上個commit
git reset --hard head^
 
# 回退到前3次提交之前,以此類推,回退到n次提交之前
git reset --hard head~3
 
回退到指定commit
git reset --hard commit-id

git diff

?
1
2
3
4
5
6
7
8
9
10
11
# 查看文件在工作區(qū)和暫存區(qū)區(qū)別
git diff file-name
 
# 查看暫存區(qū)和本地倉庫區(qū)別
git diff --cached file-name
 
# 查看文件和另一個分支的區(qū)別
git diff branch-name file-name
 
# 查看兩次提交的區(qū)別
git diff commit-id commit-id

git show

?
1
2
3
4
5
# 查看指定標(biāo)簽的提交信息
git show tag-name
 
# 查看具體的某次改動
git show commit-id

git log

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 指定文件夾 log
git log --pretty=format:"%h %cn %s %cd" --author="iisheng\|勝哥" --date=short src
# 查看指定用戶指定format 提交
 git log --pretty=format:"%h %cn %s %cd" --author=iisheng --date=short
 
# 查看該文件的改動歷史
git log --pretty=oneline file
 
# 圖形化查看歷史提交
git log --graph --pretty=oneline --abbrev-commit
 
# 統(tǒng)計倉庫提交排名前5
git log --pretty='%an' | sort | uniq -c | sort -k1 -n -r | head -n 5
 
# 查看指定用戶添加代碼行數(shù),和刪除代碼行數(shù)
git log --author="iisheng" --pretty=tformat: --numstat | awk '{ add += $1 ; subs += $2 } end { printf "added lines: %s removed lines : %s \n",add,subs }'

git rebase

?
1
2
3
4
5
6
7
8
# 將指定分支合并到當(dāng)前分支
git rebase branch-name
 
# 執(zhí)行commit id 將rebase 停留在指定commit 處
git rebase -i commit-id
 
# 執(zhí)行commit id 將rebase 停留在 項(xiàng)目首次commit處
git rebase -i --root

git restore

?
1
2
3
4
5
# 恢復(fù)第一次add 的文件,同 git rm --cached
git restore --staged file
 
# 移除staging區(qū)的文件,同 git checkout
git restore file

git revert

?
1
2
3
4
5
6
7
8
# 撤銷前一次commit
git revert head
 
# 撤銷前前一次commit
git revert head^
 
# 撤銷指定某次commit
git revert commit-id

git騷操作

git命令不能自動補(bǔ)全?(mac版)

我見過有的人使用git別名,反正因?yàn)橛凶詣友a(bǔ)全的存在,我從來沒用過git別名。不過我的確將我的rm -rf命令替換成了別的腳本了...

安裝bash-completion

brew install bash-completion

添加 bash-completion 到 ~/.bash_profile:

?
1
2
3
if [ -f $(brew --prefix)/etc/bash_completion ]; then
 . $(brew --prefix)/etc/bash_completion
 fi

shell有不同種類,我這里使用的是bash。

代碼沒寫完,突然要切換到別的分支怎么辦?

暫存未提交的代碼

?
1
git stash

還原暫存的代碼

?
1
git stash apply

怎么合并其他分支的指定commit?

使用cherry-pick命令

?
1
git cherry-pick 指定commit-id

本地臨時代碼不想提交,怎么一次性清空?

還原未commit的本地更改的代碼

?
1
git reset --hard

還原包含commit的代碼,到跟遠(yuǎn)程分支相同

?
1
git reset --hard origin/master

已經(jīng)提交的代碼,不需要了,怎么當(dāng)做沒提交過?

還原到上次commit

?
1
git reset --hard head^

還原到當(dāng)前之前的幾次commit

?
1
git reset --hard head~2

強(qiáng)制推送到遠(yuǎn)程分支,確保沒有其他人在push,不然可能會丟失代碼

?
1
git push origin develop --force

歷史commit作者郵箱寫錯了,怎么一次性改過來?

使用git filter-branch命令。

復(fù)制下面的腳本,替換相關(guān)變量

  • old_email
  • correct_name
  • correct_email

腳本如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
 
git filter-branch --env-filter '
 
old_email="[email protected]"
correct_name="your correct name"
correct_email="[email protected]"
 
if [ "$git_committer_email" = "$old_email" ]
then
export git_committer_name="$correct_name"
export git_committer_email="$correct_email"
fi
if [ "$git_author_email" = "$old_email" ]
then
export git_author_name="$correct_name"
export git_author_email="$correct_email"
fi
' --tag-name-filter cat -- --branches --tags

強(qiáng)制推送替換

?
1
git push --force --tags origin 'refs/heads/*'

不小心把不該提交的文件commit了,怎么永久刪除?

也是使用git filter-branch命令。

?
1
2
3
git filter-branch --force --index-filter \
 "git rm --cached --ignore-unmatch file-path-and-name" \
 --prune-empty --tag-name-filter cat -- --all

強(qiáng)制推送覆蓋遠(yuǎn)程分支。

?
1
git push origin --force --all

強(qiáng)制推送覆蓋遠(yuǎn)程tag。

?
1
git push origin --force --tags

怎么保證團(tuán)隊(duì)成員提交的代碼都是可運(yùn)行的?

這里想說的是使用git hooks,一般在項(xiàng)目目錄.git/hooks,客戶端可以使用hooks,控制團(tuán)隊(duì)commit提交規(guī)范,或者push之前,自動編譯項(xiàng)目校驗(yàn)項(xiàng)目可運(yùn)行。服務(wù)端可以使用hooks,控制push之后自動構(gòu)建項(xiàng)目,merge等自動觸發(fā)單元測試等。

git reset --hard命令,執(zhí)行錯了,能恢復(fù)嗎?

查看當(dāng)前commit log

Git科普文,Git基本原理及各種騷操作(推薦)

誤操作git reset --hard 8529cb7

Git科普文,Git基本原理及各種騷操作(推薦)

執(zhí)行git reflog

Git科普文,Git基本原理及各種騷操作(推薦)

還原到之前的樣子

Git科普文,Git基本原理及各種騷操作(推薦)

公司使用gitlab,平時還用github,多賬號ssh,如何配置?

編輯 ~/.ssh/config文件 沒有就創(chuàng)建

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# github
host github.com
port 22
hostname github.com
preferredauthentications publickey
addkeystoagent yes
identityfile ~/.ssh/github_id_rsa
usekeychain yes
user iisheng
 
# gitlab
host gitlab.iisheng.cn
port 22
hostname gitlab.iisheng.cn
preferredauthentications publickey
addkeystoagent yes
identityfile ~/.ssh/gitlab_id_rsa
usekeychain yes
user iisheng

git commits歷史如何變得清爽起來?

多用git rebase

比如,開發(fā)分支是feature,主干分支是master。我們在進(jìn)行代碼合并的時候,可以執(zhí)行下面的命令。

?
1
2
3
4
5
# 切換當(dāng)前分支到feature
git checkout feature
 
# 將當(dāng)前分支代碼變基為基于master
git rebase master

然后我們再切換到master分支,執(zhí)行git merge feature,就可以進(jìn)行快進(jìn)式合并了,commmits歷史就不會有交叉了。后文我們會詳細(xì)講解。

git rebase會更改commit歷史,請謹(jǐn)慎使用。

下面的圖是guava項(xiàng)目的commit記錄。

Git科普文,Git基本原理及各種騷操作(推薦)

如何修改已經(jīng)提交的commit信息?

原始git提交記錄是這樣的

Git科普文,Git基本原理及各種騷操作(推薦)

執(zhí)行git rebase -i 070943d,對指定commitid之前的提交,進(jìn)行修改

Git科普文,Git基本原理及各種騷操作(推薦)

修改后git提交記錄變成了這樣

Git科普文,Git基本原理及各種騷操作(推薦)

git rebase -i非常實(shí)用,還可以將多個commit合并成一個等很多事情,務(wù)必要記下。

不小心執(zhí)行了git stash clear怎么辦?

?
1
git fsck --lost-found

執(zhí)行之后,可以找到相關(guān)丟失的commit-id,然后merge一下即可。

該命令上可以找回git add之后被弄丟的文件。

啥?你沒執(zhí)行過git add代碼就丟了?別怕,一般編譯器有local history趕緊去試試吧。

詳解git merge

我們執(zhí)行git merge命令的時候,經(jīng)常會看到fast-forward字樣,fast-forward到底是個什么東西?

其實(shí),git merge一般有三種場景。

快進(jìn)式合并

舉個栗子,假如初始存在masterhotfix分支是這樣的。

Git科普文,Git基本原理及各種騷操作(推薦)

然后我們在hotfix分支加了些代碼,分支變成這樣了。

Git科普文,Git基本原理及各種騷操作(推薦)

這個時候,我們將hotfix分支,mergemaster,即執(zhí)行git merge hotfix。

Git科普文,Git基本原理及各種騷操作(推薦)

由于的分支hotfix所指向的提交c3c2的直接后繼, 因此git會直接將指針向前移動。換句話說,如果順著一個分支走下去能夠到達(dá)另一個分支,那么git在合并兩者的時候, 只會簡單的將指針向前推進(jìn)(指針右移),因?yàn)檫@種情況下的合并操作沒有需要解決的分歧——這就叫做 快進(jìn)(fast-forward)。

三方合并

再舉個栗子,假如初始存在featuremaster分支情況是這樣的。

Git科普文,Git基本原理及各種騷操作(推薦)

然后我們在feature分支加了些代碼,而master分支也有人加了代碼,現(xiàn)在分支變成這樣了。

Git科普文,Git基本原理及各種騷操作(推薦)

這個時候,我們將feature分支,mergemaster,即執(zhí)行git merge feature。

Git科普文,Git基本原理及各種騷操作(推薦)

和之前將分支指針向前推進(jìn)所不同的是,git將此次三方合并的結(jié)果做了一個新的快照并且自動創(chuàng)建一個新的提交指向它。這個被稱作一次合并提交,它的特別之處在于他有不止一個父提交。

所以我們也知道了,為什么有的時候merge之后會產(chǎn)生新的commit,而有的時候沒有。

遇到?jīng)_突時的合并

如果在兩個分支分別對同一個文件做了改動,git就沒法直接合并他們。當(dāng)遇到?jīng)_突的時候,git會自動停下來,等待我們解決沖突。就像這樣

?
1
2
3
4
$ git merge dev
auto-merging 111.txt
conflict (content): merge conflict in 111.txt
automatic merge failed; fix conflicts and then commit the result.

我們可以在合并沖突后的任意時刻使用git status命令來查看那些因包含合并沖突而處于未合并unmerged狀態(tài)的文件。

?
1
2
3
4
5
6
7
8
9
10
11
$ git status
on branch master
you have unmerged paths.
 (fix conflicts and run "git commit")
 (use "git merge --abort" to abort the merge)
 
unmerged paths:
 (use "git add <file>..." to mark resolution)
    both modified: 111.txt
 
no changes added to commit (use "git add" and/or "git commit -a")

待解決沖突的文件git會以未合并的狀態(tài)標(biāo)識出來,出現(xiàn)沖突的文件會出現(xiàn)一些特殊的區(qū)段,看起來像下面的樣子。

?
1
2
3
4
5
<<<<<<< head
111aaa
=======
111b
>>>>>>> dev

<<<<<<< 后面的是當(dāng)前分支的引用,我們的例子中,就代表master分支。>>>>>>>后面表示的是要合并到當(dāng)前分支的分支,即dev分支。=======的上半部分,表示當(dāng)前分支的代碼。下半部分表示dev分支的代碼。

我們可以把上面的測試內(nèi)容改成下面的樣子來解決沖突

?
1
111aaa

在解決了所有文件里的沖突之后,對每個文件使用git add命令來將其標(biāo)記為沖突已解決。

解決沖突的過程中,每一步都可以執(zhí)行git status查看當(dāng)前狀態(tài),git也會給出相應(yīng)提示,進(jìn)行下一步操作。當(dāng)我們所有的文件都暫存之后時,執(zhí)行git status時,git會給我們看起來像下面的這種提示

?
1
2
3
4
$ git status
on branch master
all conflicts fixed but you are still merging.
 (use "git commit" to conclude merge)

然后,我們根據(jù)提示執(zhí)行git commit。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
merge branch 'dev'
 
# conflicts:
#  111.txt
#
# it looks like you may be committing a merge.
# if this is not correct, please remove the file
#  .git/merge_head
# and try again.
 
 
# please enter the commit message for your changes. lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# on branch master
# all conflicts fixed but you are still merging.
#

然后,我們保存這次提交就完成了這次沖突合并。

詳解git rebase

rebase做了什么

舉個栗子。我們同樣用剛才merge的場景。

如果不用rebase,使用merge是下面這樣的,合并分支的時候會產(chǎn)生一個合并提交,而且會有分支交叉的情況。

Git科普文,Git基本原理及各種騷操作(推薦)

使用rebase是下面這樣的。

Git科普文,Git基本原理及各種騷操作(推薦)

然后,切換到master分支,進(jìn)行一次快進(jìn)式合并。

Git科普文,Git基本原理及各種騷操作(推薦)

變基實(shí)際上就是基于其他分支重塑當(dāng)前分支。變基之后,當(dāng)前分支就相當(dāng)于是基于最新的其他分支新加了一些commit,這樣的話就可以進(jìn)行快進(jìn)式合并了。

rebase原理

它的原理是首先找到這兩個分支(即當(dāng)前分支 dev、變基操作的目標(biāo)基底分支master)的最近共同祖先 c2,然后對比當(dāng)前分支相對于該祖先的歷次提交,提取相應(yīng)的修改并存為臨時文件, 然后將當(dāng)前分支指向目標(biāo)基底c3, 最后以此將之前另存為臨時文件的修改依序應(yīng)用,也就是在c3后面添加c4'、c5'

git對象與快照

提到git,總有人會說快照,快照是個什么鬼?

實(shí)際上,git是一個內(nèi)容尋址文件系統(tǒng),其核心部分是一個簡單的鍵值對數(shù)據(jù)庫。將git中的對象,存儲在.git/objects目錄下。

git對象主要分為,數(shù)據(jù)對象(blob object)、樹對象(tree object)、提交對象(commit object)、標(biāo)簽對象(tag object)。

數(shù)據(jù)對象

我們新建一個目錄,然后在該目錄下執(zhí)行git init初始化一個git項(xiàng)目。

然后,查看.git/objects目錄下都有什么。

?
1
2
3
4
$ find .git/objects
.git/objects
.git/objects/pack
.git/objects/info

接著,我們寫一個文件echo '1111' > 111.txt,并執(zhí)行git add之后,再查看。

?
1
2
3
4
5
6
$ find .git/objects
.git/objects
.git/objects/5f
.git/objects/5f/2f16bfff90e6620509c0cf442e7a3586dad8fb
.git/objects/pack
.git/objects/info

我們發(fā)現(xiàn).git/objects目錄下,多了個文件和目錄。實(shí)際上,git會將我們的文件數(shù)據(jù)外加一個頭部信息header一起做sha-1校驗(yàn)運(yùn)算而得到校驗(yàn)和。然后,校驗(yàn)和的前2個字符用于命名子目錄,余下的38個字符則用作文件名。

我們可以使用下面的命令,顯示在git對象中存儲的內(nèi)容。

?
1
2
$ git cat-file -p 5f2f16bfff90e6620509c0cf442e7a3586dad8fb
1111

這就是我們在上文寫入的文件內(nèi)容。

上述類型的對象稱之為數(shù)據(jù)對象(blob object)。數(shù)據(jù)對象,僅保存了文件內(nèi)容,而文件名字沒有被保存。

樹對象

數(shù)據(jù)對象大致對應(yīng)unix中的inodes或文件內(nèi)容,樹對象則對應(yīng)了unix中的目錄項(xiàng)。一個樹對象包含了一條或多條樹對象記錄(tree entry),每條記錄含有一個指向數(shù)據(jù)對象或者子樹對象的sha-1指針,以及相應(yīng)的模式、類型、文件名信息。

通常,git根據(jù)某一時刻暫存區(qū)(即index區(qū)域)所表示的狀態(tài)創(chuàng)建并記錄一個對應(yīng)的樹對象。

當(dāng)我們執(zhí)行過git add之后,暫存區(qū)就有內(nèi)容了,我們可以通過git底層命令,生成樹對象。

?
1
2
$ git write-tree
b716c7b049ccd9048b0566a57cfd516c17c1e39f

查看該樹對象的內(nèi)容。

?
1
2
$ git cat-file -p b716c7b049ccd9048b0566a57cfd516c17c1e39f
100644 blob 5f2f16bfff90e6620509c0cf442e7a3586dad8fb    111.txt

提交對象

數(shù)據(jù)對象保存了數(shù)據(jù)的內(nèi)容,樹對象可以表示當(dāng)前目錄的快照。但是,若想重用這些快照,必須記住樹對象的sha-1哈希值。而且,我們也不知道是誰保存了這些快照,在什么時刻保存的,以及為什么保存這些快照。而以上這些,正是
提交對象(commit object)
能保存的基本信息。

我們對當(dāng)前暫存區(qū)進(jìn)行一次提交,git commit -m "first commit"

然后查看一下log找到該次提交的commit哈希值。

?
1
2
$ git log --oneline
5281f7e (head -> master) first commit

接著,我們查看一下該提交對象的內(nèi)容。

?
1
2
3
4
5
6
$ git cat-file -p 5281f7e
tree b716c7b049ccd9048b0566a57cfd516c17c1e39f
author iisheng <***@gmail.com> 1596073568 +0800
committer iisheng <***@gmail.com> 1596073568 +0800
 
first commit

提交對象的格式很簡單:它先指定一個頂層樹對象,代表當(dāng)前項(xiàng)目快照;然后是可能存在的父提交(前面描述的提交對象并不存在任何父提交);之后是作者/提交者信息(依據(jù)你的user.nameuser.email配置來設(shè)定,外加一個時間戳);留空一行,最后是提交注釋。

標(biāo)簽對象

標(biāo)簽對象(tag object) 非常類似于一個提交對象——它包含一個標(biāo)簽創(chuàng)建者信息、一個日期、一段注釋信息,以及一個指針。主要的區(qū)別在于,標(biāo)簽對象通常指向一個提交對象,而不是一個樹對象。它像是一個永不移動的分支引用——永遠(yuǎn)指向同一個提交對象,只不過給這個提交對象加上一個更友好的名字罷了。

實(shí)際上git中的各種對象都是類似的,只不過因?yàn)楦鞣N對象自身功能不同,存儲結(jié)構(gòu)不同而已。

git引用-我從遠(yuǎn)程拉的代碼不是最新的?

git引用相當(dāng)于是git中特定哈希值的別名。一長串的哈希值不是很友好,但是起個別名,我們就可以像這樣git show mastergit log master的去使用他們。

git中的引用存儲在.git/refs目錄下。我們可以執(zhí)行find .git/refs/查看當(dāng)前git項(xiàng)目中都存在哪些引用。

head引用

.git目錄下有一個名字叫做head的文件,head文件通常是一個符號引用(symbolic reference)指向目前所在的分支。所謂符號引用,表示它是一個指向其他引用的指針。

如果我們在工作區(qū)checkout一個sha-1值,head引用也會指向這個包含git對象的sha-1值。

標(biāo)簽引用

git標(biāo)簽分為,附注標(biāo)簽和輕量標(biāo)簽。輕量標(biāo)簽,使用 git tag v1.0即可創(chuàng)建。附注標(biāo)簽需要使用-a選項(xiàng),即git tag -a v1.0 -m "my version 1.0"這種。

輕量標(biāo)簽就是一個固定的引用。附注標(biāo)簽需要創(chuàng)建標(biāo)簽對象,并記錄一個引用來指向該標(biāo)簽對象。

遠(yuǎn)程引用

不熟悉git的同學(xué),可能會犯這樣一個錯誤。其他同學(xué)讓他拉取一下遠(yuǎn)程最新的master分支代碼,他可能直接用ide找到本地的遠(yuǎn)程分支的引用,也就是origin/master,直接checkout一個本地分支。

其實(shí),origin/master只是遠(yuǎn)程分支的一個引用,不一定跟遠(yuǎn)程分支代碼同步,我們可以用git fetch或者git pull來讓origin/master和遠(yuǎn)程分支同步。

參考文獻(xiàn):

[1]:https://git-scm.com/

到此這篇關(guān)于git科普文,git基本原理及各種騷操作(推薦)的文章就介紹到這了,更多相關(guān)git基本原理內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/iisheng/p/13425658.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品边做边接电话在线观看 | 欧美破处女视频 | 高清在线观看mv的网址免费 | 甜性涩爱 | 日韩欧美天堂 | 国产福利不卡一区二区三区 | 精品女同一区二区三区免费站 | 无颜之月5集全免费看无删除 | 国产一区视频在线免费观看 | 日韩在线视频免费不卡一区 | 婚前试爱免费观看 | 女海盗斯蒂内塔的复仇2免费观看 | 日韩毛片在线视频 | 免费真实播放国产乱子伦 | 免费视频亚洲 | 亚洲免费视频在线观看 | 臀控福利大臀的网站 | 欧美特黄aaaaaa | 国产精品林美惠子在线观看 | 国产愉拍精品视频手机 | 精品国产一区二区三区久 | 色综合亚洲天天综合网站 | 无人视频在线观看完整版高清 | 日韩精品欧美国产精品亚 | 亚洲天堂激情 | 亚洲精品91 | 亚洲xxxxxhd奶水女人 | 日本不卡免费新一二三区 | 欧美国产日韩在线播放 | 69av美女 | 国产成人在线免费观看 | 免费看欧美一级特黄a大片一 | 国产精品久久国产三级国电话系列 | 国产精品热久久毛片 | 亚洲国产日韩欧美一区二区三区 | 十大免费b2b网站 | 91影视永久福利免费观看 | 国产日日操 | 国产成人高清精品免费5388密 | 国产精品1024永久免费视频 | 亚洲系列国产精品制服丝袜第 |