搜尋
首頁開發工具Git詳細介紹的git使用

詳細介紹的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。如有侵權,請聯絡admin@php.cn刪除
git:工具,github:服務git:工具,github:服務Apr 24, 2025 am 12:01 AM

Git和GitHub是不同的工具:Git是分佈式版本控制系統,GitHub是基於Git的在線協作平台。 Git通過工作區、暫存區和本地倉庫管理代碼,使用常見命令如gitinit、gitclone等。 GitHub提供代碼託管、PullRequest、IssueTracking等功能,基本流程包括創建倉庫、推送代碼和使用PullRequest協作。

git:版本控制的核心,github:社交編碼git:版本控制的核心,github:社交編碼Apr 23, 2025 am 12:04 AM

Git和GitHub是现代软件开发的关键工具。Git提供版本控制功能,通过仓库、分支、提交和合并管理代码。GitHub则提供代码托管和协作功能,如Issues和PullRequests。使用Git和GitHub可以显著提升开发效率和团队协作能力。

git:版本控制系統,github:託管平台git:版本控制系統,github:託管平台Apr 22, 2025 am 12:02 AM

Git是林納斯·托瓦茲在2005年開發的分佈式版本控制系統,GitHub則是2008年創立的基於Git的代碼託管平台。 Git通過快照管理文件,支持分支和合併,GitHub提供拉取請求、問題跟踪和代碼審查功能,促進團隊協作。

git和github:比較分析git和github:比較分析Apr 21, 2025 am 12:10 AM

Git和GitHub是現代軟件開發中的關鍵工具。 Git是分佈式版本控制系統,GitHub是基於Git的代碼託管平台。 Git的核心功能包括版本控制和分支管理,GitHub則提供協作和項目管理工具。使用Git時,開發者可以跟踪文件變化並協同工作;使用GitHub時,團隊可以通過PullRequests和Issues進行協作。

GitHub:代碼託管平台的簡介GitHub:代碼託管平台的簡介Apr 20, 2025 am 12:10 AM

githubiscrucialforsoftwaredevelopmentduetoitscompheasisecosystemforcodemagementagnagnagnagnagnagn和collaboration.itoffersversioncontrol,communitySupport,andtoolslikegithubictionsandpages.startbymasteringbasicslikemasteringbasicsleatbasicsleatingbasicsleatingareatingareatingarepository,and andranbranches,and andautomatimation,and automatingwo

git和github:開發人員的基本工具git和github:開發人員的基本工具Apr 19, 2025 am 12:17 AM

Git和GitHub是現代開發者的必備工具。 1.使用Git進行版本控制:創建分支進行並行開發,合併分支,回滾錯誤。 2.利用GitHub進行團隊協作:通過PullRequest進行代碼審查,解決合併衝突。 3.實用技巧和最佳實踐:定期提交,清晰的提交消息,使用.gitignore,定期備份代碼庫。

git和github:他們的關係解釋了git和github:他們的關係解釋了Apr 18, 2025 am 12:03 AM

Git和GitHub不是同一個東西:Git是一個分佈式版本控制系統,而GitHub是一個基於Git的在線平台。 Git幫助開發者管理代碼版本,通過分支、合併等功能實現協作;GitHub則提供代碼託管、審查、問題管理和社交互動功能,增強了Git的協作能力。

Git下載後需要設置什麼嗎Git下載後需要設置什麼嗎Apr 17, 2025 pm 04:57 PM

安裝 Git 後,為了更有效地使用,需要進行以下設置:設置用戶信息(姓名和郵箱)選擇文本編輯器設置外部合併工俱生成 SSH 秘鑰設置忽略文件模式

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)