天天看點

Git學習筆記

這是之前學Git記下的筆記,以前傻乎乎的用指令行,現在發現用小烏龜更友善。

轉載注明出處哦:http://www.cnblogs.com/stonehat/

1    基本概念

Stage:暫存區,緩存區

Repository:倉庫(本地倉庫).git目錄

Remote:遠端倉庫

Track: 将一個新檔案加入到git

Unstage:取消放入暫存區

Git存儲原理:

Git doesn’t store data as a series of changesets or differences, but instead as a series of snapshots。Git 儲存的不是檔案差異或者變化量,而隻是一系列檔案快照。

快照管理:(微型檔案系統,檔案指紋驗證是否變化,不便的直接連結)

Git學習筆記

三種區域:

Git學習筆記

所有資料存放在本地.git目錄,可以直接拷貝。

2              基本操作

2.1             倉庫建立

Git init

2.2             倉庫複制

Git clone  url

隻會複制master下來

Git clone  url dir

指定檔案夾

git clone https://github.com/libgit2/libgit2 mylibgit

2.3             檔案管理

2.3.1        添加檔案到暫存區

Git add *

Git add file

Git add dir       

2.3.2        删除檔案到暫存區

Git rm

2.3.3        修改檔案名(移動)到暫存區

Git mv [file-orgin]  [file-rename]

2.3.4        送出暫存區到倉庫

Git commit –m “注釋”

Git學習筆記

2.3.5        撤銷修改檔案

修改的檔案可以在git status觀察到

如果撤銷修改,

可以采用git checkout -- file的方式撤銷

撤銷所有

git checkout  -- *

2.3.6        撤銷暫存區資料

Git學習筆記

2.4             分支管理

檢視分支:git branch

建立分支:git branch <name>

切換分支:git checkout <name>

建立+切換分支:git checkout -b <name>

合并某分支到目前分支:git merge <name>

         預設使用fast-forward模式

Git學習筆記

         可以禁用,合并時會生成一個新的commit

         git merge --no-ff -m "merge " dev

删除分支:git branch -d <name>

Git學習筆記

遠端分支下載下傳:git checkout -b <本地分支名> origin/<遠端分支名>

 合并沖突:

 當merge出現沖突的時候,git會提醒

Git學習筆記

需要手動修改後進行送出

Git add

Git commit

2.5             版本管理

每個送出都是一個版本,git提供了一些友善的指令供我們使用。

2.5.1        檢視日志

Git log

         目前分支的commit曆史

                   有用的配置

log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Git學習筆記

Git reflog

         顯示引用變化曆史,相當于head變化

Git學習筆記

2.5.2        版本回退:

一個git reset --hard HEAD^

倆git reset --hard HEAD^^

多個git reset --hard HEAD~數字

回退到指定版本

git reset --hard commit_id

commitid可以從reflog或者log中檢視

--hard表示丢棄暫存區的東西

--soft – 暫存區和工作目錄都不會被改變,改變都放在暫存區

--mixed – 預設選項。緩存區和你指定的送出同步,但工作目錄不受影響,改變不會放在暫存區。

--hard – 緩存區和工作目錄都同步到你指定的送出

Git revert

reset是指将目前head的内容重置,不會留任何痕迹。

revert是撤銷某一次送出,但是這次撤銷也會作為一次送出進行儲存

假設目前有3個commit,git log如下:

commit3:  add test3.c 

commit2:  add test2.c 

commit1:  add test1.c 

執行 git revert HEAD~1之後,會提示送出資訊,送出後git  log如下:

commit4:  Reverts “test2.c” 

commit3:  test3.c 

commit2:  test2.c 

commit1:  test1.c 

執行完後,test2.c被删除了,運作git status,無任何變化。

執行 git reset HEAD~1之後,再次看git log,如下:

執行完後,commit3被删除了;但是test3.c還在本地緩存區,運作git  status,可以看見提示test3.c可以用git add包含該檔案。

若執行git reset --soft HEAD~1,log為:

執行完後,test3.c也被删除了,檢視git  status,提示可以commit以送出test3.c,test3.c在暫存區。

若執行git reset --hard HEAD~1,log為:

執行完後,test3.c也被删除了,檢視git  status,無任何變化。

2.6             标簽管理

2.6.1        打标簽

相當于給某個送出取一個好記住的名字,例如v1.0.0

git tag v1.0.0 [commitid]

2.6.2        顯示所有标簽

git tag

2.6.3        顯示标簽資訊

Git show tagname

2.6.4        标簽管理

指令git push origin <tagname>可以推送一個本地标簽;

指令git push origin --tags可以推送全部未推送過的本地标簽;

指令git tag -d <tagname>可以删除一個本地标簽;

指令git push origin :refs/tags/<tagname>可以删除一個遠端标簽。

2.7             遠端管理

一般都要和兩部分人提供

2.7.1        git clone

從遠端主機克隆一個版本庫

git clone <版本庫的網址> <本地目錄名>

Git學習筆記

2.7.2        git remote

為了便于管理,Git要求每個遠端主機都必須指定一個主機名。git remote指令就用于管理主機名。

列出所有主機:git remote

帶網址列出主機:git remote –v

clone版本庫的時候,所使用的遠端主機自動被Git命名為origin。如果想用其他的主機名,需要用git clone指令的-o選項指定。

git clone -o jQuery https://github.com/jquery/jquery.git

git remote show指令加上主機名,可以檢視該主機的詳細資訊。

 git remote show <主機名>

git remote add指令用于添加遠端主機。

 git remote add <主機名> <網址>

git remote rm指令用于删除遠端主機。

 git remote rm <主機名>

git remote rename指令用于遠端主機的改名。

 git remote rename <原主機名> <新主機名>

2.7.3        git fetch

将某個遠端主機的更新,全部取回本地。

如果隻想取回特定分支的更新,可以指定分支名。

git fetch <遠端主機名> <分支名>

所取回的更新,在本地主機上要用"遠端主機名/分支名"的形式讀取。比如origin主機的master,就要用origin/master讀取。

git branch  –r,可以用來檢視遠端分支,

-a選項檢視所有分支。

 可以采用git checkout <遠端主機名>/ <分支名>切換到該分支

但是一般用

git checkout -b newBrach <遠端主機名>/ <分支名> ,意思是在<遠端主機名>/ <分支名>的基礎上,建立一個新分支。

也可以使用merge,合并遠端分支。

2.7.4        git pull

取回遠端主機某個分支的更新,再與本地的指定分支合并。

git pull <遠端主機名> <遠端分支名>:<本地分支名>

等同于先做git fetch,再做git merge

2.7.5        git push

指令用于将本地分支的更新,推送到遠端主機。

git push <遠端主機名>  <本地分支名>:<遠端分支名>

省略遠端分支名,表示将本地分支推送與之存在"追蹤關系"的遠端分支(通常兩者同名),如果該遠端分支不存在,則會被建立。

省略本地分支名,則表示删除指定的遠端分支

如果目前分支與遠端分支之間存在追蹤關系,則本地分支和遠端分支都可以省略。

如果本地版本低,那麼會報錯,可以--force強制push,--tags表示也推送tags.

git push --force origin

2.7.6        将本地庫推到遠端端

git push origin master

2.8             自定義Git

2.8.1        自定義指令

可以利用git config指令來給指令取别名。

例如

git config --global alias.co csheckout

git config --global alias.ci commit

git config --global alias.br branch

git config --global alias.unstage 'reset HEAD'

其中,global表示針對目前使用者所有倉庫都起作用。如果不加,表示隻對目前倉庫有用,每個倉庫的Git配置檔案都放在.git/config檔案中:

目前使用者的config存放在使用者主目錄下的一個隐藏檔案.gitconfig中:

2.8.2        忽略檔案

為了防止沒用的檔案被提醒untracked,可以在git倉庫主目錄下添加.gitignore檔案(本身要放到版本庫裡面),該檔案可以配置git要忽略哪些檔案,不添加到倉庫中。

Git學習筆記
Git學習筆記

如果發現不能添加檔案,可以采用

git check-ignore -v file檢查被哪個規則忽略了。

作弊碼

Git學習筆記
Git學習筆記

轉載請注明出處:http://www.cnblogs.com/stonehat/