首頁  >  文章  >  開發工具  >  詳細介紹的git使用

詳細介紹的git使用

coldplay.xixi
coldplay.xixi轉載
2021-04-28 17:07:073415瀏覽

詳細介紹的git使用

1、Git概念

1.1. Git库中由三部

Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git目录位于工作目

1) 工作目录:用户本地的

2) Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Git 称该区域为

3) 仓库:将索引通过commit命令提交至仓库中,每一次提交都意味着版本在进行一次

推荐(免费):git

1.2. 使用Git时的

1.2.1. Git初始

1) 配置使用git仓库的人

git config --global user.name "Your Name Comes He

2) 配置使用git仓库的人员em

git config --global user.email you@yourdomain.example.

1.2.2. Git文档忽

工作目录中有一些文件是不希望接受Git 管理的,譬如程序编译时生成的中间文件等等。Git 提供了文档忽略机制,可以将工作目录中不希望接受Git 管理的文档信息写到同一目录下的.gitignore 文

例如:工作目录下有个zh目录,如果不想把它加入到Git管理中,则

echo “zh” > .gitign

git ad

有关gitignore 文件的诸多细节知识可阅读其使用手册:man gitign

1.3. Git与Repo

Git操作一般对应一个仓库,而Repo操作一般对应一个项目,即一个项目会由若干仓库

例如,在操作整个Recket项目时使用Repo,而操作其中的某个仓库时使用Git。在包含隐藏目录.git的目录下执行git

2. Gi

Git help 获取git基

(如果要知道某个特定命令的使用方法,例如:使用Git help clone,来获取git clone的使用

3. Git本地

3.1. Git i

或者使用git init-

创建一个空的Git库。在当前目录中产生一个.git 的子目录。以后,所有的文件变化信息都会保存到这个目录下,而不像CVS那样,会在每个目录和子目录下都创建一个CVS

在.git目录下有一个config文件,可以修改其中的配置

3.2. Git 

将当前工作目录中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的

可以递归添加,即如果后面跟的是一个目录作为参数,则会递归添加整个目录中的所有子目录和文件。

git add dir1 ( 添加dir1这个目录,目录下的所有文件都被加

Git add f1 f2 ( 添加f1,f2

git add . ( 添加当前目录下的所有文件和子目

3.3. Git

从当前的工作目录中和索引中删除

可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件。

git rm –r * (進入某個目錄中,執行此語句,會刪除該目錄下的所有檔案和子

git rm f1 (刪除檔案f1,包含本機目錄和index中的此文件

git rm --ached f1 (刪除文件f1,不會刪除本地目錄文件,只刪除index中的文件記錄;將已經git add的文件remove到cache中,這樣commit的時候不會提交這個文件, 適用於一下子添加了很多文件, 卻又想排除其中個別幾個文件的情

#3.4. Git com

提交當前工作目錄的修改

直接呼叫git commit指令,會提示填寫註解。透過以下方式在命令列就填寫提交註解:git commit -m "Initial commit of gittutor reposistory"。注意,和CVS不同,git的提交註解必須不能為空,否則就會提交

git commit還有一個-a的參數,可以將那些沒有透過git add標識的變化一併強行提交,但是不建議使用這種

每一次提交,git就會為全域程式碼建立一個唯一的commit識別碼,使用者可以透過git reset指令恢復到任何一次提交時的

git commit –-amend –m “message”(在一個commit id上不斷修改提交的

3.5. Git sta

查看版本庫的狀態。可以得知哪些文件發生了變化,哪些文件還沒有添加到git庫中等等。建議每次commit前都要透過該指令確認庫

最常見的誤操作是, 修改了一個文件, 沒有調用git add通知git庫該文件已經發生了變化就直接調用commit操作, 從而導致該文件並沒有真正的提交。這時如果開發者以為已經提交了該文件,就繼續修改甚至刪除這個文件,那麼修改的內容就沒有通過版本管理起來。如果每次在提交前,使用git status查看一下,就可以發現這種錯誤。因此,如果呼叫了git status指令,一定要格外注意那些提示為「Changed but not updated:」的檔案。 這些檔案都是與上次commit相比發生了變化,但是卻沒有透過git add標識的

3.6. Git 

查看歷史日誌,包含每次的版本變更。每次版本變更對應一個commit 

Git log

#-1的意思是只顯示一個commit,如果要顯示5個,就-5。不指定的話,git log會從該commit一直往後

Git log --stat –summary (顯示每次版本的詳細

在專案日誌資訊中,每個日誌的首行(就是那一串字元)為版本更新提交所進行的命名,我們可以將該命名理解為項目版本號。項目版本號應該是唯一的,預設由Git 自動生成,用以標示項目的某一次更新。如果我們將項目版本號用作git-show 指令的參數,即可查看該次項目版本的更新細節。

1) Git 

2)Git

實際上,上述指令並非是真正的進行版本號自定義,只是製造了一個tag物件而已,這在進行專案版本對外發佈時

3.7. Git me

把伺服器上下載下來的程式碼和本機程式碼合併。或進行分支

例如:目前在master分支上,若想將分支dev上的合併到master上,則git merge 

注意:git merge nov/eclair_eocket (是將伺服器git庫的eclair_eocket分支合併到本地分

git rebase nov/eclair_eocket (是將伺服器git庫的eclair_eocket分支映射到本地的一個臨時分支上,然後將本地分支上的變化合併到這個臨時分支,然後再用這個暫存分支初始化本地

3.8. Git d

把本地的程式碼和index中的程式碼做比較,或是把index中的程式碼和本地倉庫中的程式碼進行

1) Git d

比較工作目錄和Index中的

2) Git diff - - cac

比較index和本地倉庫中的

#3.9. Git check

3.9.1. 切換

# 1) 建立一個新分支,並切換到該

Git checkout –b 新

2)切換到某個已經建立的本地分支local_bra

Git checkout local_bra

(使用cat .git/HEAD後,顯示refs:refs/heads/ local_bran

3) 切換到伺服器上的某個分支remote_bra

#Git checkout remote_bra

(遠端分支remote_branch可以透過git branch –r 

4) 切換到某個commit

Git checkout commit

#(使用cat .git/HEAD後,顯示commit_

5) 切換到某個

Git checkout 

(使cat .git/HEAD後,顯示t


#注意: 除了1)和2)外,其餘三種都只是切換到了一個臨時的( no branch )狀態(this head is detached),這時用git branch 可以看到處於(no branch)上, cat .git/HEAD 看到指向對應的commit id。這個(no branch)只是臨時存在的,並不是一個真正建立的branch。如果此時執行2),則這個(no branch)就自動消失了;如果執行1), 則建立新分支new branch,並把這個(no branch)掛到這個新分支上,此時cat .git/ refs/heads/new_branch 可以看到已經指向了剛才那個commit 


#3.9.2. 用已有分支初始化


#執行下面的指令,在切換到某個已經建立的local branch或某個remote branch或某個commit id 或某個tag的同時,建立新分支new_branch,並且掛到這個新分


1) 切換到某個已經建立的本地分支local_branch,並且使用此分支初始化一個新分支new_bran


#git checkout –b new_branch local_bra


2) 切換到某個遠端分支remote_branch,並且用此分支初始化一個新分支new_bran


#Git checkout –b new_branch remote_bra


#3) 切換到某個commit id,並建立新分支new_bra


##Git checkout –b new_branch commit


#4) 切換到某個tag,並建立新分支new_bra


#Git checkout –b new_branch 


#3.9.3. 也


例如「git checkout app/model/ user.rb” 就會將user.rb檔案從上一個已提交的版本更新回來,未提交的工作目錄中的內容全部會被




3.10. Git-ls


#查看目前的git庫中有那些


3.11. Git


重命名一個檔案、目錄或


例如:Git mv helloworld.c helloworld1.c (把檔案helloworld.c 重新命名為helloworld1


3.12. Git bra


#3.12.1.


在git 版本庫中建立分支的成本幾乎為零,所以,不必吝嗇多建立幾個分支。當第一次執行git init時,系統就會建立一個名為「master」的分支。而其它分支則透過手動


下面列舉一些常見的分支


建立一個屬於自己的個人工作分支,以避免對主分支master 造成太多的干擾,也方便與他人交流


當進行高風險的工作時,創建一個試驗性的


#合併別人的工作的時候,最好是創建一個暫時的分支用來合併,合併完成後再「fetch」到自己的


對分支進行增、刪、查等


注意:分支資訊一般在.git/refs/目錄下,其中heads目錄下為本機分支,remotes為對應伺服器上的分支,tags為


##3.12.2 . 查


git branch 列出本機git庫中的所有分支。在列出的分支中,若分支名前有*,則表示此分支為目前


git branch –r 列出伺服器git庫的所有


(可以繼續使用指令「git checkout -b 本地分支名稱伺服器分支名稱」來取得伺服器上某一分支的程式碼文字


#3.12.3. 查看目前在哪個


cat .git/H


3.12.4. 建立一


1)git branch 


雖然建立了分支,但是不會將目前工作分支切換到新建立的分支上,因此,還需要命令「git checkout 分支名」來


2) git checout –b 


#不但建立了分支,也將目前工作分支切換到了該分


#3.12.5. 切換到某個分支:git checkout 


切換到主分支:git checkout mas


3.12.6. 刪除


git branch –D 





#注意: 刪除後,發生在該分支的所有變更都無法恢復。強制刪除此


3.12.7. 比較兩個分支上的檔案


######git diff master 分支名稱(比較主分支和另一個分支的###############3.12.8. 檢視分數##############git-show-branch (查看目前分支的提交註解及############

git-show-branch -all(查看所有分支的提交註解及資訊)


* [dev]


! [master]



* [dev] 


* [dev^]


* [dev~2]


* [master]


在上述範例中,「--」之上的兩行表示有兩個分支dev和master, 且dev分支上最後一次提交的日誌是「d2」,master分支上最後一次提交的日誌是「m2」。 「--」之下的幾行表示了分支演化的歷史,其中 dev表示發生在dev分支上的最後一次提交,dev^表示發生在dev分支上的倒數第二次提交。 dev~2表示發生在dev分支上的倒數第三次


3.12.9. 查看目前分支的操


git whatchan


3.12.10. 合







#git merge 「註解」 合併的目標分支合併的來


如果合併有衝突,git會有


例如:git checkout master (切換到master


#git merge HEAD dev~2 (合併master分支和dev~2分支)或: git merge master de



#git pull 合併的目標分支合併的來


例如: git checkout master (切換到master


git pull . dev~2(合併目前分支和dev~2


3.13. Git reb


#一般在將伺服器最新內容合併到本地時使用,例如:在版本C時從伺服器取得內容到本地,修改了本地內容,此時想把本地修改的內容提交到伺服器上;但發現伺服器上的版本已經變成G了,此時就需要先執行Git rebase,將伺服器上的最新版本合併到本地。


用下面兩幅圖解釋會比較清楚一些,rebase指令執行後,實際上是將分支點從C移到了G ,這樣分支也就具有了從C到G的



3.14. Git 


####庫的逆轉與恢復除了用來進行一些廢棄的研發程式碼的重置外,還有一個重要的作用。例如我們從遠端clone了一個程式碼庫,在在本地開發後,準備提交回遠端。但是本地程式碼庫在開發時,有功能性的commit,也有出於備份目的的commit等等。總之,commit的日誌中有大量無用log,我們並不想把這些log在提交回遠端時也提交到庫中。 因此,就要用到git res###############git reset的概念比較複雜。它的命令形式:git reset [- -mixed | --soft | --hard] [--mixed 這個是預設的選項。如git reset [--mixed] dev^(dev^的定義可以參考2.6.5)。它的作用僅是重置分支狀態到dev1^, 但是卻不改變任何工作文件的內容。即,從dev1^到dev1的所有檔案變化都保留了,但是dev1^到dev1之間的所有commit日誌都被清除了, 而且,發生變化的檔案內容也沒有通過git add標識,如果您要重新commit ,還需要對變化的檔案做一次git add。這樣,commit後,就得到了非常乾淨的提交記錄。 (回退了index和倉庫中的


--soft相當於做了git reset –mixed,後,又對變化的檔案做了git add。如果用了這個選項,就可以直接commit了。(回退了倉庫中的


#--hard這個指令就會導致所有資訊的回退,包括檔案內容。一般只有在重置廢棄程式碼時,才用它。執行後,檔案內容也無法恢復回來了。(回退了工作目錄、index和倉庫中的






##切換到使用的分


#git reset HEAD^ 回退第一個


git reset HEAD~2 回退第二


#如果想把工作目錄下的檔案也回退,則使用git reset - - hard HEAD^ 回退第一


#git reset - - hard HEAD~2 回退第二


也可以使用如下



將目前的工作目錄完全回滾到指定的版本號,假設如下圖,我們有A-G五次提交的版本,其中C的版本號是bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那麼結果就只剩下了A-C三個提交



3.15. Git r


#還原某次對版本的修改,例如:git revert commit_id (其中commit_id為commit程式碼時產生的一個唯一表示的字


例如:(3.6)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執行此操作,則還原上一次commit的

##3.16. Git con

利用這個指令可以新增、更改Git的各種設置,例如「git config branch.master.remote origin」就將master的遠端版本庫設定為別名做origin版

3.17. Git s

顯示物件的不同

3.18. Git 

#建立、列出、刪除或驗證一個標籤物件(使用GPG簽章


可以將某個特定的版本打上一個標籤,這樣就不需要記憶複雜的版本號哈希值字串了,例如你可以使用“git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20”來標記這個被你還原的版本,那麼以後你想查看該版本時,就可以使用revert_version標籤名,而不是哈希



##4. Git伺服器操作指令(與################4.1. Git cl###


取出伺服器的倉庫的程式碼到本機建立的目錄中(與伺服器


透過git clone取得遠端git庫後,.git/config中的開發者資訊不會被一起clone過來。仍然需要為本機庫的.git/config檔添加開發者資訊。此外,開發者還需要自己加入.gitignore


透過git clone獲取的遠端git庫,只包含了遠端git庫的當前工作分支。如果想獲取其它分支信息,需要使用“git branch –r” 來查看, 如果需要將遠端的其它分支代碼也獲取過來,可以使用命令“ git checkout -b 本地分支名遠端分支名”,其中,遠端分支名為“git branch –r” 所列出的分支名, 一般是諸如“ origin/分支名」的樣子。如果本地分支名已經存在, 則不需要「-b」











#4.2. Git


從伺服器的倉庫中取得程式碼,和本地程式碼合併。(與伺服器交互,從伺服器上下載最新程式碼,等同於:Git fetch Git mer


從其它的版本庫(既可以是遠端的也可以是本地的)將程式碼更新到本地,例如:「git pull origin master 」就是將origin這個版本庫的程式碼更新到本地的master主


git pull可以從任一git函式庫取得某個分支的內容。用法



git pull  username@ipaddr:遠端repository名稱遠端分支名稱本機分支名。這條指令將從遠端git庫的遠端分支名取得到本機git庫的一個本機分支。其中,如果不寫本機分支名,則預設pull到本機目前


要注意的是,git pull也可以用來合併分支。和git merge的作用相同。 因此,如果你的本地分支已經有內容,則git pull會合併這些文件,如果有衝突會













4

#將本機commit的程式碼更新到遠端版本庫中,例如「git push origin」就會將本地的程式碼更新到名為orgin的遠端版本

##########git push和git pull剛好想反,是將本地某個分支的內容提交到遠端某個分支上。用法: git pushusername@ipaddr:遠端repository名稱本地分支名 遠端分支名。這條指令將本地git庫的一個本地分支push到遠端git庫的遠端分支###############需要格外注意的是,git push好像不會自動合併文件。因此,如果git push時,發生了衝突,就會被後push的文件內容強行覆蓋,而且沒有什麼提示。這在合作開發時是很危險的########################################## ##########4.4. Git #############

從伺服器的倉庫下載程式碼。 (與伺服器交互,從伺服器上下載最新


相當於從遠端取得最新版本到本地,不會自動merge,比Git pull更安


使用此方法來取得伺服器上的


#例如:如果使用git checkout nov/eclair_rocket (nov/eclair_rocket為伺服器上的分支名),則是獲取上次使用git fetch命令時從伺服器上下載的程式碼;如果先使用git fetch ,再使用git checkout nov/eclair_rocket,則是先從伺服器上獲取最新的更新信息,然後從伺服器上下載最新的程式碼。。。)h:。




#:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成。。)h:。




##:。:。)l:。。)e互)。g。w。g))t本:錄錄錄;:))):]。t。:e ))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。;;:。述h)。v。 es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。wg:)。1。g。s)。。 。。t))):。m))):。d.。。t命令)令lp。。較e.e:。制ml"名置項。 。 ;。成。 。 。 )h:。




#:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成。。)h:。




##:。:。)l:。。)e互)。g。w。g))t本:錄錄錄;:))):]。t。:e ))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。;;:。述h)。v。 es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。wg:)。1。g。s)。。 。。t))):。m))):。d.。。t命令)令lp。。較e.e:。制ml"名置項。 。 ;。成。 。 。 )h:。




#:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成。。)h:。



##

:。。:。)l:。。)e互)。。g。w。g))t本:录录录录;:))):]。t。:e))支:2)。支:支d录。2012-22:)史)别。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。码ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。wg:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。较e.e:。制ml"名置项。。;。成。。。)h:。




:。。:。)l:。。)e互)。。g。w。g))t本:录录录录;:))):]。t。:e))支:2)。支:支d录。2012-22:)史)别。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。码ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。wg:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。较e.e:。制ml"名置项。。;。成。。。)h:。




:。。:。)l:。。)e互)。。g。w。g))t本:录录录录;:))):]。t。:e))支:2)。支:支d录。2012-22:)史)别。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。码ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。wg:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。较e.e:。制ml"名置项。。;。成。。。)h:。




:。。:。)l:。。)e互)。。g。w。g))t本:录录录录;:))):]。t。:e))支:2)。支:支d录。2012-22:)史)别。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。码ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。wg:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。较e.e:。制ml"名置项。。;。成Git

1.1. Git库中由三部分组

Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git目录位于工作目录内

1) 工作目录:用户本地的目录

2) Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Git 称该区域为索引

3) 仓库:将索引通过commit命令提交至仓库中,每一次提交都意味着版本在进行一次更新


1.2. 使用Git时的初始化事

1.2.1. Git初始化配

1) 配置使用git仓库的人员姓

git config --global user.name "Your Name Comes Here

2) 配置使用git仓库的人员emai

git config --global user.email you@yourdomain.example.co

1.2.2. Git文档忽略机

工作目录中有一些文件是不希望接受Git 管理的,譬如程序编译时生成的中间文件等等。Git 提供了文档忽略机制,可以将工作目录中不希望接受Git 管理的文档信息写到同一目录下的.gitignore 文件中

例如:工作目录下有个zh目录,如果不想把它加入到Git管理中,则执行

echo “zh” > .gitignor

git add 

有关gitignore 文件的诸多细节知识可阅读其使用手册:man gitignor

1.3. Git與Repo的比

Git操作一般對應一個倉庫,而Repo操作一般對應一個項目,即一個項目會由若干倉庫組成

例如,在操作整個Recket專案時使用Repo,而操作其中的某個倉庫時使用Git。在包含隱藏目錄.git的目錄下執行git操作


2. Git he

Git help 取得git基本命

(如果要知道某個特定指令的使用方法,例如:使用Git help clone,來取得git clone的使用方法


3. Git本機運算基本

3.1. Git ini

或使用git init-db

建立一個空的Git庫。在目前目錄中產生一個.git 的子目錄。以後,所有的檔案變更訊息都會儲存到這個目錄下,而不像CVS那樣,會在每個目錄和子目錄下都建立一個CVS目錄

在.git目錄下有一個config文件,可以修改其中的設定資訊

3.2. Git ad

將目前工作目錄中更改或新增的檔案加入Git的索引中,加入Git的索引就表示記入了版本歷史中,這也是提交先前所需要執行的一步

可以遞歸添加,即如果後面接的是一個目錄作為參數,則會遞歸添加整個目錄中的所有子目錄和檔案。例如

git add dir1 ( 新增dir1 這個目錄,目錄下的所有檔案都被加入 

Git add f1 f2 ( 新增f1,f2檔案

git add . ( 新增目前目錄下的所有檔案和子目錄

3.3. Git r

從目前的工作目錄中和索引中刪除檔案

可以遞歸刪除,即如果後面接的是目錄做為參數,則會遞歸刪除整個目錄中的所有子目錄和檔案。例如

git rm –r * (進入某個目錄中,執行此語句,會刪除該目錄下的所有檔案和子目錄

git rm f1 (刪除檔案f1,包含本機目錄和index中的此檔案記錄

git rm --ached f1 (刪除檔案f1,不會刪除本機目錄文件,只刪除index中的文件記錄;將已經git add的文件remove到cache中,這樣commit的時候不會提交這個文件, 適用於一下子添加了很多文件, 卻又想排除其中個別幾個文件的情況.

3.4. Git commi

提交目前工作目錄的修改內容

直接呼叫git commit指令,會提示填寫註解。透過以下方式在命令列就填寫提交註解:git commit -m " Initial commit of gittutor reposistory"。注意,和CVS不同,git的提交註解必須不能為空,否則就會提交失敗

git commit還有一個-a的參數,可以將那些沒有透過git add標識的變化一併強行提交,但是不建議使用這種方式

每次提交,git就會為全域程式碼建立一個唯一的commit識別碼,使用者可以透過git reset指令恢復到任意一次提交時的程式碼

git commit –-amend –m “message”(在一個commit id上不斷修改提交的內容

3.5. Git statu

查看版本庫的狀態。可以得知哪些文件發生了變化,哪些檔案還沒有加入到git庫等等。建議每次commit前都要透過該指令確認庫狀態

#

最常見的誤操作是, 修改了一個文件, 沒有調用git add通知git庫該文件已經發生了變化就直接調用commit操作, 從而導致該文件並沒有真正的提交。這時如果開發者以為已經提交了該文件,就繼續修改甚至刪除這個文件,那麼修改的內容就沒有透過版本管理起來。如果每次在 提交前,使用git status查看一下,就可以發現這種錯誤。因此,如果呼叫了git status指令,一定要格外注意那些提示為 “Changed but not updated:”的檔案。這些檔案都是與上次commit相比發生了變化,但是卻沒有透過git add標識的檔案

3.6. Git lo

查看歷史日誌,包含每次的版本變更。每次版本變化對應一個commit id

Git log -

-1的意思是只顯示一個commit,如果想顯示5個,就-5。不指定的話,git log會從該commit一直往後顯示

Git log --stat –summary (顯示每次版本的詳細變更

在專案日誌資訊中,每個日誌的首行(就是那一串字元)為版本更新提交所進行的命名,我們可以將該命名理解為專案版本號。專案版本號應該是唯一的,預設由Git 自動生成,用以標示項目的某一次更新。如果我們將項目版本號用作git-show 指令的參數,即可查看該次項目版本的更新細節。例如

1) Git lo


2)Git sho


實際上,上述指令並非是真正的進行版本號自訂,只是製造了一個tag物件而已,這在進行專案版本對外發佈時比較有用

3.7.Git merg

把伺服器上下載下來的程式碼和本機程式碼合併。或進行分支合併

例如:目前在master分支上,若想將分支dev上的合併到master上,則git merge de

注意:git merge nov/eclair_eocket (是將伺服器git庫的eclair_eocket分支合併到本地分支上

git rebase nov/eclair_eocket (是將伺服器git庫的eclair_eocket分支映射到本地的一個臨時分支上,然後將本地分支上的變化合併到這個暫時分支,然後再用這個暫存分支初始化本地分支

3.8. Git dif

#把本地的程式碼和index中的程式碼比較,或是把index中的程式碼和本地倉庫中的程式碼進行比較

1) Git dif

比較工作目錄和Index中的程式碼

2)Git diff - - cache

比較index和本地倉庫中的代碼

3.9. Git checkou

3.9.1. 切換到分

1) 建立一個新分支,並切換到該分支

Git checkout –b 新分支

2)切換到某個已經建立的本地分支local_branc

Git checkout local_branc

(使用cat .git/HEAD後,顯示refs:refs/heads/ local_branch

3) 切換到伺服器上的某個分支remote_branc

Git checkout remote_branc

(遠端分支remote_branch可以透過git branch – r 列出

4) 切換到某個commit i

Git checkout commit_i

(使用cat .git/HEAD後,顯示commit_id

5 ) 切換到某個ta

Git checkout ta

(使用cat .git/HEAD後,顯示tag

注意: 除了1)和2)外,其餘三種都只是切換到了一個臨時的( no branch )狀態(this head is detached),這時用git branch 可以看到處於(no branch)上, cat .git/HEAD 看到指向對應的commit id。這個(no branch)只是臨時存在的,並不是一個真正建立的branch。如果此時執行2),則這個(no branch)就自動消失了;如果執行1), 則建立新分支new branch,並把這個(no branch)掛到這個新分支上,此時cat .git/ refs/heads/new_branch 可以看到已經指向了剛才那個commit id

#3.9.2. 用已有分支初始化新分

執行下面的命令,在切換到某個已經建立的local branch或某個remote branch或某個commit id 或某個tag的同時,建立新分支 new_branch,並且掛到這個新分支上

1)切換到某個已經建立的本地分支local_branch ,並且使用此分支初始化一個新分支new_branch

git checkout –b new_branch local_branc

2) 切換到某個遠端分支remote_branch,並且用此分支初始化一個新分支new_branch

Git checkout –b new_branch remote_branc

3) 切換到某個commit id,並建立新分支new_branc

Git checkout –b new_branch commit_i

#4) 切換到某個tag,並建立新分支new_branc

Git checkout –b new_branch ta

3.9.3. 還原代

例如「git checkout app/model/user. rb” 就會將user.rb檔案從上一個已提交的版本更新回來,未提交的工作目錄中的內容全部會被覆寫


3.10. Git -ls-fil

查看目前的git庫中有那些檔案

3.11. Git m

重命名一個檔案、目錄或連結

例如:Git mv helloworld.c helloworld1.c (把檔案helloworld.c 重新命名為helloworld1.c

3.12. Git branc

#3.12.1. 總

在git 版本庫中建立分支的成本幾乎為零,所以,不必吝嗇多建立幾個分支。當第一次執行git init時,系統就會建立一個名為「master」的分支。而其它分支則透過手工創建

下面列舉一些常見的分支策略

創建一個屬於自己的個人工作分支,以避免對主分支master 造成太多的干擾,也方便與他人交流協作

當進行高風險的工作時,創建一個試驗性的分支

合併別人的工作的時候,最好是創建一個臨時的分支用來合併,合併完成後再「fetch」到自己的分支

對分支進行增、刪、查等操作

注意:分支資訊一般在.git/refs/目錄下,其中heads目錄下為本機分支,remotes為對應伺服器上的分支,tags為標籤

3.12.2. 檢視分

git branch 列出本地git庫中的所有分支。在列出的分支中,若分支名前有*,則表示此分支為當前分支

git branch –r 列出伺服器git庫的所有分支

(可以繼續使用指令“ git checkout -b 本機分支名稱伺服器分支名稱」來取得伺服器上某個分支的程式碼檔案)

3.12.3. 查看目前在哪個分支

cat .git/HEA

3.12.4. 建立一個分

1) git branch 分支

雖然建立了分支,但是不會將目前工作分支切換到新建立的分支上,因此,還需要命令“git checkout 分支名” 來切換

2) git checout –b 分支

不但創建了分支,還將當前工作分支切換到了該分支上

3.12.5. 切換到某個分支:git checkout 分支

切換到主分支:git checkout maste

3.12.6. 刪除分

git branch –D 分支

注意: 刪除後,發生在該分支的所有變更都無法恢復。強制刪除此分支

3.12.7. 比較兩個分支上的檔案的區

git diff master 分支名(比較主分支和另一個分支的差異

# 3.12.8. 查看分支歷

git-show-branch (查看目前分支的提交註釋及資訊

git-show-branch -all(查看所有分支的提交註釋及資訊)例如

* [dev] d

! [master] m

-

* [dev] d

##* [dev^] d

* [dev~2] d

* [master] m

在上述例子中,「--」之上的兩行表示有兩個分支dev和master, 而dev分支上最後一次提交的日誌是“d2”,master分支上最後一次提交的日誌是“m2”。“--”之下的幾行表示了分支演化的歷史,其中dev表示發生在dev分支上的最後一次提交,dev^表示發生在dev分支上的倒數第二次提交。dev~2表示發生在dev分支上的倒數第三次提交

3.12.9. 查看當前分支的操作​​記

git whatchange

3.12.10. 合併分

法一

git merge “註釋” 合併的目標分支合併的來源分

如果合併有衝突,git會有提示

例如:git checkout master (切換到master分支

git merge HEAD dev~2 (合併master分支和dev ~2分支)或:git merge master dev~

法二

git pull 合併的目標分支合併的來源分數

例如: git checkout master (切換到master分支

git pull . dev~2(合併目前分支和dev~2分支

#3.13. Git rebas

一般在將伺服器最新內容合併到本地時使用,例如:在版本C時從伺服器上取得內容到本地,修改了本地內容,此時想把本地修改的內容提交到伺服器上;但發現伺服器上的版本已經變成G了,此時就需要先執行Git rebase,將伺服器上的最新版本合併到本地。例如

用下面兩張圖解釋會比較清楚一些,rebase指令執行後,實際上是將分支點從C移到了G,這樣分支也就具有了從C到G的功能


3.14. Git rese

庫的逆轉與恢復除了用來進行一些廢棄的研發代碼的重置外,還有一個重要的作用。例如我們從遠端clone了一個程式碼庫,在本地開發後,準備提交回遠端。但是本地程式碼庫在開發時,有功能性的commit,也有備份目的的commit等等。總之,commit的日誌中有大量無用log,我們並不想把這些 log在提交回遠端時也提交到庫中。因此,就要用到git reset

git reset的概念比較複雜。它的指令形式:git reset [--mixed | --soft | --hard] [

指令的選項

--mixed 這個是預設的選項。如git reset [--mixed] dev^(dev^的定義可以參考2.6.5)。它的作用僅是重置分支狀態到dev1^, 但是卻不改變任何工作文件的內容。即,從dev1^到dev1的所有檔案變化都保留了,但是dev1^到dev1之間的所有commit日誌都被清除了, 而且,發生變化的檔案內容也沒有通過git add標識,如果您要重新commit ,還需要對變化的檔案做一次git add。這樣,commit後,就得到了非常乾淨的提交記錄。 (回退了index和倉庫中的內容

--soft相當於做了git reset –mixed,後,又對變化的檔案做了git add。如果用了該選項,可以直接 commit了。(回退了倉庫中的內容

--hard 這個指令就會導致所有資訊的回退, 包括文件內容。一般只有在重置廢棄代碼時,才用它。執行後,文件內容也無法恢復回來了。(回退了工作目錄、index和倉庫中的內容

例如

#切換到使用的分支上

git reset HEAD^回退第一個記

git reset HEAD~2 回退第二個記

如果想把工作目錄下的文件也回退,則使用git reset - - hard HEAD^回退第一個記

git reset - - hard HEAD~2 回退第二個記

還可以使用以下方法

將目前的工作目錄完全回滾到指定的版本號,假設如下圖,我們有A-G五次提交的版本,其中C的版本號是bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執行了'git reset bbaf65060b4875b1891636363637600b4875b18916363660b4875b18916362563版就提交了三個結果。


##3.15. Git rever

還原某次對版本的修改,例如:git revert commit_id (其中commit_id為commit程式碼時產生的一個唯一表示的字串

例如:(3.6)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執行此操作,則還原上一次commit的操作

3.16. Git confi##新指令可以

#3.16. Git confi##新指令可以#增、更改Git的各種設置,例如“git config branch.master.remote origin” 就將master的遠端版本庫設置為別名為origin版本庫

3.17. Git sho

#顯示物件的不同類型

3.18. Git ta

建立、列出、刪除或驗證一個標籤物件(使用GPG簽署的)

可以將某個具體的版本打上一個標籤,這樣就不需要記憶複雜的版本號哈希值字串了,例如你可以使用“git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 來標記這個被你還原的版本,那麼以後你想查看該版本時,就可以使用revert_version標籤名,而不是雜湊值了


4. Git伺服器操作指令(與伺服器交

4.1. Git clon

取出伺服器的倉庫的程式碼到本機建立的目錄中(與伺服器互動

透過git clone取得遠端git函式庫後,.git/config中的開發者資訊不會被一起clone過來。仍然需要為本機程式庫的.git/config檔案新增開發者資訊。此外,開發者還需要自己加入 . gitignore檔案

透過git clone取得的遠端git函式庫,只包含了遠端git函式庫的目前工作分支。如果想獲取其它分支信息,需要使用“git branch –r” 來查看, 如果需要將遠程的其它分支代碼也獲取過來,可以使用命令“ git checkout -b 本地分支名遠程分支名”,其中,遠程分支名為「git branch –r」 所列出的分支名, 一般是諸如「origin/分支名」的樣子。如果本機分支名稱已經存在,則不需要「-b」參數

例如


#4.2. Git pul

從伺服器的倉庫取得程式碼,和本機程式碼合併。 (與伺服器交互,從伺服器上下載最新程式碼,等同於: Git fetch Git merge

從其它的版本庫(既可以是遠端的也可以是本地的)將程式碼更新到本地,例如: 「git pull origin master 」就是將origin這個版本庫的程式碼更新到本地的master主分支

git pull可以從任一git庫取得某個分支的內容。用法如下

# git pull  username@ipaddr:遠端repository名遠端分支名本機分支名。這條指令將從遠端git庫的遠端分支名取得到本機git庫的一個本機分支。其中,如果不寫本機分支名,則預設pull到本地當前分支

需要注意的是,git pull也可以用來合併分支。和 git merge的作用相同。 因此,如果你的本地分支已經有內容,則git pull會合併這些文件,如果有衝突會警報

例如







4.3. Git push

#將本地commit的程式碼更新到遠端版本庫中,例如「git push origin」就會將本地的程式碼更新到名為orgin的遠端版本庫中

git push和git pull剛好想反,是將本地某個分支的內容提交到遠端某個分支上。用法:git pushusername@ipaddr :遠端repository名稱本地分支名遠端分支名。這條命令將本地git庫的一個本地分支push到遠端git庫的遠端分支名中

需要格外注意的是,git push好像不會自動合併文件。因此,如果git push時,發生了衝突,就會被後push的文件內容強行覆蓋,而且沒有什麼提示。這在合作開發時是很危險的事情

例如

4.4. Git fetc

從伺服器的倉庫下載程式碼。(與伺服器交互,從伺服器下載最新程式碼###### #相當於從遠端取得最新版本到本地,不會自動merge,比Git pull更安全些######使用此方法來取得伺服器上的更新######例如:如果使用git checkout nov /eclair_rocket (nov/eclair_rocket為伺服器上的分支名稱),則是取得上次使用git fetch指令時從伺服器下載的程式碼;如果先使用git fetch ,再使用git checkout nov/eclair_rocket,則是先從伺服器上獲取最新的更新信息,然後從伺服器上下載最新的程式碼。 。 。 )h:。 。 。 ############:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成概念。。。。。。。。。。。。。全些程式碼fetc例如事情名中庫中.3. Git push例如警報分支如下分支ge pul例如參數檔交互on伺服器交值了的)ta類型ho本庫fi操作符串ever的版方法個記個記個記個記支上例如內容內容內容選項h>etrese功能例如as分支分支源分法二v~分支提示源分法一併分ge作記提交m d dd###

- m d例如信息支历区别的区分支分支除分te分支支上分支切换分支个分EA分支件)分支分支看分标签操作分支分支协作策略创建 总nc.c链接 m文件-fil覆盖原代tanc_incncchncch支上新分idagtataid_i i列出ncncchncnc分支分支到分ou代码he代码if比较if分支支上de合并rg比较有用 sholo例如变化显示 -idlo文件状态tu内容代码方式失败内容mi况.记录目录例如文件 r录 文件入 例如一步ad信息目录dbni操作基本方法本命t he操作组成的比ord or执行件中略机coaire员姓化配初始化事更新索引目录录内分组Git概念

1.1. Git库中由三部分组

Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git目录位于工作目录内

1) 工作目录:用户本地的目录

2) Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Git 称该区域为索引

3) 仓库:将索引通过commit命令提交至仓库中,每一次提交都意味着版本在进行一次更新


1.2. 使用Git时的初始化事

1.2.1. Git初始化配

1) 配置使用git仓库的人员姓

git config --global user.name "Your Name Comes Here

2) 配置使用git仓库的人员emai

git config --global user.email you@yourdomain.example.co

1.2.2. Git文档忽略机

工作目录中有一些文件是不希望接受Git 管理的,譬如程序编译时生成的中间文件等等。Git 提供了文档忽略机制,可以将工作目录中不希望接受Git 管理的文档信息写到同一目录下的.gitignore 文件中

例如:工作目录下有个zh目录,如果不想把它加入到Git管理中,则执行

echo “zh” > .gitignor

git add 

有关gitignore 文件的诸多细节知识可阅读其使用手册:man gitignor

1.3. Git與Repo的比

Git操作一般對應一個倉庫,而Repo操作一般對應一個項目,即一個項目會由若干倉庫組成

例如,在操作整個Recket專案時使用Repo,而操作其中的某個倉庫時使用Git。在包含隱藏目錄.git的目錄下執行git操作


2. Git he

Git help 取得git基本命

(如果要知道某個特定指令的使用方法,例如:使用Git help clone,來取得git clone的使用方法


3. Git本機運算基本

3.1. Git ini

或使用git init-db

建立一個空的Git庫。在目前目錄中產生一個.git 的子目錄。以後,所有的檔案變更訊息都會儲存到這個目錄下,而不像CVS那樣,會在每個目錄和子目錄下都建立一個CVS目錄

在.git目錄下有一個config文件,可以修改其中的設定資訊

3.2. Git ad

將目前工作目錄中更改或新增的檔案加入Git的索引中,加入Git的索引就表示記入了版本歷史中,這也是提交先前所需要執行的一步

可以遞歸添加,即如果後面接的是一個目錄作為參數,則會遞歸添加整個目錄中的所有子目錄和檔案。例如

git add dir1 ( 新增dir1 這個目錄,目錄下的所有檔案都被加入 

Git add f1 f2 ( 新增f1,f2檔案

git add . ( 新增目前目錄下的所有檔案和子目錄

3.3. Git r

從目前的工作目錄中和索引中刪除檔案

可以遞歸刪除,即如果後面接的是目錄做為參數,則會遞歸刪除整個目錄中的所有子目錄和檔案。例如

git rm –r * (進入某個目錄中,執行此語句,會刪除該目錄下的所有檔案和子目錄

git rm f1 (刪除檔案f1,包含本機目錄和index中的此檔案記錄

git rm --ached f1 (刪除檔案f1,不會刪除本機目錄文件,只刪除index中的文件記錄;將已經git add的文件remove到cache中,這樣commit的時候不會提交這個文件, 適用於一下子添加了很多文件, 卻又想排除其中個別幾個文件的情況.

3.4. Git commi

提交目前工作目錄的修改內容

直接呼叫git commit指令,會提示填寫註解。透過以下方式在命令列就填寫提交註解:git commit -m " Initial commit of gittutor reposistory"。注意,和CVS不同,git的提交註解必須不能為空,否則就會提交失敗

git commit還有一個-a的參數,可以將那些沒有透過git add標識的變化一併強行提交,但是不建議使用這種方式

每次提交,git就會為全域程式碼建立一個唯一的commit識別碼,使用者可以透過git reset指令恢復到任意一次提交時的程式碼

git commit –-amend –m “message”(在一個commit id上不斷修改提交的內容

3.5. Git statu

查看版本庫的狀態。可以得知哪些文件發生了變化,哪些檔案還沒有加入到git庫等等。建議每次commit前都要透過該指令確認庫狀態

#

最常見的誤操作是, 修改了一個文件, 沒有調用git add通知git庫該文件已經發生了變化就直接調用commit操作, 從而導致該文件並沒有真正的提交。這時如果開發者以為已經提交了該文件,就繼續修改甚至刪除這個文件,那麼修改的內容就沒有透過版本管理起來。如果每次在 提交前,使用git status查看一下,就可以發現這種錯誤。因此,如果呼叫了git status指令,一定要格外注意那些提示為 “Changed but not updated:”的檔案。這些檔案都是與上次commit相比發生了變化,但是卻沒有透過git add標識的檔案

3.6. Git lo

查看歷史日誌,包含每次的版本變更。每次版本變化對應一個commit id

Git log -

-1的意思是只顯示一個commit,如果想顯示5個,就-5。不指定的話,git log會從該commit一直往後顯示

Git log --stat –summary (顯示每次版本的詳細變更

在專案日誌資訊中,每個日誌的首行(就是那一串字元)為版本更新提交所進行的命名,我們可以將該命名理解為專案版本號。專案版本號應該是唯一的,預設由Git 自動生成,用以標示項目的某一次更新。如果我們將項目版本號用作git-show 指令的參數,即可查看該次項目版本的更新細節。例如

1) Git lo


2)Git sho


實際上,上述指令並非是真正的進行版本號自訂,只是製造了一個tag物件而已,這在進行專案版本對外發佈時比較有用

3.7.Git merg

把伺服器上下載下來的程式碼和本機程式碼合併。或進行分支合併

例如:目前在master分支上,若想將分支dev上的合併到master上,則git merge de

注意:git merge nov/eclair_eocket (是將伺服器git庫的eclair_eocket分支合併到本地分支上

git rebase nov/eclair_eocket (是將伺服器git庫的eclair_eocket分支映射到本地的一個臨時分支上,然後將本地分支上的變化合併到這個暫時分支,然後再用這個暫存分支初始化本地分支

3.8. Git dif

#把本地的程式碼和index中的程式碼比較,或是把index中的程式碼和本地倉庫中的程式碼進行比較

1) Git dif

比較工作目錄和Index中的程式碼

2)Git diff - - cache

比較index和本地倉庫中的代碼

3.9. Git checkou

3.9.1. 切換到分

1) 建立一個新分支,並切換到該分支

Git checkout –b 新分支

2)切換到某個已經建立的本地分支local_branc

Git checkout local_branc

(使用cat .git/HEAD後,顯示refs:refs/heads/ local_branch

3) 切換到伺服器上的某個分支remote_branc

Git checkout remote_branc

(遠端分支remote_branch可以透過git branch – r 列出

4) 切換到某個commit i

Git checkout commit_i

(使用cat .git/HEAD後,顯示commit_id

5 ) 切換到某個ta

Git checkout ta

(使用cat .git/HEAD後,顯示tag

注意: 除了1)和2)外,其餘三種都只是切換到了一個臨時的( no branch )狀態(this head is detached),這時用git branch 可以看到處於(no branch)上, cat .git/HEAD 看到指向對應的commit id。這個(no branch)只是臨時存在的,並不是一個真正建立的branch。如果此時執行2),則這個(no branch)就自動消失了;如果執行1), 則建立新分支new branch,並把這個(no branch)掛到這個新分支上,此時cat .git/ refs/heads/new_branch 可以看到已經指向了剛才那個commit id

#3.9.2. 用已有分支初始化新分

執行下面的命令,在切換到某個已經建立的local branch或某個remote branch或某個commit id 或某個tag的同時,建立新分支 new_branch,並且掛到這個新分支上

1)切換到某個已經建立的本地分支local_branch ,並且使用此分支初始化一個新分支new_branch

git checkout –b new_branch local_branc

2) 切換到某個遠端分支remote_branch,並且用此分支初始化一個新分支new_branch

Git checkout –b new_branch remote_branc

3) 切換到某個commit id,並建立新分支new_branc

Git checkout –b new_branch commit_i

#4) 切換到某個tag,並建立新分支new_branc

Git checkout –b new_branch ta

3.9.3. 還原代

例如「git checkout app/model/user. rb” 就會將user.rb檔案從上一個已提交的版本更新回來,未提交的工作目錄中的內容全部會被覆寫


3.10. Git -ls-fil

查看目前的git庫中有那些檔案

3.11. Git m

重命名一個檔案、目錄或連結

例如:Git mv helloworld.c helloworld1.c (把檔案helloworld.c 重新命名為helloworld1.c

3.12. Git branc

#3.12.1. 總

在git 版本庫中建立分支的成本幾乎為零,所以,不必吝嗇多建立幾個分支。當第一次執行git init時,系統就會建立一個名為「master」的分支。而其它分支則透過手工創建

下面列舉一些常見的分支策略

創建一個屬於自己的個人工作分支,以避免對主分支master 造成太多的干擾,也方便與他人交流協作

當進行高風險的工作時,創建一個試驗性的分支

合併別人的工作的時候,最好是創建一個臨時的分支用來合併,合併完成後再「fetch」到自己的分支

對分支進行增、刪、查等操作

注意:分支資訊一般在.git/refs/目錄下,其中heads目錄下為本機分支,remotes為對應伺服器上的分支,tags為標籤

3.12.2. 檢視分

git branch 列出本地git庫中的所有分支。在列出的分支中,若分支名前有*,則表示此分支為當前分支

git branch –r 列出伺服器git庫的所有分支

(可以繼續使用指令“ git checkout -b 本機分支名稱伺服器分支名稱」來取得伺服器上某個分支的程式碼檔案)

3.12.3. 查看目前在哪個分支

cat .git/HEA

3.12.4. 建立一個分

1) git branch 分支

雖然建立了分支,但是不會將目前工作分支切換到新建立的分支上,因此,還需要命令“git checkout 分支名” 來切換

2) git checout –b 分支

不但創建了分支,還將當前工作分支切換到了該分支上

3.12.5. 切換到某個分支:git checkout 分支

切換到主分支:git checkout maste

3.12.6. 刪除分

git branch –D 分支

注意: 刪除後,發生在該分支的所有變更都無法恢復。強制刪除此分支

3.12.7. 比較兩個分支上的檔案的區

git diff master 分支名(比較主分支和另一個分支的差異

# 3.12.8. 查看分支歷

git-show-branch (查看目前分支的提交註釋及資訊

git-show-branch -all(查看所有分支的提交註釋及資訊)例如

* [dev] d

! [master] m

-

* [dev] d

##* [dev^] d

* [dev~2] d

* [master] m

在上述例子中,「--」之上的兩行表示有兩個分支dev和master, 而dev分支上最後一次提交的日誌是“d2”,master分支上最後一次提交的日誌是“m2”。“--”之下的幾行表示了分支演化的歷史,其中dev表示發生在dev分支上的最後一次提交,dev^表示發生在dev分支上的倒數第二次提交。dev~2表示發生在dev分支上的倒數第三次提交

3.12.9. 查看當前分支的操作​​記

git whatchange

3.12.10. 合併分

法一

git merge “註釋” 合併的目標分支合併的來源分

如果合併有衝突,git會有提示

例如:git checkout master (切換到master分支

git merge HEAD dev~2 (合併master分支和dev ~2分支)或:git merge master dev~

法二

git pull 合併的目標分支合併的來源分數

例如: git checkout master (切換到master分支

git pull . dev~2(合併目前分支和dev~2分支

#3.13. Git rebas

一般在將伺服器最新內容合併到本地時使用,例如:在版本C時從伺服器上取得內容到本地,修改了本地內容,此時想把本地修改的內容提交到伺服器上;但發現伺服器上的版本已經變成G了,此時就需要先執行Git rebase,將伺服器上的最新版本合併到本地。例如

用下面兩張圖解釋會比較清楚一些,rebase指令執行後,實際上是將分支點從C移到了G,這樣分支也就具有了從C到G的功能


3.14. Git rese

庫的逆轉與恢復除了用來進行一些廢棄的研發代碼的重置外,還有一個重要的作用。例如我們從遠端clone了一個程式碼庫,在本地開發後,準備提交回遠端。但是本地程式碼庫在開發時,有功能性的commit,也有備份目的的commit等等。總之,commit的日誌中有大量無用log,我們並不想把這些 log在提交回遠端時也提交到庫中。因此,就要用到git reset

git reset的概念比較複雜。它的指令形式:git reset [--mixed | --soft | --hard] [

指令的選項

--mixed 這個是預設的選項。如git reset [--mixed] dev^(dev^的定義可以參考2.6.5)。它的作用僅是重置分支狀態到dev1^, 但是卻不改變任何工作文件的內容。即,從dev1^到dev1的所有檔案變化都保留了,但是dev1^到dev1之間的所有commit日誌都被清除了, 而且,發生變化的檔案內容也沒有通過git add標識,如果您要重新commit ,還需要對變化的檔案做一次git add。這樣,commit後,就得到了非常乾淨的提交記錄。 (回退了index和倉庫中的內容

--soft相當於做了git reset –mixed,後,又對變化的檔案做了git add。如果用了該選項,可以直接 commit了。(回退了倉庫中的內容

--hard 這個指令就會導致所有資訊的回退, 包括文件內容。一般只有在重置廢棄代碼時,才用它。執行後,文件內容也無法恢復回來了。(回退了工作目錄、index和倉庫中的內容

例如

#切換到使用的分支上

git reset HEAD^回退第一個記

git reset HEAD~2 回退第二個記

如果想把工作目錄下的文件也回退,則使用git reset - - hard HEAD^回退第一個記

git reset - - hard HEAD~2 回退第二個記

還可以使用以下方法

將目前的工作目錄完全回滾到指定的版本號,假設如下圖,我們有A-G五次提交的版本,其中C的版本號是bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執行了'git reset bbaf65060b4875b1891636363637600b4875b18916363660b4875b18916362563版就提交了三個結果。


##3.15. Git rever

還原某次對版本的修改,例如:git revert commit_id (其中commit_id為commit程式碼時產生的一個唯一表示的字串

例如:(3.6)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執行此操作,則還原上一次commit的操作

3.16. Git confi##新指令可以

#3.16. Git confi##新指令可以#增、更改Git的各種設置,例如“git config branch.master.remote origin” 就將master的遠端版本庫設置為別名為origin版本庫

3.17. Git sho

#顯示物件的不同類型

3.18. Git ta

建立、列出、刪除或驗證一個標籤物件(使用GPG簽署的)

可以將某個具體的版本打上一個標籤,這樣就不需要記憶複雜的版本號哈希值字串了,例如你可以使用“git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 來標記這個被你還原的版本,那麼以後你想查看該版本時,就可以使用revert_version標籤名,而不是雜湊值了


4. Git伺服器操作指令(與伺服器交

4.1. Git clon

取出伺服器的倉庫的程式碼到本機建立的目錄中(與伺服器互動

透過git clone取得遠端git函式庫後,.git/config中的開發者資訊不會被一起clone過來。仍然需要為本機程式庫的.git/config檔案新增開發者資訊。此外,開發者還需要自己加入 . gitignore檔案

透過git clone取得的遠端git函式庫,只包含了遠端git函式庫的目前工作分支。如果想獲取其它分支信息,需要使用“git branch –r” 來查看, 如果需要將遠程的其它分支代碼也獲取過來,可以使用命令“ git checkout -b 本地分支名遠程分支名”,其中,遠程分支名為「git branch –r」 所列出的分支名, 一般是諸如「origin/分支名」的樣子。如果本機分支名稱已經存在,則不需要「-b」參數

例如


#4.2. Git pul

从服务器的仓库中获取代码,和本地代码合并。(与服务器交互,从服务器上下载最新代码,等同于: Git fetch + Git merge

从其它的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:“git pull origin master ”就是将origin这个版本库的代码更新到本地的master主分支

git pull可以从任意一个git库获取某个分支的内容。用法如下

git pull  username@ipaddr:远端repository名远端分支名 本地分支名。这条命令将从远端git库的远端分支名获取到本地git库的一个本地分支中。其中,如果不写本地分支名,则默认pull到本地当前分支

需要注意的是,git pull也可以用来合并分支。 和git merge的作用相同。 因此,如果你的本地分支已经有内容,则git pull会合并这些文件,如果有冲突会报警

例如






4.3. Git push

将本地commit的代码更新到远程版本库中,例如 “git push origin”就会将本地的代码更新到名为orgin的远程版本库中

git push和git pull正好想反,是将本地某个分支的内容提交到远端某个分支上。用法: git pushusername@ipaddr:远端repository名本地分支名 远端分支名。这条命令将本地git库的一个本地分支push到远端git库的远端分支名中

需要格外注意的是,git push好像不会自动合并文件。因此,如果git push时,发生了冲突,就会被后push的文件内容强行覆盖,而且没有什么提示。 这在合作开发时是很危险的事情

例如


4.4. Git fetc

从服务器的仓库中下载代码。(与服务器交互,从服务器上下载最新代码

相当于从远程获取最新版本到本地,不会自动merge,比Git pull更安全些

使用此方法来获取服务器上的更新

例如:如果使用git checkout nov/eclair_rocket (nov/eclair_rocket為伺服器上的分支名),則是取得上次使用git fetch指令時從伺服器上下載的程式碼;如果先使用git fetch ,再使用git checkout nov/eclair_rocket,則是先從伺服器上獲取最新的更新信息,然後從伺服器上下載最新的程式碼。 。 。 )h:。 。 。



:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成。。)h:。。。

#

:。:。)l:。) e互)。g。w。g))t本:錄錄錄錄;:))):]。t。:e))支:2)。支:支d錄。2012-22: )史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。支。)gg)dd)hh) hh名上支t。d。f。f))v。e。wg:)。1。g。。s)。。。t))):。m))):。d。。 。t命令)令lp。。較e.e:。制ml"名置項。 。 ;。成。 。 。 )h:。 。 。



:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成。。)h:。。。

#

:。:。)l:。) e互)。g。w。g))t本:錄錄錄錄;:))):]。t。:e))支:2)。支:支d錄。2012-22: )史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。支。)gg)dd)hh) hh名上支t。d。f。f))v。e。wg:)。1。g。。s)。。。t))):。m))):。d。。 。t命令)令lp。。較e.e:。制ml"名置項。 。 ;。成。 。 。 )h:。 。 。



:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成。。)h:。。。

#

:。:。)l:。) e互)。g。w。g))t本:錄錄錄錄;:))):]。t。:e))支:2)。支:支d錄。2012-22: )史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。支。)gg)dd)hh) hh名上支t。d。f。f))v。e。wg:)。1。g。。s)。。。t))):。m))):。d。。 。t命令)令lp。。較e.e:。制ml"名置項。 。 ;。成。 。 。 )h:。 。 。



:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成。。)h:。。。



#########################################################################################################

:。 。 :。 )l:。 。 )e互)。 。 g。 w。 g))t本:錄錄錄錄;:)):]。 t。 :e))支:2)。支:支d錄。 2012-22:)史)別。名支r名。名,名支D上。 。 。支。 。 。 ;;:。述h)。 v。 es。碼ghdhh。 h。 。支。 )gg)dd)hh)hh名上支t。 d。 f。 f))v。 e。 wg:)。 1。 g。 。 s)。 。 。 。 t))):。 m))):。 d。 。 。 t指令)令lp。 。較e.e:。制ml"名置項。。;。成。。)h:。。。



#########################################################################################################

:。。:。)l:。。)e互)。。g。w。g))t本:录录录录;:))):]。t。:e))支:2)。支:支d录。2012-22:)史)别。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。码ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。wg:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。较e.e:。制ml"名置项。。;。成Git概念
1.1. Git库中由三部分组成
Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git目录位于工作目录内。
1) 工作目录:用户本地的目录;
2) Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Git 称该区域为索引。
3) 仓库:将索引通过commit命令提交至仓库中,每一次提交都意味着版本在进行一次更新。
詳細介紹的git使用
1.2. 使用Git时的初始化事项
1.2.1. Git初始化配置
1) 配置使用git仓库的人员姓名
git config --global user.name "Your Name Comes Here"
2) 配置使用git仓库的人员email
git config --global user.email you@yourdomain.example.com
1.2.2. Git文档忽略机制
工作目录中有一些文件是不希望接受Git 管理的,譬如程序编译时生成的中间文件等等。Git 提供了文档忽略机制,可以将工作目录中不希望接受Git 管理的文档信息写到同一目录下的.gitignore 文件中。
例如:工作目录下有个zh目录,如果不想把它加入到Git管理中,则执行:
echo “zh” > .gitignore
git add .
有关gitignore 文件的诸多细节知识可阅读其使用手册:man gitignore
1.3. Git与Repo的比较
Git操作一般对应一个仓库,而Repo操作一般对应一个项目,即一个项目会由若干仓库组成。
例如,在操作整个Recket项目时使用Repo,而操作其中的某个仓库时使用Git。在包含隐藏目录.git的目录下执行git操作。

2. Git help
Git help 取得git基本指令
(如果要知道某個特定指令的使用方法,例如:使用Git help clone,來取得git clone的使用方法)

3. Git本地操作基本指令
3.1. Git init
或使用git init-db。
建立一個空的Git庫。在目前目錄中產生一個.git 的子目錄。以後,所有的檔案變化資訊都會保存到這個目錄下,而不是像CVS那樣,會在每個目錄和子目錄下都建立一個CVS目錄。
在.git目錄下有一個config文件,可以修改其中的設定資訊。
3.2. Git add
將目前工作目錄中更改或新增的檔案加入Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執行的一步。
可以遞歸添加,即如果後面接的是一個目錄作為參數,則會遞歸添加整個目錄中的所有子目錄和檔案。例如:
git add dir1 ( 新增dir1 這個目錄,目錄下的所有檔案都會加入)
Git add f1 f2 ( 新增f1,f2檔)
git add . ( 新增目前目錄下的所有檔案和子目錄)
3.3. Git rm
從目前的工作目錄中和索引中刪除檔案。
可以遞歸刪除,也就是如果後面接的是一個目錄做為參數,則會遞歸刪除整個目錄中的所有子目錄和檔案。例如:
git rm –r * (進入某個目錄中,執行此語句,會刪除該目錄下的所有檔案和子目錄)
git rm f1 (刪除檔案f1,包含本機目錄和index中的此檔案記錄)
git rm --ached f1 (刪除檔案f1,不會刪除本地目錄文件,只刪除index中的檔案記錄;將已經git add的檔案remove到cache中,這樣commit的時候不會提交這個文件, 適用於一下子添加了很多文件, 卻又想排除其中個別幾個文件的情況.)
3.4. Git commit
提交當前工作目錄的修改內容。
直接呼叫git commit指令,會提示填入註解。透過以下方式在命令列就填寫提交註解:git commit -m "Initial commit of gittutor reposistory"。注意,和CVS不同,git的提交註解必須不能為空,否則就會提交失敗。
git commit還有一個 -a的參數,可以將那些沒有通過git add標識的變化一併強行提交,但是不建議使用這種方式。
每次提交,git就會為全域程式碼建立一個唯一的commit識別碼,使用者可以透過git reset指令恢復到任意一次提交時的程式碼。
git commit –-amend –m “message” (在一個commit id上不斷修改提交的內容)
3.5. Git status
查看版本庫的狀態。可以得知哪些文件發生了變化,哪些文件還沒有加入到git庫等等。建議每次commit前都要透過該指令確認庫狀態。
最常見的誤操作是, 修改了一個文件, 沒有調用git add通知git庫該文件已經發生了變化就直接調用commit操作, 從而導致該文件並沒有真正的提交。這時如果開發者以為已經提交了該文件,就繼續修改甚至刪除這個文件,那麼修改的內容就沒有透過版本管理起來。如果每次在 提交前,使用git status查看一下,就可以發現這種錯誤。因此,如果呼叫了git status指令,一定要格外注意那些提示為 “Changed but not updated:”的檔案。這些檔案都是與上次commit相比發生了變化,但是卻沒有透過git add標識的檔案。
3.6. Git log
查看歷史日誌,包含每次的版本變更。每次版本變化對應一個commit id。
Git log -1
-1的意思是只顯示一個commit,如果想顯示5個,就-5。不指定的話,git log會從該commit一直往後顯示。
Git log --stat –summary (顯示每次版本的詳細變更)
在專案日誌資訊中,每個日誌的首行(就是那一串字元)為版本更新提交所進行的命名,我們可以將該命名理解為項目版本號。項目版本號碼應該是唯一的,預設由 Git 自動生成,用以標示項目的某一次更新。如果我們將專案版本號用作git-show 指令的參數,即可查看該次專案版本的更新細節。例如:
1) Git log
詳細介紹的git使用
2) Git show
詳細介紹的git使用
實際上,上述指令並非是真正的進行版本號自訂,只是製造了一個tag物件而已,這在進行專案版本對外發佈時比較有用。
3.7. Git merge
把伺服器上下載下來的程式碼和本機程式碼合併。或進行分支合併。
例如:目前在master分支上,若想將分支dev上的合併到master上,則git merge dev
注意:git merge nov/eclair_eocket (是將伺服器git庫的eclair_eocket分支合併到本地分支上)
git rebase nov/eclair_eocket (是將伺服器git庫的eclair_eocket分支映射到本地的一個臨時分支上,然後將本地分支上的變化合併到這個臨時分支,然後再用這個臨時分支初始化本地分支)
3.8. Git diff
把本地的程式碼和index中的程式碼比較,或是把index中的程式碼和本地倉庫裡的程式碼比較。
1) Git diff
比較工作目錄和Index中的程式碼。
2) Git diff - - cached
比較index和本地倉庫中的程式碼。
3.9. Git checkout
3.9.1. 切換到分支
1) 建立一個新分支,並切換到該分支上
Git checkout –b 新分支名稱
2)切換到某個已經建立的本地分支local_branch
Git checkout local_branch
(使用cat .git/HEAD後,顯示refs:refs/heads/ local_branch)
3) 切換到伺服器上的某個分支remote_branch
Git checkout remote_branch
(遠端分支remote_branch可以透過git branch –r 列出)
4) 切換到某個commit id
Git checkout commit_id
(使用cat .git/HEAD後,顯示commit_id)
5) 切換到某個tag
Git checkout tag
(使用cat .git/HEAD後,顯示tag)
注意: 除了1)和2)外,其餘三種都只是切換到了一個臨時的( no branch )狀態(this head is detached),這時用git branch 可以看到處於(no branch)上, cat .git/HEAD 看到指向相應的commit id。這個(no branch)只是臨時存在的,並不是一個真正建立的branch。如果此時執行2),則這個(no branch)就自動消失了;如果執行1), 則建立新分支new branch,並把這個(no branch)掛到這個新分支上,此時cat .git/ refs/heads/new_branch 可以看到已經指向了剛才那個commit id。
3.9.2. 用已有分支初始化新分支
執行下面的命令,在切換到某個已經建立的local branch或者某個remote branch或者某個commit id 或者某個tag的同時,創建新分支new_branch,並且掛到這個新分支上。
1) 切換到某個已經建立的本地分支local_branch,並且使用此分支初始化一個新分支new_branch。
git checkout –b new_branch local_branch
2) 切換到某個遠端分支remote_branch,並且用此分支初始化一個新分支new_branch。
Git checkout –b new_branch remote_branch
3) 切換到某個commit id,並建立新分支new_branch
Git checkout –b new_branch commit_id
4) 切換到某個tag,並建立新分支new_branch
Git checkout –b new_branch tag
3.9.3. 還原程式碼
例如「git checkout app/model/user.rb」就會將user.rb檔案從上一個已提交的版本更新回來,未提交的工作目錄中的內容全部會被覆蓋。

3.10. Git-ls-files
查看目前的git庫中有那些檔案。
3.11. Git mv
重新命名一個檔案、目錄或連結。
例如:Git mv helloworld.c helloworld1.c (把檔案helloworld.c 重新命名為helloworld1.c)
3.12. Git branch
3.12.1. 總述
在git 版本庫中創建分支的成本幾乎為零,所以,不必吝嗇多創建幾個分支。當第一次執行git init時,系統就會建立一個名為「master」的分支。而其它分支則透過手工創建。
以下列舉一些常見的分支策略:
建立一個屬於自己的個人工作分支,以避免對主分支master 造成太多的干擾,也方便與他人交流協作;
當進行高風險的工作時,創建一個試驗性的分支;
合併別人的工作的時候,最好是創建一個臨時的分支用來合併,合併完成後再“fetch”到自己的分支。
對分支進行增、刪、查等操作。
注意:分支資訊一般在.git/refs/目錄下,其中heads目錄下為本機分支,remotes為對應伺服器上的分支,tags為標籤。
3.12.2. 檢視分支
git branch 列出本機git庫中的所有分支。在所列的分支中,若分支名前有*,則表示此分支為目前分支。
git branch –r 列出伺服器git庫的所有分支。
(可以繼續使用指令 “ git checkout -b 本機分支名稱 伺服器分支名稱”來取得伺服器上某個分支的程式碼檔案)。
3.12.3. 檢視目前在哪個分支上
cat .git/HEAD
3.12.4. 建立一個分支
1) git branch 分支名稱
雖然建立了分支,但不會將目前工作分支切換到新建立的分支上,因此,還需要命令「git checkout 分支名」 來切換,
2) git checout –b 分支名
不只創建了分支,還將當前工作分支切換到了該分支。
3.12.5. 切換到某個分支:git checkout 分支名
切換到主分支:git checkout master
3.12.6. 刪除分支
git branch –D 分支名
注意: 刪除後,發生在該分支的所有變更都無法恢復。強制刪除此分支。
3.12.7. 比較兩個分支上的檔案的差異
git diff master 分支名(比較主分支和另一個分支的區別)
3.12.8. 查看分支歷史
git- show-branch (查看目前分支的提交註釋及資訊)
git-show-branch -all(查看所有分支的提交註釋及資訊)例如:
* [dev] d2
! [master] m2
--
* [dev] d2
* [dev^] d1
* [dev~2] d0
* [master] m2
在上述例子中, “ --」之上的兩行表示有兩個分支dev和master, 且dev分支上最後一次提交的日誌是「d2」,master分支上最後一次提交的日誌是「m2」。「--」之下的幾行表示了分支演化的歷史,其中 dev表示發生在dev分支上的最後一次提交,dev^表示發生在dev分支上的倒數第二次提交。 dev~2表示發生在dev分支的倒數第三次提交。
3.12.9. 查看目前分支的操作​​記錄
git whatchanged
3.12.10. 合併分支
法一:
git merge “註釋” 合併的目標分支合併的來源分支
如果合併有衝突,git會有提示。
例如:git checkout master (切換到master分支)
git merge HEAD dev~2 (合併master分支和dev~2分支)或:git merge master dev~2
法二:
git pull 合併的目標分支合併的來源分支
例如: git checkout master (切換到master分支)
git pull . dev~2(合併當前分支和dev~2分支)
3.13. Git rebase
一般在將伺服器最新內容合併到本地時使用,例如:在版本C時從伺服器上取得內容到本地,修改了本地內容,此時想把本地修改的內容提交到伺服器上;但發現伺服器上的版本已經變成G了,此時就需要先執行Git rebase,將伺服器上的最新版本合併到本機。例如:
用下面兩張圖解釋會比較清楚一些,rebase指令執行後,其實是將分支點從C移到了G,這樣分支也就具有了從C到G的功能。
詳細介紹的git使用[6]
3.14. Git reset
庫的逆轉與恢復除了用來進行一些廢棄的研發程式碼的重置外,還有一個重要的作用。例如我們從遠端clone了一個程式碼庫,在本地開發後,準備提交回遠端。但是本地程式碼庫在開發時,有功能性的commit,也有備份目的的commit等等。總之,commit的日誌中有大量無用log,我們並不想把這些 log在提交回遠端時也提交到庫中。因此,就要用到git reset。
git reset的概念比較複雜。它的指令形式:git reset [--mixed | --soft | --hard] []
指令的選項:
--mixed 這個是預設的選項。如git reset [--mixed] dev^(dev^的定義可以參考2.6.5)。它的作用僅是重置分支狀態到dev1^, 但是卻不改變任何工作文件的內容。即,從dev1^到dev1的所有檔案變化都保留了,但是dev1^到dev1之間的所有commit日誌都被清除了, 而且,發生變化的檔案內容也沒有通過git add標識,如果您要重新commit ,還需要對變化的檔案做一次git add。這樣,commit後,就得到了非常乾淨的提交記錄。(回退了index和倉庫中的內容)
--soft相當於做了git reset –mixed,後,又對變化的檔案做了git add。如果用了該選項,就可以直接commit了。 (回退了倉庫中的內容)
--hard這個指令就會導致所有資訊的回退, 包含檔案內容。一般只有在重置廢棄代碼時,才用它。執行後,文件內容也無法恢復回來了。 (回退了工作目錄、index和倉庫中的內容)
例如:
切換到使用的分支上;
git reset HEAD^ 回退第一個記錄
git reset HEAD~2回退第二個記錄
如果想把工作目錄下的文件也回退,則使用git reset - - hard HEAD^ 回退第一個記錄
git reset - - hard HEAD~2 回退第二筆記錄
也可以使用以下方法:
將目前的工作目錄完全回滾到指定的版本號,假設如下圖,我們有A-G五次提交的版本,其中C的版本號是bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那麼結果就只剩下了A-C三個提交的版本
詳細介紹的git使用[5]
3.15. Git revert
還原某次對版本的修改,例如:## 3.15. Git revert
還原某次對版本的修改,例如:## commit_git revert (其中commit_id為commit程式碼時產生的一個唯一表示的字串)
例如:(3.6)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執行此操作,則還原上一次上一次的操作) ##it # 利用這個指令可以新增、更改Git的各種設置,例如「git config branch.master.remote origin」 就將master的遠端版本庫設定為別名叫做origin版本庫。
3.17. Git show
顯示物件的不同類型。
3.18. Git tag
建立、列出、刪除或驗證一個標籤物件(使用GPG簽署的)。
可以將某個特定的版本打上一個標籤,這樣就不需要記憶複雜的版本號哈希值字串了,例如你可以使用“git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 來標記這個被你還原的版本,那麼以後你想查看該版本時,就可以使用revert_version標籤名,而不是哈希值了。

4. Git伺服器操作指令(與伺服器互動)
4.1. Git clone
取出伺服器的倉庫的程式碼到本機建立的目錄(與伺服器互動)
透過git clone取得遠端git函式庫後,.git/config中的開發者資訊不會被一起clone過來。仍然需要為本機程式庫的.git/config檔案新增開發者資訊。此外,開發者還需要自行新增 . gitignore檔案。
透過git clone取得的遠端git函式庫,只包含了遠端git函式庫的目前工作分支。如果想獲取其它分支信息,需要使用“git branch –r” 來查看, 如果需要將遠程的其它分支代碼也獲取過來,可以使用命令“ git checkout -b 本地分支名遠程分支名”,其中,遠程分支名為「git branch –r」 所列出的分支名, 一般是諸如「origin/分支名」的樣子。如果本地分支名已經存在, 則不需要「-b」參數。
例如:
詳細介紹的git使用[5]
4.2. Git pull
從伺服器的倉庫取得程式碼,和本機程式碼合併。 (與伺服器交互,從伺服器上下載最新程式碼,等同於: Git fetch Git merge)
從其它的版本庫(既可以是遠端的也可以是本地的)將程式碼更新到本地,例如:“git pull origin master 」就是將origin這個版本庫的程式碼更新到本地的master主分支。
git pull可以從任一git函式庫取得某個分支的內容。用法如下:
git pull  username@ipaddr:遠端repository名稱遠端分支名 本地分支名。這條指令將從遠端git庫的遠端分支名稱取得到本地git庫的一個本地分支。其中,如果不寫本機分支名,則預設pull到本機目前分支。
要注意的是,git pull也可以用來合併分支。和git merge的作用相同。因此,如果你的本地分支已經有內容,則git pull會合併這些文件,如果有衝突會報警。
例如:
詳細介紹的git使用

詳細介紹的git使用

#

詳細介紹的git使用

詳細介紹的git使用
4.3. Git push
將本地commit的程式碼更新到遠端版本庫中,例如「git push origin」就會將本地的程式碼更新到名為orgin的遠端版本庫。
git push和git pull剛好想反,是將本地某個分支的內容提交到遠端某個分支上。用法: git pushusername@ipaddr:遠端repository名稱本機分支名 遠端分支名。這條指令將本地git庫的一個本地分支push到遠端git庫的遠端分支名中。
需要格外注意的是,git push好像不會自動合併檔案。因此,如果git push時,發生了衝突,就會被後push的文件內容強行覆蓋,而且沒有什麼提示。這在合作開發時是很危險的事。
例如:
詳細介紹的git使用
4.4. Git fetch
從伺服器的倉庫下載程式碼。 (與伺服器交互,從伺服器上下載最新程式碼)
相當於從遠端取得最新版本到本地,不會自動merge,比Git pull更安全些。
使用此方法來取得伺服器上的更新。
例如:如果使用git checkout nov/eclair_rocket (nov/eclair_rocket為伺服器上的分支名),則是取得上次使用git fetch指令時從伺服器上下載的程式碼;如果先使用git fetch ,再使用git checkout nov/eclair_rocket,則是先從伺服器上獲取最新的更新信息,然後從伺服器上下載最新的程式碼。

以上是詳細介紹的git使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除