精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Git科普文,Git基本原理&各種騷操作

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

[[338591]]

Git簡單介紹

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

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

 

  • Workspace:工作區(qū)
  • Staging/Index:暫存區(qū)
  • Local Repository:本地倉庫(可修改)
  • /refs/remotes:遠(yuǎn)程倉庫的引用(不可修改)
  • Remote:遠(yuǎn)程倉庫

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

 

Git各種命令

Git簡單命令

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

Git常用命令

git clone

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

git config

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

git remote

  1. # 顯示所有遠(yuǎn)程倉庫 
  2. git remote -v   
  3.  
  4. #  增加一個新的遠(yuǎn)程倉庫 
  5. git remote add name url  
  6.  
  7. #  刪除指定遠(yuǎn)程倉庫 
  8. git remote remove name 
  9.  
  10. # 獲取指定遠(yuǎn)程倉庫的詳細(xì)信息 
  11. git remote show origin 
  1. # 添加所有的修改到Staging區(qū) 
  2. git add . 
  3. git add --all   
  4.  
  5. # 添加指定文件到Staging區(qū) 
  6. git add file    
  7.  
  8. # 添加多個修改的文件到Staging區(qū) 
  9. git add file1 file2    
  10.  
  11. # 添加修改的目錄到Staging區(qū) 
  12. git add dir 
  13.  
  14. # 添加所有src目錄下main開頭的所有文件到Staging區(qū)     
  15. git add src/main*   

git commit

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

git branch

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

git checkout

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

git tag

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

git push

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

git reset

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

git diff

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

git show

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

git log

  1. # 指定文件夾 log 
  2. git log --pretty=format:"%h %cn %s %cd" --author="iisheng\|勝哥"  --date=short src 
  3. # 查看指定用戶指定format 提交 
  4.   git log --pretty=format:"%h %cn %s %cd" --author=iisheng --date=short  
  5.  
  6. # 查看該文件的改動歷史 
  7. git log --pretty=oneline file 
  8.  
  9. # 圖形化查看歷史提交 
  10. git log --graph --pretty=oneline --abbrev-commit 
  11.  
  12. # 統(tǒng)計倉庫提交排名前5 
  13. git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5 
  14.  
  15. # 查看指定用戶添加代碼行數(shù),和刪除代碼行數(shù) 
  16. 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. # 將指定分支合并到當(dāng)前分支 
  2. git rebase branch-name 
  3.  
  4. # 執(zhí)行commit id 將rebase 停留在指定commit 處 
  5. git rebase -i commit-id 
  6.  
  7. # 執(zhí)行commit id 將rebase 停留在 項目首次commit處 
  8. git rebase -i --root 

git restore

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

git revert

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

Git騷操作

Git命令不能自動補全?(Mac版)

我見過有的人使用Git別名,反正因為有自動補全的存在,我從來沒用過Git別名。不過我的確將我的rm -rf命令替換成了別的腳本了...

安裝bash-completion

brew install bash-completion

添加 bash-completion 到~/.bash_profile:

  1. if [ -f $(brew --prefix)/etc/bash_completion ]; then 
  2.    . $(brew --prefix)/etc/bash_completion 
  3. 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 

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

  1. git push origin develop --force 

歷史commit作者郵箱寫錯了,怎么一次性改過來?使用git filter-branch命令。

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

  • OLD_EMAIL
  • CORRECT_NAME
  • CORRECT_EMAIL

腳本如下:

  1. #!/bin/sh 
  2.  
  3. git filter-branch --env-filter ' 
  4.  
  5. OLD_EMAIL="your-old-email@example.com" 
  6. CORRECT_NAME="Your Correct Name" 
  7. CORRECT_EMAIL="your-correct-email@example.com" 
  8.  
  9. if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] 
  10. then 
  11. export GIT_COMMITTER_NAME="$CORRECT_NAME" 
  12. export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" 
  13. fi 
  14. if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] 
  15. then 
  16. export GIT_AUTHOR_NAME="$CORRECT_NAME" 
  17. export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" 
  18. fi 
  19. --tag-name-filter cat -- --branches --tags 

強制推送替換

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

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

也是使用git filter-branch命令。

  1. git filter-branch --force --index-filter \ 
  2.   "git rm --cached --ignore-unmatch FILE-PATH-AND-NAME" \ 
  3.   --prune-empty --tag-name-filter cat -- --all 

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

  1. git push origin --force --all 

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

  1. git push origin --force --tags 

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

git reset --hard命令,執(zhí)行錯了,能恢復(fù)嗎?查看當(dāng)前commit log

 

誤操作git reset --hard 8529cb7

 

執(zhí)行g(shù)it reflog

 

還原到之前的樣子

 

公司使用GitLab,平時還用GitHub,多賬號SSH,如何配置?編輯 ~/.ssh/config文件 沒有就創(chuàng)建

  1. # github 
  2. Host github.com 
  3. Port 22 
  4. HostName github.com 
  5. PreferredAuthentications publickey 
  6. AddKeysToAgent yes 
  7. IdentityFile ~/.ssh/github_id_rsa 
  8. UseKeychain yes 
  9. User iisheng 
  10.  
  11. # gitlab 
  12. Host gitlab.iisheng.cn 
  13. Port 22 
  14. HostName gitlab.iisheng.cn 
  15. PreferredAuthentications publickey 
  16. AddKeysToAgent yes 
  17. IdentityFile ~/.ssh/gitlab_id_rsa 
  18. UseKeychain yes 
  19. User iisheng 

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

多用git rebase。

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

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

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

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

下面的圖是Guava項目的commit記錄。

 

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

原始Git提交記錄是這樣的

 

執(zhí)行g(shù)it rebase -i 070943d,對指定commitId之前的提交,進(jìn)行修改

 

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

git rebase -i非常實用,還可以將多個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í)行g(shù)it merge命令的時候,經(jīng)常會看到Fast-forward字樣,F(xiàn)ast-forward到底是個什么東西?

其實,git merge一般有三種場景。

快進(jìn)式合并

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

 

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

 

這個時候,我們將hotfix分支,merge到master,即執(zhí)行g(shù)it merge hotfix。

 

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

三方合并

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

 

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

 

這個時候,我們將feature分支,merge到master,即執(zhí)行g(shù)it merge feature。

 

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

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

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

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

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

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

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

  1. <<<<<<< HEAD 
  2. 111aaa 
  3. ======= 
  4. 111b 
  5. >>>>>>> dev 

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

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

  1. 111aaa 

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

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

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

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

  1. Merge branch 'dev' 
  2.    
  3. # Conflicts: 
  4. #       111.txt 
  5. # It looks like you may be committing a merge. 
  6. # If this is not correct, please remove the file 
  7. #       .git/MERGE_HEAD 
  8. and try again. 
  9.  
  10.  
  11. # Please enter the commit message for your changes. Lines starting 
  12. with '#' will be ignored, and an empty message aborts the commit
  13. On branch master 
  14. All conflicts fixed but you are still merging. 

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

詳解git rebase

rebase做了什么

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

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

 

使用rebase是下面這樣的。

 

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

變基實際上就是基于其他分支重塑當(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,總有人會說快照,快照是個什么鬼?

實際上,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í)行g(shù)it init初始化一個Git項目。

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

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

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

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

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

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

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

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

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

樹對象

數(shù)據(jù)對象大致對應(yīng)UNIX中的inodes或文件內(nèi)容,樹對象則對應(yīng)了UNIX中的目錄項。一個樹對象包含了一條或多條樹對象記錄(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. $ git write-tree 
  2. b716c7b049ccd9048b0566a57cfd516c17c1e39f 

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

  1. $ git cat-file -p b716c7b049ccd9048b0566a57cfd516c17c1e39f 
  2. 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. $ git log --oneline  
  2. 5281f7e (HEAD -> master) first commit 

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

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

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

標(biāo)簽對象

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

實際上Git中的各種對象都是類似的,只不過因為各種對象自身功能不同,存儲結(jié)構(gòu)不同而已。

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

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

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

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選項,即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一個本地分支。

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

參考文獻(xiàn):

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

本文轉(zhuǎn)載自微信公眾號「如逆水行舟」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系如逆水行舟公眾號。

 

責(zé)任編輯:武曉燕 來源: 如逆水行舟
相關(guān)推薦

2012-01-12 14:37:34

jQuery

2021-04-27 19:21:48

HBase原理開源

2009-02-24 09:43:00

IP電話原理

2011-11-29 12:17:00

2020-12-29 07:32:59

Redis 列表數(shù)據(jù)

2019-11-28 10:45:28

ZooKeeper源碼分布式

2016-08-18 00:04:09

網(wǎng)絡(luò)爬蟲抓取系統(tǒng)服務(wù)器

2010-08-20 13:29:33

OFDM

2013-04-07 14:09:55

Android應(yīng)用基本

2020-03-21 14:57:14

手機定位智能手機APP

2021-02-08 21:40:04

SockmapBPF存儲

2016-08-17 23:53:29

網(wǎng)絡(luò)爬蟲抓取系統(tǒng)

2009-06-11 09:56:09

MySQL Repli原理

2011-07-07 14:10:21

Cocoa 內(nèi)省 hash

2020-12-29 16:55:44

ZooKeeper運維數(shù)據(jù)結(jié)構(gòu)

2010-03-17 13:35:02

2010-03-18 20:13:03

Java socket

2011-07-07 14:46:10

Cocoa Xcode

2010-06-18 17:28:37

Linux Anacr

2019-04-30 08:15:31

點贊
收藏

51CTO技術(shù)棧公眾號

亚洲激情中文| 日本成人福利| 26uuuu精品一区二区| 国产97在线观看| 欧洲美熟女乱又伦| 91麻豆精品一二三区在线| 一区二区三区成人在线视频| 欧美剧在线免费观看网站| 亚洲二区三区四区| 午夜精品久久久久久久96蜜桃 | 亚洲精品久久久久中文字幕二区| 日韩黄色片视频| 男人天堂久久久| 国产精品69毛片高清亚洲| 欧美亚洲激情视频| 欧美日韩人妻精品一区二区三区| japanese色国产在线看视频| 久久综合色婷婷| 亚洲xxxx3d| 丰满人妻老熟妇伦人精品| 欧美一区激情| 尤物精品国产第一福利三区| 91视频在线免费| 97久久中文字幕| 91国产成人在线| 日韩精品一区二区三区四| 亚洲视频tv| 91蝌蚪porny| 春色成人在线视频| 中文字幕无线码一区| 先锋影音国产一区| 欧美日韩成人精品| 影音先锋男人资源在线观看| 久久不见久久见中文字幕免费 | 国产精品视频26uuu| 欧美一二三区视频| 国一区二区在线观看| 日韩最新中文字幕电影免费看| 日韩av三级在线| 麻豆av在线免费观看| 国产美女久久久久| 国产欧美久久一区二区| 中文字幕精品无| 亚洲区国产区| 久久青草福利网站| 国产在线观看你懂的| 欧美精品午夜| 欧美成人免费在线视频| 欧美老熟妇一区二区三区| 日韩欧美精品| 日韩网站免费观看高清| 亚洲精品国产精品乱码在线观看| 精品国产一级毛片| 亚洲精品美女免费| 波多野结衣办公室33分钟| 国产精品毛片视频| 精品国产成人系列| www国产视频| 极品av在线| 亚洲aaa精品| 波多野结衣之无限发射| av在线最新| 精品高清美女精品国产区| 欧美三级在线观看视频| 在线观看爽视频| 日本黄色一区二区| 国产九九在线观看| 国产精品xnxxcom| 亚洲综合av网| 加勒比成人在线| 忘忧草在线影院两性视频| 色婷婷亚洲综合| 成人免费毛片播放| 色婷婷成人网| 午夜视频久久久久久| 青青草视频在线免费播放| 亚洲黄色中文字幕| 欧美性色黄大片| 夜夜夜夜夜夜操| 91精品久久久久久综合五月天| 亚洲国产精品美女| 久久久久久国产免费a片| 亚洲精品一二三区区别| 欧美激情xxxx性bbbb| 在线免费黄色av| 久久99国产精品尤物| 97在线电影| 亚洲欧洲综合在线| 中文字幕亚洲视频| 日本wwwcom| 美脚恋feet久草欧美| 在线不卡一区二区| 污片免费在线观看| 水蜜桃久久夜色精品一区| 久久久久久久爱| 无码人妻久久一区二区三区| 国产麻豆成人传媒免费观看| 久久久久免费网| 久久亚洲天堂| 欧美性猛交xxxxx免费看| 樱花草www在线| 免费观看欧美大片| 欧美久久一区二区| 国产精品久久无码| 亚洲国产成人精品女人| 日本精品中文字幕| aaa一区二区三区| 美女视频黄免费的久久| 高清欧美电影在线| 中文字幕有码视频| 99国产欧美久久久精品| 国产精品永久免费视频| 亚洲精品久久久狠狠狠爱 | 九色91在线视频| 久久bbxx| 欧美亚洲免费在线一区| 久久久久久久无码| 亚洲欧美亚洲| 国产免费亚洲高清| 精品乱码一区二区三四区视频| 一区二区三区鲁丝不卡| 污污网站免费看| 亚洲精品小区久久久久久| 久久97久久97精品免视看| 91麻豆精品在线| 91网址在线看| 日韩伦理在线免费观看| 美女日韩一区| 久久精品视频99| 亚洲午夜在线播放| 久久精品夜色噜噜亚洲a∨| 岛国大片在线播放| 日韩视频一二区| 大胆欧美人体视频| 亚洲综合图片一区| 久久精品官网| 久久久婷婷一区二区三区不卡| 欧美xxxx性xxxxx高清| 51精品视频一区二区三区| 深爱五月综合网| 久久一区二区三区喷水| 国产精品久久久久久久7电影| 青青久草在线| 欧美日韩精品在线| 中文字幕影片免费在线观看| 最新亚洲视频| 国产女人水真多18毛片18精品| 18+激情视频在线| 91精品国产综合久久福利| 九九精品视频免费| 久久国产免费看| 中国成人亚色综合网站| 日韩电影免费观看高清完整版在线观看| 这里精品视频免费| 中文字幕视频二区| 国产精品灌醉下药二区| 91小视频在线播放| 一个色综合网| 鬼打鬼之黄金道士1992林正英| 先锋成人av| 精品国内片67194| 中日韩精品视频在线观看| 91小视频在线免费看| av动漫免费看| 色喇叭免费久久综合| 91免费电影网站| 污的网站在线观看| 亚洲精品国产综合久久| 成人av网站在线播放| 国产精品美日韩| 手机在线播放av| 影音先锋中文字幕一区二区| 久久综合九色欧美狠狠| 91九色综合| 欧美裸身视频免费观看| 天堂在线观看视频| 欧美在线观看视频在线| 51精品免费网站| 成人动漫中文字幕| 在线免费一区| 亚洲午夜免费| 奇米影视亚洲狠狠色| porn亚洲| 欧美va亚洲va在线观看蝴蝶网| 日韩网红少妇无码视频香港| 国产日产欧美一区二区视频| 免费人成自慰网站| 免费欧美视频| 91麻豆桃色免费看| 性爽视频在线| 久久亚洲成人精品| 视频在线观看你懂的| 日韩欧美精品网站| 午夜国产福利一区二区| 久久新电视剧免费观看| 精品国产乱码久久久久久1区二区| 亚洲成人直播| 亚洲精品一品区二品区三品区| 在线日韩成人| 国产精品视频成人| 91久久大香伊蕉在人线| 丰满熟妇人妻中文字幕| 国产亚洲午夜高清国产拍精品| 粉色视频免费看| 国产成人3p视频免费观看| 国产日韩欧美91| 欧美久久天堂| 久青草国产97香蕉在线视频| 欧美白人做受xxxx视频| 欧美一级片免费看| 国产熟妇一区二区三区四区| 亚洲精品老司机| 欧美视频国产视频| 在线欧美不卡| 国产精品波多野结衣| 综合国产视频| 99中文字幕| ww久久综合久中文字幕| 91极品视频在线| 91亚洲天堂| 最新国产成人av网站网址麻豆| 无码国产精品一区二区色情男同 | 中文字幕91爱爱| 精品久久久久久亚洲国产300| 中文乱码字幕高清一区二区| 久久久精品免费免费| 国产人妻黑人一区二区三区| 国产一区高清在线| 婷婷免费在线观看| 日日噜噜夜夜狠狠视频欧美人| 国产自产在线视频| 亚洲欧美一区在线| 欧美人与动牲交xxxxbbbb| 国产精品视频一区视频二区| 日本一欧美一欧美一亚洲视频| 国产精品探花在线| 欧美超级免费视 在线| 日本中文字幕在线视频| 亚洲性视频网站| 三级国产在线观看| 日韩精品免费综合视频在线播放| 国产福利第一页| 7777精品伊人久久久大香线蕉| 无码人妻精品一区二区三区蜜桃91| 精品久久久久久| 国产情侣在线视频| 精品福利在线视频| 欧美三级韩国三级日本三斤在线观看 | 欧美精品三级日韩久久| 中文字幕欧美人妻精品| 欧美婷婷六月丁香综合色| 少妇无套内谢久久久久| 欧美无砖砖区免费| 国产一区二区三区三州| 7777女厕盗摄久久久| 国产毛片一区二区三区va在线| 91精品国产综合久久精品app| 97成人免费视频| 日韩一区二区视频| 狠狠人妻久久久久久综合麻豆| 日韩欧美国产一二三区| 亚洲国产av一区二区| 精品国产乱码久久久久久图片| 欧美自拍偷拍第一页| 日韩av在线资源| 欧洲伦理片一区 二区 三区| 国产偷亚洲偷欧美偷精品| 午夜影院免费体验区| 亚洲人成网在线播放| 国产黄色片在线观看| 色婷婷成人综合| 羞羞污视频在线观看| 性欧美xxxx交| 91美女视频在线| 精品国产拍在线观看| 中文字幕伦理免费在线视频 | 丝袜老师在线| 国产成人一区三区| 97精品资源在线观看| 都市激情久久久久久久久久久| 欧美日韩导航| 五月天亚洲综合小说网| 天天射成人网| 日韩亚洲欧美视频| 日日夜夜精品视频免费| 一级黄色大片儿| av一区二区三区四区| 国产91丝袜美女在线播放| 亚洲欧美经典视频| 欧美三级一区二区三区| 国产精品成人免费在线| 婷婷色中文字幕| 黑人欧美xxxx| 国产视频一区二区三| 日韩电视剧免费观看网站| 高h视频在线| 久久久久久97| 成人午夜一级| 国内视频一区| 99视频精品全国免费| 黄页免费在线观看视频| 日本aⅴ精品一区二区三区| 日韩精品aaa| 久久久国产午夜精品| 久久久精品国产sm调教网站| 色素色在线综合| 亚洲男女视频在线观看| 一区二区亚洲欧洲国产日韩| 欧美大片黄色| 国产免费一区视频观看免费| 欧美电影在线观看免费| 最新国产精品久久| 老**午夜毛片一区二区三区 | 欧美中文高清| 日韩精品欧美在线| 最新日韩在线| 苍井空张开腿实干12次| 国产精品久久夜| 免费看日批视频| 亚洲精品一区二区三区四区高清| 求av网址在线观看| 日韩美女av在线免费观看| 国产精品久久久久av蜜臀| 天天综合五月天| 蜜臀av一区二区在线观看| 中文字幕av网址| 亚洲va韩国va欧美va精品| 国产aⅴ一区二区三区| 综合国产在线视频| 亚洲福利影院| 精品在线观看一区二区| 亚洲午夜一级| 制服.丝袜.亚洲.中文.综合懂| 国产精品国产三级国产三级人妇| 精品久久久久久久久久久久久久久久| 精品久久久久久久久久久院品网 | 91精品推荐| www.se五月| 国产精品美日韩| 中文字幕一区二区在线视频| 国产亚洲欧美aaaa| 国产超碰精品| 日韩国产在线一区| 久久婷婷一区| 久久久久久久久久久久| 久久久影视传媒| 国产美女激情视频| 精品伊人久久97| 综合久久2023| 欧美三级网色| 日本成人小视频| 国产精品波多野结衣| 久久精品国产一区二区| 亚洲欧美卡通动漫| 91精品国产入口| 尤物视频在线看| 国产伦理一区二区三区| 亚洲激情社区| 搡老熟女老女人一区二区| 色综合久久88色综合天天6| 国产在线中文字幕| 国产精品日韩精品| 亚洲高清影视| 国模私拍在线观看| 色综合久久88色综合天天免费| 在线观看精品一区二区三区| 91精品国产综合久久男男 | 国产96在线亚洲| 日韩在线综合网| 国产亚洲污的网站| 一卡二卡在线视频| 欧美激情精品在线 | 亚洲区一区二区三区| 精品一区二区在线播放| 青草草在线视频| 精品国产精品网麻豆系列| 成人日韩在线| 欧美aaa在线观看| 成人av网址在线观看| 日韩欧美国产另类| 久久夜色精品亚洲噜噜国产mv| 成人另类视频| 精品少妇无遮挡毛片| 亚洲男同性恋视频| 婷婷丁香花五月天| 国产综合香蕉五月婷在线| 国内久久视频| 我不卡一区二区| 亚洲成人黄色网| 日本在线视频一区二区| 800av在线免费观看| 久久久蜜臀国产一区二区| 亚洲最新av网站| 69久久夜色精品国产69乱青草| 成人精品天堂一区二区三区| 俄罗斯女人裸体性做爰| 日本韩国欧美在线| 日本电影在线观看| 性欧美精品一区二区三区在线播放| 国产宾馆实践打屁股91|