GIT+IDEA使用

基本事實

1、git 的clone和其他vcs的checkout有本質區別,clone時,獲取的是整個倉庫的幾乎所有數據,遠程倉庫的每一個文件的每一個版本都會被拉取下來。命令格式:git clone [url] [mydir]。舉例:    git    clone    https://github.com/libgit2/libgit2。這會在當前目錄下創建一個名爲    “libgit2”    的目錄,並在這個目錄下初始化一個    .git    文件夾,從遠程倉庫拉取下所有數據放入    .git    文件夾,然後從中讀取最新版本的文件的拷貝。如果你進入到這個新建 的    libgit2    文件夾,你會發現所有的項目文件已經在裏面了,準備就緒等待後續的開發和使用。

 

2、git add 這個命令是“添加內容到下一次提交中”而不是“將一個文件添加到項目中”,所以,當你修改了一個版本庫裏存在的文件時,也是需要運行git add的,這一步被很多工具默認做了,所以你沒有察覺,但你必須知道這件事。舉例:你修改了一個庫裏的文件,運行了git add,然後再次修改保存了,然後運行git status,你會發現,這個文件同時存在於暫存區和非暫存區,如果你直接git commit,那麼第二次的修改不會被提交,因爲commit只會提交暫存區的內容。同時,也說明了暫存區的含義,下次提交區域,和文件是否是首次加入倉庫沒有關係。

3、如果你使用clone命令克隆了一個倉庫,命令會自動將其添加爲遠程倉庫並默認以“origin”爲簡寫。他是包含了一個添加遠程倉庫的動作的,這點你必須知道。手動添加遠程倉庫的命令是 git    remote    add    <shortname>    <url>。添加遠程倉庫並不會拉取數據下來,只是記錄了遠程倉庫的地址等基本信息。如果你想拉取倉庫內容下來,可以git    fetch    shortname。這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。執行完成後,你將會擁有那個遠程倉庫中所有 分支的引用,可以隨時合併或查看。也即你可以跟蹤遠程倉庫的所有內容了。默認情況下, git    clone    命令會自動設置本地    master    分支跟蹤克隆的遠程倉庫的    master 分支(或不管是什麼名字的默認分支)。

4、Git 保存的不是文件的變化或者差異(SVN是),而是一系列不同時刻的文件快照。每次 你提交更新,或在    Git    中保存項目狀態時,它主要對當時的全部文件製作一個快照並保存這個快照的索引。    爲了高效,如果文件沒有修改,Git    不再重新存儲該文件,而是隻保留一個鏈接指向之前存儲的文件。Git對待數據更像是一個快照流。

5、git中,checkout是切換分支,切換分支,切換分支。當你切換分支的時候, Git 會重置你的工作目錄, 使其看起來像回到了你在那個分支上最後一次提交的樣子。 Git 會自動添加、 刪除、 修改文件以確保此時你的工作目錄和這個分支最後一次提交時的樣子一模一樣。由於 Git 的分支實質上僅是包含所指對象校驗和( 長度爲 40 的 SHA-1 值字符串) 的文件, 所以它的創建和銷燬都異常高效。 創建一個新分支就像是往一個文件中寫入 41 個字節( 40 個字符和 1 個換行符) 。

6、變基操作能將某一分支的修改移至另一分支,這樣操作能起到merge同樣的效果,並且能讓提交鏈路由岔路變成直線。
 


 

 

 

 

說git是分佈式的?

git沒有服務端和客戶端之分,大家統一安裝git軟件,這和svn有本質區別,svn服務端和客戶端是不同的安裝軟件。分佈式不代表沒有服務器,在哪個機器上創建了master分支,那麼那個機器就會是中心(遠程服務器),大家會往他那裏提交代碼,由他來合併,也就是說,這個中心是依賴主觀人爲形成的,而不是靠客觀技術手段約束形成的。雖然git是分佈式的,但是我們多數情況下還是需要一個服務器,因爲要多終端或者多人協作,這種情況必須有人充當服務端。也就是還是要有個中心,雖然人人可以當中心,但最終還是有一箇中心。

git init // 會默認創建一個名字爲master的分支

git add readme.txt

git commit -m "wrote a readme file"

如果你是在本機上創建的版本庫,在本機上就不需要push了,push是個會發生網絡通信的命令,會推送本地版本信息到指定的遠程主機的版本庫裏。現在大家在公司的使用方式通常是公司搭建了服務端,所有員工都是客戶端,項目經理在遠程機器上初始化版本庫(創建了master分支),然後創建開發分支x,讓多個開發同事拉取分支x,然後多個同事同時在分支x上開發,pull,commit和push等,分支x發完版後,將分支x合併到master分支,然後從master上再創建分支y,繼續類似分支x的操作。

常用命令

git checkout master // 切換到master分支

git checkout -b dev // 從當前分支創建新分支dev並切換到新分支dev

git checkout -b dev master // 從指定分支master創建新分支並切換到新分支

git branch dev // 從當前分支創建新分支dev

 

什麼是分支?

分支是一個commit對象鏈,一條工作記錄線,git每一次提交,都會在該次提交記錄上存一個字段parent,記錄的是上一個提交的版本號,這樣就可以從一個提交的快照裏拿到之前所有提交過的記錄。每個分支都有一個名字。新建一個分支就是新建一個指向某個提交記錄的指針。拉取的分支可以建立在任意分支基礎上,不一定非要從master上拉取,但是一般都是從master上拉取,然後合併回master。

 

HEAD是什麼?

用來指向分支的指針,指向當前分支的一個指針,用來快速定位當前操作目標分支。git會有多個分支,你可以隨意切換,切換操作改變的是HEAD的指向,你的操作都是針對HEAD指向的分支進行的,所以操作前先確定自己的分支。

 

origin是什麼?

遠程倉庫名字 “origin” 與分支名字 “master” 一樣,在 Git 中並沒有任何特別的含義一樣。 同時“master”是當你運行git init時默認的起始分支名字,原因僅僅是它的廣泛使用,“origin” 是當你運行 git clone 時默認的遠程倉庫名字。 如果你運行 git clone -o booyah,那麼你默認的遠程分支名字將會是 booyah/master。

但是origin 並不是指的遠程的倉庫,而是指得是遠程倉庫在本地副本的一個指針(這個指針有可能過時的)。當我們使用merge 的時候,我們進行合併的時候只是上一次fetch 從遠程拿到的版本。不是遠程倉庫的最新版本。

 

idea右下角顯示分支不及時?

vcs -> git - fetch

 

 

 

 

 

 

發佈了187 篇原創文章 · 獲贊 27 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章