歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Git使用詳細介紹

Git使用詳細介紹

日期:2017/2/28 14:22:21   编辑:Linux教程

情景1:多人協作之如何建立本地分支?

假若你已經clone了別人的倉庫並且需要修改,最好的辦法是建立自己的分支然後在合並,具體步驟如下:

1.建立一個自己的分支

git branch mybranch

此時可以使用git branch查看當前的分支情況,如不 出意外,則顯示一個master一個mybranchi分支,而你當前在master分支上。

2.切換到新建的分支

git checkout mybranch

此時我們就可以在myabranch隨意的修改,這並不會影響剛才的主分支master。注意:以上全部操作都不影響遠程倉庫,都是本地的備份。

3.假若我們已經在mybranch上做了很多修改。那麼我們就可以在mybranch下進行commit

git commit -m "i had do some thing in mybranch"

4.此時我們回到原來的master分支

git checkout master

5.將之前在branch上的修改合並到master

git merge mybranch

6.此時mybranch分支對我們來說已經沒用了,刪除

git branch -d mybranch

7.此時我們可以一次性將本地master的修改(merge後的)push到遠程

git push

注意:如果想新建和切換branch一次完成,可以

git checkout -b branchname

情景2:多人協作之如何建立遠程分支?

1.假如我和另一位同事一起操作一個rep(https://github.com/linuxidc/trygit.git),情景1對於我本地來說是很保險的,因為我本地新建的branch修改好了去merge本地的master而後才push到遠程,但問題是如果我push的遠程的還是有很多問題那就得在遠程的master上去修改,其實也可以在遠程上新建分支,全部push到這個新的分支上去。

git checkout -b shopping_cart

此時在本地新建並切換 到了shopping_cart分支。

2.將本地分支鏈接到遠程分支

git push origin :shopping_cart

在操作這一步之前遠程上是沒有shopping_cart這個分支的,而現在有了。

3.對當前這個分支做些操作然後push

git add 2.html

git commit -m "add 2.html in shopping_cart branch"

git push

這三行全是在shopping_cart分支上操作的,遠程上現在已經有對應的分支去被push,可以去github上看看在shopping_cart分支上確實多了一個2.html文件。

4.我覺得我的代碼應該沒問題,所以我要合並到主分支。

git checkout master

git merge shopping_cart

git push

5.現在輪到我另外一個同時操作了,他首先克隆可該rep然後查看分支

git clone https://github.com/linuxidc/trygit.git

git branch

此時只顯示了* master,為什麼呢?因為對於這個同事來說,他的本地的確只有master分支。

6.查看遠程分支

git branch -r

顯示:

origin/HEAD -> origin/master

origin/master

origin/shopping_cart

這回他看到了我在遠程上建立的shopping_cart分支。

7.他想操作shopping_cart分支

git checkout shopping_cart

此時checkout是把遠程的shopping_cart放到了本地,並且切換到了該分支。

查看本地分支狀態可以發現本地的確有了該分支:

master

* shopping_cart

此時如果git remote show origin將會看到遠程和本地同步了(都各自有兩個分支)。

8.此時該同事查看了我在master上push的代碼覺得沒問題,那麼遠程的臨時分支shopping_cart就沒用了

git push origin :shopping_cart

顯示:

To https://github.com/linuxidc/trygit.git

- [deleted] shopping_cart

這條指令想必很熟悉吧,沒錯,建立和刪除遠程分支指令相同。執行指令,沒有時就建立,就時就刪除。

9.刪除了遠程分支,對於他而言本地的shopping_cart更沒有用了,刪除吧

git branch -d shopping_cart

如果報錯試試 git branch -D shopping_cart

當然了,如果他覺得我的代碼有問題,還可以在8.的時候修改自己的shopping_cart然後繼續push到遠程的shopping_cart。

情景3:撤銷已git add的文件?

1.新建一個rep用以測試本例子,並且clone到本地

git clone https://github.com/linuxidc/trygit.git

2.進入trygit文件夾下,該文件夾下只有一個README.md文件,手動修改該文件內容後查看diff

git diff

此時由於我修改了該文件,git顯示差異如下:

diff --git a/README.md b/README.md

index 8686c6e..62a73fe 100644

--- a/README.md

+++ b/README.md

@@ -1,2 +1,2 @@

-trygit

+trygit by zxf

======

很顯然,我是將trygit改為了trygit by zxf

3.此時的README.md文件的狀態肯定是unstaged的,可以查看

git status

4.我們現在把該文件stage一下

git add README.md

5.現在查看修改的差異

git diff

發現沒有任何內容,為什麼呢?因為git diff是檢測unstaged文件的差異。

6.現在查看staged的差異

git diff --staged

這時就輸出了和2.一樣的結果。此時文件的狀態是changes to be committed.

7.哦,糟糕了,我想git add的文件並不是README.md,腫麼辦?

git reset HEAD README.md

此時出現如下提示:

Unstaged changes after reset:

M README.md

說明我們重置了HEAD指針後,README.md變為了unstaged.當然了,現在又可以用git diff了。

8.既然我都git add了錯誤的文件,那是不是之前的修改也要撤銷呢?

git checkout -- READM.md

此時出現:

On branch master

Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean

意思太明顯了,該文件又回到了以前的原始狀態(內容為trygit),利用checkout可以將一個已經track的file變為untrack.

ps:什麼是track呢?只要在當前git工作目錄下文件是untrack的,然後利用git add就可以將件變為staged的,而當該文件最終的修改被push後,它就會回到原來的狀態,這個原來的狀態並不是指它剛建立的時候,那個時候它是untrack,而現在它被push後是變成了track狀態了。舉個最簡單的例子,你新建的文件無論如何修改,你都看不到git diff,但當你把他git add 後,這時git 就可以track到了。

情景4:撤銷已經commit的文件?

1.修改1.html然後提交(注意默認該文件已經是track狀態)

git commit -a -m "add 1.html file"

-a可以捕捉所有已tack的文件的changes,這樣就省去了git add xxx1 xxx2 xxx3的繁瑣。

2.哦,糟糕了,我沒有把我修改的內容注釋寫在提交裡,我想補充,腫麼辦?

git reset --soft HEAD^

該指令會將commit狀態轉變為staging狀態,此時git status:

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

modified: 1.html

提示你有修改,可以commit的,那太明顯了,這就是staging狀態啊。

3.重新修改commit

git commit --amend -m "add 1.html file and modify its content"

這時git log可以看到只有後面這條commit記錄,之前的沒了。

注意,在這個情景中,其實如若只是把commit的注釋寫錯了,直接使用3.即可,而你如果不單單是修改注釋這麼簡單,還想git add其他文件作為這次commit,那麼就需要2.

其他相關指令:

撤銷上一次的commit和all changes

git reset --hard HEAD^

撤銷上二次的commit和all changes

git reset --hard HEAD^^

情景4:rebase

git checkout mybranch

git rebase master

git checkout master

git merge mybranch

git fetch

GitHub 教程系列文章

GitHub 使用教程圖文詳解 http://www.linuxidc.com/Linux/2014-09/106230.htm

Git 標簽管理詳解 http://www.linuxidc.com/Linux/2014-09/106231.htm

Git 分支管理詳解 http://www.linuxidc.com/Linux/2014-09/106232.htm

Git 遠程倉庫詳解 http://www.linuxidc.com/Linux/2014-09/106233.htm

Git 本地倉庫(Repository)詳解 http://www.linuxidc.com/Linux/2014-09/106234.htm

Git 服務器搭建與客戶端安裝 http://www.linuxidc.com/Linux/2014-05/101830.htm

Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm

分享實用的GitHub 使用教程 http://www.linuxidc.com/Linux/2014-04/100556.htm

Git 的詳細介紹:請點這裡
Git 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved