1. 程式人生 > >git原理和使用

git原理和使用

1、HEAD是什麼?
git中每提交一次,會產生一個commitId,是一個hash值
HEAD代表的是當前版本,也就是最新一次提交的commitId,上一個版本是HEAD^,上上個版本是HEAD^^,上100個版本HEAD~
其實HEAD只是一個指標,指向當前版本。在使用reset命令進行版本回退或者前進(可以前進,只要有commitId),只是HEAD指標變化同時更新工作區。


2、git物件


git是一套內容定址檔案系統。意思是:git會簡單儲存鍵值對。可以插入任何內容(變更檔案的快照),返回一個鍵值,然後通過該鍵值可以取出內容。
git的底層命令hash-object,這個命令可以將任何資料儲存到.git/objects目錄下,並返回鍵值。
如:$ echo 'test content' | git hash-object -w --stdin
可以通過cat-file命令取回該值
如:git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4


git commit就相當於:
$ echo 'version 1' > test.txt
$ git hash-object -w test.txt
將最新的檔案新增到檔案庫中。


git reset就相當於:
$ git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30 > test.txt
將檔案取出並覆蓋到原始檔


--blob物件,儲存變更檔案快照
--tree物件。tree中儲存了倉庫下的目錄情況
git所有物件以tree或blob物件儲存,tree相當於目錄,blob相當於檔案內容。
git的write-tree命令可以根據檔案的index建立tree物件,當將檔案放入暫存區中時,會自動建立index檔案。
--commit物件,記錄頂層樹物件,作者資訊,時間戳,註釋資訊。提交之後commit中儲存的是頂級的tree目錄的資訊。


常用命令:
檢視日誌:
git log --pretty=oneline:檢視提交記錄,reset後會看不到之前的提交記錄
git reflog:檢視所有操作記錄
恢復操作:
git checkout .  或 git checkout -- filename// 將工作區未add的恢復到原來狀態
git stash  // 將未提交的修改暫存到stash。並清除工作區,git stash pop恢復
git reset HEAD . 或 git reset HEAD filename  // 撤銷已經add的檔案
git reset --hard HASH // 恢復到某個提交點,不保留修改  版本號不需要寫全,足夠查詢就可以了。
git reset --soft HASH // 恢復到某特提交的,保留修改
比較命令:
git diff  // 比較工作區和暫存區
git diff HEAD // 比較工作區和本地倉庫
git diff --cached  // 比較暫存區和本地倉庫
提交命令:

git commit -am "comments" //可以直接提交

git本地建立倉庫並推送到遠端分支:

git init 生成一個 .git目錄 -- 可以本地進行提交等操作了

git remote add -m <master> <remoteName> <url> #可以建立一個遠端倉庫

在本地commit一下,會自動生成master分支 #剛初始化倉庫後無法使用分支,需要進行一次commit,會自動建立master分支

git push --set-upstream origin master #建立本地與遠端分支關聯,並推送到遠端分支

git remote 可以檢視遠端倉庫的設定,初始化的時候是沒有的
git remote -v 檢視詳細遠端倉庫設定
.gitignore檔案不會預設生成,需要自己建立
目前remote和本地還未建立聯絡,git fetch沒有效果,但是可以git fetch <remote-name>
也可以通過git push <remote-name> <local_branch> : <remote_branch>
之後就有遠端分支了